条件付きでsystemdサービスを開始しますか?


14

私の組織では、ECSやDockerなどのさまざまなサービス用の使いやすい基本AMIを多数用意しています。私たちのプロジェクトの多くはCloudFormationを使用しcfn-bootstrapているため、ブート時に実行されて特定のパッケージをインストールし、特定の構成管理タスクを実行する2つのスクリプトとサービスで構成されるを使用しています。

システムの起動時に、次のスクリプトと同等のスクリプトを実行する必要があります。

#!/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.targetWantedBy=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 2016

@Mahnはsystemdタイマーを使用して、一定の間隔でサービスを繰り返しトリガーして、その制限を克服できるようにする必要があります。
Naftuli Kay 2017

@Mahn freedesktop.org/software/systemd/man/systemd.path.html#をご覧ください。これは、パスを監視し、たとえばパスが存在する時期に基づいてアクティブ化を提供できます。
benf

2

条件を使用してsystemdサービスを開始する方法を探しているときに、私はこの質問に遭遇しました。多くの方法があります:

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

特定のホスト名でサービスを開始したい。

ConditionHost=は、ホストのホスト名またはマシンIDと照合するために使用できます。これは、gethostname(2)によって返されるローカルに設定されたホスト名に対してテストされるホスト名文字列(オプションでシェルスタイルグロブを使用)、または文字列としてフォーマットされたマシンID(machine-id(5)を参照)のいずれかを取ります。感嘆符を前に付けることにより、テストを無効にすることができます。

詳細はこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.