Запустити системну послугу умовно?


14

У моїй організації у нас є ряд простих у використанні базових 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 запустив службу, лише якщо задана умова виконана?

Відповіді:


16

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

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

3
Варто зазначити, що це не whileумова, а це ifозначає, що якщо шлях, вказаний у ConditionPathExists, не існує до моменту запуску служби, решта служби просто не запуститься. Тобто це не чекає існування шляху.
Ман

@Mahn, використовуючи системний таймер, має бути можливість багаторазово запускати службу на інтервалі, щоб подолати це обмеження.
Нафтулі Кей

@Mahn Погляньте на freedesktop.org/software/systemd/man/systemd.path.html# . Він може відстежувати шлях і забезпечувати активацію, базуючись, наприклад, коли шлях з'являється.
Бенф

2

Я натрапив на це питання, шукаючи способи запустити системну службу за допомогою умови. Є багато способів:

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

Я хотів запустити послугу на основі конкретного імені хоста.

ConditionHost= може використовуватися для узгодження імені хоста або ідентифікатора машини хоста. Для цього використовується рядок імені хоста (необов'язково з глобусами стилю оболонки), який тестується на локально встановленому імені хоста, поверненому gethostname (2), або на ідентифікаторі машини, форматованому як рядок (див. Ідентифікатор machine (5)). Тест може бути заперечений, попередньо окликуючи знак оклику.

Більше про це тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.