yamlでsedコマンドを正しくエスケープする方法についてのヒントを探しています。

yamlでsedコマンドを正しくエスケープする方法についてのヒントを探しています。

次の「コード」行が私の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この操作は付属のユーティリティを使用して行われます。yamlrummel.yaml私はその著者です。

おすすめ記事