7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ansible】そのCopy、Blockinfileの方が良いかも?

Last updated at Posted at 2019-05-19

はじめに

構成管理ツールの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で指定した変更部分のみが更新されるようになります。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?