W mojej organizacji mamy wiele prostych w użyciu bazowych AMI dla różnych usług, takich jak ECS i Docker. Ponieważ wiele naszych projektów wiąże się z CloudFormation, korzystamy z nich cfn-bootstrap
, która składa się z kilku skryptów i usługi, która jest uruchamiana podczas rozruchu, aby zainstalować określone pakiety i wykonać dla nas określone zadania zarządzania konfiguracją.
Podczas uruchamiania systemu należy wykonać odpowiednik następującego skryptu:
#!/bin/bash
# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"
# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
cfn-signal -e $returncode -r "$output"
exit $returncode
fi
# otherwise, signal success
cfn-signal -s
Myślałem o uruchomieniu tego jako oneshot
usługi systemowej , która działa After=network.target
i WantedBy=multi-user.target
.
Jedyny problem polega na tym, że chciałbym, aby mój AMI był elastyczny i wykonywał to tylko, jeśli istnieje jakiś plik. Zamiast osadzać powyższy skrypt w danych użytkownika EC2, dane użytkownika mogą po prostu zdefiniować plik środowiska, który definiuje zmienne, których potrzebuję, i uruchomić moją jednorazową usługę tylko wtedy, gdy ten plik środowiska istnieje:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Czy istnieje sposób, aby systemd mógł uruchamiać usługę tylko wtedy, gdy spełniony jest dany warunek?
while
warunek, ale oznaczaif
, że jeśli określona ścieżkaConditionPathExists
nie istnieje do momentu uruchomienia usługi, reszta usługi po prostu nie uruchomi się. Tj. Nie czeka na ścieżkę.Natknąłem się na to pytanie, szukając sposobów na uruchomienie usługi systemowej przy użyciu warunku. Jest wiele sposobów:
ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=
Chciałem uruchomić usługę na podstawie określonej nazwy hosta.
ConditionHost
= może być użyte w celu dopasowania do nazwy hosta lub identyfikatora komputera hosta. Pobiera to ciąg nazwy hosta (opcjonalnie z globami w stylu powłoki), który jest testowany względem lokalnie ustawionej nazwy hosta zwróconej przez gethostname (2) lub identyfikatora komputera sformatowanego jako ciąg (patrz machine-id (5)). Test można negować, przygotowując wykrzyknik.Więcej na ten temat tutaj .
źródło