我有一个带有cfn-init的CFN来部署具有指定虚拟主机的ApacheWeb服务器。在模板中,我使用 AWS::CloudFormation::Init 配置集将本地 IP 替换为实例的私有 IP。
config:
packages:...
files:...
services:...
commands:
replacePrivateIP:
cwd: "/etc/httpd/conf"
command: !Sub |
sed -i 's@127.0.0.1@$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)@g' httpd.conf
sed 命令在 CFN 模板之外工作正常。但是在 CFN-init 过程中,它只是将"127.0.0.1"替换为整个 $(curl -s http://...) 字符串。
如何通过 cfn-init 将实例私有 IP 正确馈送到 httpd.conf 文件中?
替换语法$(..)
在用单引号括起来时不起作用,这在bash
或大多数其他外壳中是预期的,因为它们保留了里面存在的文字值。要进行替换,请将其放在双引号内,作为
sed -i 's@127.0.0.1@'"$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4)"'@g' httpd.conf
比较 echo '$(date)'
和 echo "$(date)"
的输出,以获得案例的简单示例。