有条件启动 systemd 服务?

有条件启动 systemd 服务?

在我的组织中,我们为不同的服务(例如 ECS 和 Docker)提供了许多易于使用的基本 AMI。由于我们的许多项目都涉及 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.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 仅在满足给定条件时运行服务?

答案1

systemd 提供了一个你可以测试各种各样的条件。例如,您可以使用ConditionPathExists=来测试文件是否存在。

[Unit]
ConditionPathExists=/etc/sysconfig/cloudformation

答案2

我在寻找使用条件启动 systemd 服务的方法时偶然发现了这个问题。有很多方法:

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

我想根据特定的主机名启动服务。

ConditionHost= 可用于匹配主机的主机名或计算机 ID。这要么采用主机名字符串(可选地使用 shell 样式的 glob),该字符串将根据 gethostname(2) 返回的本地设置的主机名进行测试,要么采用格式化为字符串的计算机 ID(请参阅 machine-id(5))。可以通过在前面添加感叹号来否定测试。

更多关于此这里

相关内容