Iniciar serviço systemd condicionalmente?


14

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 oneshotserviço systemd que executa After=network.targete 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?

Respostas:


16

O systemd fornece uma ampla 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

3
Vale a pena notar que isso não é uma whilecondição, mas sim if, o que significa que, se o caminho especificado ConditionPathExistsnã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.
Mahn

@Mahn usando um timer do sistema, deve ser possível disparar repetidamente o serviço em um intervalo para superar essa limitação.
Naftuli Kay

@Mahn Dê uma olhada em freedesktop.org/software/systemd/man/systemd.path.html# . Ele pode monitorar um caminho e fornecer ativação com base em, por exemplo, quando um caminho passa a existir.
benf 13/09/19

2

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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.