В моей организации у нас есть ряд простых в использовании базовых 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
службы systemd, которая работает 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
не существует к моменту запуска службы, остальная часть службы просто не будет работать. Т.е. он не ждет пути к существованию.