O systemd fornece uma grande variedade de condições que você pode testar . Por exemplo, você pode usar ConditionPathExists=
para testar a existência de um arquivo.
[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation
Na minha organização, temos várias AMIs de base fáceis de usar para diferentes serviços, como o ECS e o Docker. Como muitos de nossos projetos envolvem o CloudFormation, estamos usando cfn-bootstrap
, que consiste em alguns scripts e um serviço que é executado na inicialização para instalar determinados pacotes e fazer 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 serviço systemd oneshot
que executa After=network.target
e WantedBy=multi-user.target
.
O único problema é que eu gostaria que minha AMI fosse flexível e só executasse isso se um determinado arquivo existir. Em vez de incorporar o script acima nos dados do usuário do EC2, posso fazer com que os dados do usuário apenas definam um arquivo de ambiente que defina as variáveis de que preciso e só execute meu serviço one-shot 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 o systemd somente executar um serviço se uma determinada condição for atendida?
O systemd fornece uma grande variedade de condições que você pode testar . Por exemplo, você pode usar ConditionPathExists=
para testar a existência de um arquivo.
[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation
Eu tropecei nessa questão procurando maneiras de iniciar um serviço do sistema usando uma condição. Existem muitas maneiras:
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 ao ID da máquina do host. Isso leva uma seqüência de nome de host (opcionalmente com globs de estilo de shell) que é testada contra o hostname configurado localmente como retornado por gethostname (2) ou uma ID de máquina formatada como string (consulte ID de máquina (5)). O teste pode ser negado ao colocar um ponto de exclamação.
Mais sobre aqui .
Tags systemd