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.Eu me deparei com essa pergunta procurando maneiras de iniciar um serviço systemd usando uma condição. Existem muitos caminhos:
ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=
Eu queria iniciar o serviço com base em um nome de host específico.
ConditionHost
= pode ser usado para corresponder ao nome do host ou ID da máquina do host. Isso leva uma string de nome de host (opcionalmente com globs de estilo de shell) que é testada com relação ao nome de host definido localmente, retornado por gethostname (2), ou um ID de máquina formatado como string (consulte o ID da máquina (5)). O teste pode ser negado acrescentando um ponto de exclamação.Mais sobre isso aqui .
fonte