Na minha organização, temos várias AMIs básicas simples de usar para diferentes serviços, como ECS e Docker. Como muitos de nossos projetos envolvem o CloudFormation, estamos usando cfn-bootstrap
, que consiste em alguns scripts e um serviço executado na inicialização para instalar determinados pacotes e executar certas tarefas de gerenciamento de configuração para nós.
Na inicialização de um sistema, um equivalente do seguinte script deve ser executado:
#!/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
Eu estava pensando em executar isso como um oneshot
serviço systemd que executa After=network.target
e WantedBy=multi-user.target
.
O único problema é que eu gostaria que minha AMI fosse flexível e execute isso somente se houver um determinado arquivo. Em vez de incorporar o script acima nos dados do usuário do EC2, posso fazer com que os dados do usuário definam apenas um arquivo de ambiente que defina as variáveis de que preciso e só execute meu serviço de uma tentativa se esse arquivo de ambiente existir:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Existe uma maneira de fazer com que o systemd execute apenas um serviço se uma determinada condição for atendida?
while
condição, mas simif
, o que significa que, se o caminho especificadoConditionPathExists
não existir no momento em que o serviço iniciar, o restante do serviço simplesmente não será executado. Ou seja, ele não espera o caminho existir.