在我的组织中,我们有许多针对不同服务(如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.target
和WantedBy=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。
更多在这里 。