在我的组织中,我们为许多不同的服务(例如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
可运行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仅在满足给定条件的情况下运行服务?
while
条件,而是一个条件,if
表示如果ConditionPathExists
在服务启动时指定的路径不存在,则该服务的其余部分将不会运行。即,它不等待路径存在。