在替换部件中使用带有命令替换文本的 sed 不起作用



我有一个带有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)" 的输出,以获得案例的简单示例。

最新更新