У моїй організації у нас є ряд простих у використанні базових AMI для різних служб, таких як ECS та Docker. Оскільки багато наших проектів включають CloudFormation, ми використовуємо cfn-bootstrap
, що складається з пари скриптів та служби, яка працює під час завантаження для встановлення певних пакетів та виконання певних завдань управління конфігурацією для нас.
При запуску системи повинен бути виконаний еквівалент наступного сценарію:
#!/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
Я думав запустити це як системну oneshot
службу, яка працює After=network.target
і WantedBy=multi-user.target
.
Єдина проблема полягає в тому, що я хотів би, щоб мій AMI був гнучким, і виконувати це лише за наявності певного файлу. Замість того, щоб вставляти вищезазначений скрипт у дані користувача EC2, я можу мати дані про користувача просто визначити файл середовища, який визначає потрібні мені змінні, і запускати лише одну знімальну службу, якщо існує такий файл середовища:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Чи є спосіб зробити так, щоб systemd запустив службу, лише якщо задана умова виконана?
while
умова, а цеif
означає, що якщо шлях, вказаний уConditionPathExists
, не існує до моменту запуску служби, решта служби просто не запуститься. Тобто це не чекає існування шляху.