En mi organización tenemos una serie de AMI básicas fáciles de usar para diferentes servicios, como ECS y Docker. Dado que muchos de nuestros proyectos involucran CloudFormation, estamos usando cfn-bootstrap
, que consiste en un par de scripts y un servicio que se ejecuta en el arranque para instalar ciertos paquetes y realizar ciertas tareas de administración de configuración por nosotros.
Al iniciar un sistema, se debe ejecutar un equivalente del siguiente 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
Estaba pensando en ejecutar esto como un oneshot
servicio systemd que se ejecuta After=network.target
y WantedBy=multi-user.target
.
El único problema es que me gustaría que mi AMI sea flexible y solo ejecute esto si existe un determinado archivo. En lugar de incrustar el script anterior en los datos del usuario EC2, puedo hacer que los datos del usuario solo definan un archivo de entorno que defina las variables que necesito y solo ejecute mi servicio de una sola vez si ese archivo de entorno existe:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
¿Hay alguna manera de hacer que systemd solo ejecute un servicio si se cumple una condición determinada?
while
condición, sino unaif
, lo que significa que si la ruta especificada enConditionPathExists
no existe para el momento en que se inicia el servicio, el resto del servicio simplemente no se ejecutará. Es decir, no espera a que exista el camino.