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 oneshotusługi systemowej , która działa After=network.targeti 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?
whilewarunek, ale oznaczaif, że jeśli określona ścieżkaConditionPathExistsnie istnieje do momentu uruchomienia usługi, reszta usługi po prostu nie uruchomi się. Tj. Nie czeka na ścieżkę.