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 oneshotservizio systemd che funziona After=network.targete 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?
whilecondizione, ma unif, il che significa che se il percorso specificatoConditionPathExistsnon esiste al momento dell'avvio del servizio, il resto del servizio non funzionerà. Cioè, non aspetta che esista il percorso.