なっく日報

技術やら生活やらのメモ

Ansibleのshellモジュールでヒアドキュメントが使いたいときー

が、あると思います。

shellモジュールでヒアドキュメントを使うと・・・

github.com

コチラのissueにコメントがありましたが、

- shell: |
    cat <<EOT
    a
    b
    EOT

の結果は

 a
 b

(半角スペースがaとbの前に入る)

という。。

大半のケースでは大丈夫でしょうが、困る場合もあります。

対策

Ansibleのコアディベロッパーが推奨しているらしい方法

scriptモジュールを使う。

http://docs.ansible.com/ansible/script_module.html

ローカルにあるファイルをリモートに転送して実行してくれます。

例えば、

roles/common/file/script.sh
roles/common/task/main.yml

な構成をとっていた場合、roles/common/task/main.ymlでは

- script: script.sh

みたいに使えます。

これならAnsible特有の問題で嵌ることもないでしょう。

ワークアラウンド

発想の転換に感心してしまったのですが、sedを使って空白を取り除きますw

- shell: |
    sed 's/^ //' <<EOT | cat
    a
    b
    EOT

これで普通にヒアドキュメントをcatしたのと同じになると。

まとめ

ま、ほんとうは冪等性確保のために、shellモジュールもscriptモジュールも使うなということなのでしょうが・・・

どなたかの参考になれば幸いです。