Nella mia organizzazione abbiamo una serie di AMI di base di semplice utilizzo per diversi servizi come ECS e Docker. Poiché molti dei nostri progetti prevedono CloudFormation, stiamo utilizzando cfn-bootstrap
, che consiste in un paio di script e un servizio che viene eseguito all'avvio per installare determinati pacchetti e svolgere determinate attività di gestione della configurazione per noi.
All'avvio di un sistema, è necessario eseguire un equivalente del seguente script:
#!/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
Stavo pensando di eseguire questo come un oneshot
servizio systemd che funziona After=network.target
e WantedBy=multi-user.target
.
L'unico problema è che vorrei che il mio AMI fosse flessibile ed eseguirlo solo se esiste un determinato file. Invece di incorporare lo script sopra nei dati utente EC2, posso avere i dati utente solo per definire un file di ambiente che definisce le variabili di cui ho bisogno ed eseguire il mio servizio one-shot solo se quel file di ambiente esiste:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Esiste un modo per far eseguire un servizio a systemd solo se viene soddisfatta una determinata condizione?
while
condizione, ma unif
, il che significa che se il percorso specificatoConditionPathExists
non esiste al momento dell'avvio del servizio, il resto del servizio non funzionerà. Cioè, non aspetta che esista il percorso.