Назад | Перейти на главную страницу

Запустить службу systemd условно?

В моей организации есть ряд простых в использовании базовых 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

Я думал запустить это как systemd 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 запускать службу только при выполнении заданного условия?

systemd предоставляет широкий спектр условий, которые вы можете протестировать. Например, вы можете использовать ConditionPathExists= чтобы проверить наличие файла.

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

Я наткнулся на этот вопрос в поисках способов запустить службу systemd с помощью условия. Есть много способов:

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

Я хотел запустить службу на основе определенного имени хоста.

ConditionHost= может использоваться для сопоставления с именем хоста или идентификатором компьютера хоста. Это либо принимает строку имени хоста (необязательно с глобусами в стиле оболочки), которая проверяется на соответствие локально установленному имени хоста, возвращенному функцией gethostname (2), либо идентификатор машины, отформатированный как строка (см. Machine-id (5)). Тест можно отменить, поставив перед ним восклицательный знак.

Подробнее об этом Вот.