はじめに
構成管理ツールのAnsibleで対象にファイルを転送する際、通常はCopyモジュールを使用すると思います。
けれど、シェルの設定ファイル(.bashrcや./config/fish/config.fish)のように、様々なタイミングで追加編集が必要になるファイルはblockinfileでコピーしたほうが便利なケースが多いので簡単な使い方を紹介します。
copyの代わりにblockinfileを使用する
blockinfileを使用して、with_fileで指定したファイルの内容を対象ファイルに追記します。
参考
blockinfile - Ansible Documentation
- name: test blockinfile
blockinfile:
path: ~/test.txt # 展開対象のファイルパス
create: yes # ファイルが存在しない場合は作成(格納フォルダが存在しない場合はフォルダも作成)
insertbefore: BOF # ファイルの先頭に追加(BOFを文字列にすると、その文字列の直前に追加されます)
# insertafter: EOF # ファイルの末尾に追加(EOFを文字列にすると、その文字列の直下に追加されます)
marker: "# {mark} ANSIBLE Fish-shell basic setup." # 追加部分を示すマーカー
block: "{{item}}" # 展開する内容(ここではwith_fileで読み込んだファイル内容)
with_file:
- files/test.txt
blockinlineでマーカー付きの差し込みを行っておけば、ロールを再実行して内容を更新しても、ほかのロールから書き込んだ内容は保持されます。
copyを使った場合
ファイルを転送する際、普通は次のようにcopyモジュールを使って展開すると思います。
- name: test copy
copy:
src: files/test.txt
dest: ~/test.txt
この場合、対象マシンに「~/test.txt」が存在していた場合は上書きされてしまいます。
前出のようにblockinfileで展開していれば、もし対象ファイルが存在していた場合でも冪等性を維持しながら、markerで指定した変更部分のみが更新されるようになります。