我很难找到为什么以下几行“代码”会破坏我的 cloud-init 配置的问题。基本上,我调用一个子对象作为 DigitalOcean API 的一部分,它具有 YAML 格式 - 我得到了大部分工作,但能够缩小一些错误,我将其归结为以下几行:
sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/ Options -Indexes\n AllowOverride none\n Require all denied\n/\};p' /etc/httpd/conf/httpd.conf
sed -i -e '$a\ \n#Grant localhost access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf
sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf
如果直接应用在远程 shell 中,它们都可以正常工作,但如果通过 DigitalOcean API(子对象和 YAML),它们往往会崩溃 - 我假设我不符合 YAML 格式,但看不到我错过了什么转义。
有什么提示吗?
顺便说一句:查看 cloud-init-output.log 我可以看到创建的 yam blob 写入如下:
- sed -i -e '$a#Add local clock as backup
server 127.127.1.0
fudge 127.127.1.0 stratum 10' /etc/ntp.conf
这多少让我觉得无论如何我都需要找到逃离的方法\n
。这可能是问题所在吗?我该如何逃避这个?
答案1
我不是 100% 确定您可以指定多个命令作为 runcmd 的参数,但如果您这样做,您应该将其设为 YAML 中的文字标量:
runcmd: |
sed -i -n '/<Directory \/>/\{p;:a;N;/<\/Directory>/!ba;s/.*\n/ Options -Indexes\n AllowOverride none\n Require all denied\n/\};p' /etc/httpd/conf/httpd.conf
sed -i -e '$a\ \n#Grant localhost access to query or modify\nrestrict 127.0.0.1\nrestrict ::1' /etc/ntp.conf
sed -i -e '$a\ \n#Add local clock as backup\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10' /etc/ntp.conf
要查看 YAML 解析器如何处理此内容,您可以往返 yaml 并测试它。如果以上内容在文件中input.yml
那么
yaml rt input.yml
如果无法正确往返,将会抱怨。
确保从文件上传此数据,这样就不会出现由 shell(或 python、perl 等)引起的其他转义问题
1这是使用yaml
附带的实用程序完成的鲁梅尔.yaml我是其中的作者。