Czy uruchomić usługę systemową warunkowo?

14

W mojej organizacji mamy wiele prostych w użyciu bazowych AMI dla różnych usług, takich jak ECS i Docker. Ponieważ wiele naszych projektów wiąże się z CloudFormation, korzystamy z nich cfn-bootstrap, która składa się z kilku skryptów i usługi, która jest uruchamiana podczas rozruchu, aby zainstalować określone pakiety i wykonać dla nas określone zadania zarządzania konfiguracją.

Podczas uruchamiania systemu należy wykonać odpowiednik następującego skryptu:

#!/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

Myślałem o uruchomieniu tego jako oneshotusługi systemowej , która działa After=network.targeti WantedBy=multi-user.target.

Jedyny problem polega na tym, że chciałbym, aby mój AMI był elastyczny i wykonywał to tylko, jeśli istnieje jakiś plik. Zamiast osadzać powyższy skrypt w danych użytkownika EC2, dane użytkownika mogą po prostu zdefiniować plik środowiska, który definiuje zmienne, których potrzebuję, i uruchomić moją jednorazową usługę tylko wtedy, gdy ten plik środowiska istnieje:

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

Czy istnieje sposób, aby systemd mógł uruchamiać usługę tylko wtedy, gdy spełniony jest dany warunek?

Naftuli Kay
źródło

Odpowiedzi:

16

systemd zapewnia szeroki zakres warunków do przetestowania . Na przykład możesz użyć ConditionPathExists=do przetestowania istnienia pliku.

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation
Michael Hampton
źródło
3
Warto zauważyć, że nie jest to whilewarunek, ale oznacza if, że jeśli określona ścieżka ConditionPathExistsnie istnieje do momentu uruchomienia usługi, reszta usługi po prostu nie uruchomi się. Tj. Nie czeka na ścieżkę.
Mahn,
@Mahn przy użyciu systemowego timera, powinno być możliwe wielokrotne wyzwalanie usługi w określonym przedziale czasowym, aby pokonać to ograniczenie.
Naftuli Kay
@Mahn Spójrz na freedesktop.org/software/systemd/man/systemd.path.html# . Może monitorować ścieżkę i zapewniać aktywację na podstawie, na przykład, kiedy powstaje ścieżka.
benf
2

Natknąłem się na to pytanie, szukając sposobów na uruchomienie usługi systemowej przy użyciu warunku. Jest wiele sposobów:

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

Chciałem uruchomić usługę na podstawie określonej nazwy hosta.

ConditionHost= może być użyte w celu dopasowania do nazwy hosta lub identyfikatora komputera hosta. Pobiera to ciąg nazwy hosta (opcjonalnie z globami w stylu powłoki), który jest testowany względem lokalnie ustawionej nazwy hosta zwróconej przez gethostname (2) lub identyfikatora komputera sformatowanego jako ciąg (patrz machine-id (5)). Test można negować, przygotowując wykrzyknik.

Więcej na ten temat tutaj .

radtek
źródło