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ę.