Avviare il servizio systemd in modo condizionale?


14

Nella mia organizzazione abbiamo una serie di AMI di base di semplice utilizzo per diversi servizi come ECS e Docker. Poiché molti dei nostri progetti prevedono CloudFormation, stiamo utilizzando cfn-bootstrap, che consiste in un paio di script e un servizio che viene eseguito all'avvio per installare determinati pacchetti e svolgere determinate attività di gestione della configurazione per noi.

All'avvio di un sistema, è necessario eseguire un equivalente del seguente 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

Stavo pensando di eseguire questo come un oneshotservizio systemd che funziona After=network.targete WantedBy=multi-user.target.

L'unico problema è che vorrei che il mio AMI fosse flessibile ed eseguirlo solo se esiste un determinato file. Invece di incorporare lo script sopra nei dati utente EC2, posso avere i dati utente solo per definire un file di ambiente che definisce le variabili di cui ho bisogno ed eseguire il mio servizio one-shot solo se quel file di ambiente esiste:

#cloud-init
write_files:
    - path: /etc/sysconfig/cloudformation
      # ...
      content: |
          CFN_STACK_NAME="stack-name"
          CFN_RESOURCE="resource-name"
          CFN_REGION="region"

Esiste un modo per far eseguire un servizio a systemd solo se viene soddisfatta una determinata condizione?

Risposte:


16

systemd offre una vasta gamma di condizioni che è possibile verificare . Ad esempio, è possibile utilizzare ConditionPathExists=per verificare l'esistenza di un file.

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
Vale la pena notare che questa non è una whilecondizione, ma un if, il che significa che se il percorso specificato ConditionPathExistsnon esiste al momento dell'avvio del servizio, il resto del servizio non funzionerà. Cioè, non aspetta che esista il percorso.
Mahn,

@Mahn utilizzando un timer systemd, dovrebbe essere possibile attivare ripetutamente il servizio su un intervallo per superare tale limitazione.
Naftuli Kay,

@Mahn Dai un'occhiata a freedesktop.org/software/systemd/man/systemd.path.html# . Può monitorare un percorso e fornire l'attivazione basata, ad esempio, su quando un percorso viene creato.
benf

2

Mi sono imbattuto in questa domanda alla ricerca di modi per avviare un servizio systemd utilizzando una condizione. Ci sono molti modi:

ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=

Volevo iniziare il servizio in base a un nome host specifico.

ConditionHost= può essere utilizzato per la corrispondenza con il nome host o l'ID macchina dell'host. Questo richiede una stringa del nome host (facoltativamente con globs stile shell) che viene testata rispetto al nome host impostato localmente come restituito da gethostname (2) o un ID macchina formattato come stringa (vedere id-macchina (5)). Il test può essere annullato anteponendo un punto esclamativo.

Maggiori informazioni qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.