Dans mon organisation, nous avons un certain nombre d'AMI de base simples à utiliser pour différents services tels que ECS et Docker. Étant donné que bon nombre de nos projets impliquent CloudFormation, nous utilisons cfn-bootstrap
, qui se compose de quelques scripts et d'un service qui s'exécute au démarrage pour installer certains packages et effectuer certaines tâches de gestion de configuration pour nous.
Au démarrage d'un système, un équivalent du script suivant doit être exécuté:
#!/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
Je pensais à exécuter cela comme un service systemd oneshot
qui exécute After=network.target
et WantedBy=multi-user.target
.
Le seul problème est que j'aimerais que mon AMI soit flexible et ne l'exécute que si un certain fichier existe. Plutôt que d'incorporer le script ci-dessus dans les données utilisateur EC2, je peux demander aux données utilisateur de simplement définir un fichier d'environnement qui définit les variables dont j'ai besoin et d'exécuter mon service one-shot si ce fichier d'environnement existe:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Existe-t-il un moyen de faire en sorte que systemd n'exécute un service que si une condition donnée est remplie?
systemd fournit un ne grande variété de conditions que vous pouvez tester . Par exemple, vous pouvez utiliser ConditionPathExists=
pour tester l'existence d'un fichier.
[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation
Je suis tombé sur cette question en cherchant des moyens de démarrer un service systemd en utilisant une condition. Il y a plusieurs façons:
ConditionArchitecture=, ConditionVirtualization=, ConditionHost=, ConditionKernelCommandLine=, ConditionSecurity=, ConditionCapability=, ConditionACPower=, ConditionNeedsUpdate=, ConditionFirstBoot=, ConditionPathExists=, ConditionPathExistsGlob=, ConditionPathIsDirectory=, ConditionPathIsSymbolicLink=, ConditionPathIsMountPoint=, ConditionPathIsReadWrite=, ConditionDirectoryNotEmpty=, ConditionFileNotEmpty=, ConditionFileIsExecutable=
Je voulais démarrer le service sur la base d'un nom d'hôte spécifique.
ConditionHost
= peut être utilisé pour faire correspondre le nom d'hôte ou l'ID d'ordinateur de l'hôte. Cela prend soit une chaîne de nom d'hôte (éventuellement avec des globes de style Shell) qui est testée par rapport au nom d'hôte défini localement comme retourné par gethostname (2), ou un ID d'ordinateur formaté en chaîne (voir machine-id (5)). Le test peut être annulé en ajoutant un point d'exclamation.
Plus à ce sujet ici .