次の「コード」行が私のcloud-init設定を中断する理由を特定するのが困難です。デフォルトでは、私はYAML形式を使用するDigitalOcean APIの一部として子オブジェクトを呼び出します。ほとんどはうまくいきましたが、いくつかのエラーを減らして次の行にまとめることができました。
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
リモートシェルに直接適用するとすべてうまく機能しますが、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
複数のコマンドをruncmdの引数として指定できるかどうかは100%確信できませんが、そうする場合は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
正しく前後に移動できないと文句を言います。
シェル(またはPython、Perlなど)によって引き起こされる他のエスケープの問題がないように、このデータをファイルからアップロードする必要があります。
1この操作は付属のユーティリティを使用して行われます。yaml
rummel.yaml私はその著者です。