有条件地启动systemd服务?

在我的组织中,我们有许多针对不同服务(如ECS和Docker)的简单易用的基础AMI。 由于我们的许多项目涉及到CloudFormation,因此我们使用的是cfn-bootstrap ,它包含几个脚本和一个在启动时运行的服务来安装某些软件包,并为我们执行某些configurationpipe理任务。

在系统启动时,必须执行以下脚本的等效操作:

 #!/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 

我正在考虑运行这个作为系统的WantedBy=multi-user.target服务运行After=network.targetWantedBy=multi-user.target

唯一的问题是,我想我的AMI是灵活的,只有当某个文件存在时才执行。 而不是将上面的脚本embedded到EC2用户数据中,我可以让用户数据定义一个环境文件,该文件定义了我需要的variables,如果该环境文件存在,则只运行我的一次性服务:

 #cloud-init write_files: - path: /etc/sysconfig/cloudformation # ... content: | CFN_STACK_NAME="stack-name" CFN_RESOURCE="resource-name" CFN_REGION="region" 

有没有办法让系统只运行一个服务,如果一个给定的条件得到满足?

systemd提供了多种可以testing的条件 。 例如,可以使用ConditionPathExists=来testing文件的存在。

 [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 =可用于匹配主机的主机名或机器ID。 这要么是根据gethostname(2)返回的本地设置的主机名,要么是一个格式为string的机器ID(参见machine-id(5))来testing的主机名string(可选地带有shell样式的globs)。 可以通过预先感叹号来否定testing。

更多在这里 。