Ansibleのlineinfileのオプションを詳しく見てみる

/

導入

前回Ansibleのlineinfileを使ったテキストファイルの編集の基本的な部分を確認したので、今回はより詳しいオプションの使い方を見ていきます。実行環境などは前回と同様です。

Ansibleのlineinfileでテキストファイルを編集する – Koltatt

Options

state & regexp

stateとregexpについては前回扱いました。

owner & group & mode

編集するファイルのowner,group,modeをそれぞれ設定する。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    owner=vagrant
    group=vagrant
    mode=660
    regexp='text line'
    line='change line'

実行前

text line
$ ls -l
-rw-r--r--. 1 root root ... text.txt
vagrant provision

実行後

change line
$ ls -l
-rw-rw----. 1 vagrant vagrant ... text.txt

insert [ before|after ]

insertbefore 正規表現でmatchした行の前、もしくはBOFでファイルの先頭にlineを書き込む。
insertafter 正規表現でmatchした行の後ろ、もしくはEOFでファイルの末尾にlineを書き込む。

・state=presentである必要がある。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    insertbefore='BOF'
    line='BOF line'

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    insertbefore='base line'
    line='before line'

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    insertafter='base line'
    line='after line'

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    insertafter='EOF'
    line='EOF line'

実行前

base line
vagrant provision

実行後

BOF line
before line
base line
after line
EOF line

create

対象に指定したファイルが存在しない場合、ファイルを作成した後に編集が実行される。
デフォルトではnoとなっているため、オプションを指定せずにファイルが存在しなかった場合にはエラーが返される。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    create=yes
    state=present
    line='create file/home/vagrant/lineinfile/text.txt'
#ゲストマシンにファイルが存在しない
$ ls /home/vagrant/
$ vagrant provision
$ vi /home/vagrant/lineinfile/text.txt
create file/home/vagrant/lineinfile/text.txt

backup

プロビジョニングの実行時に編集対象のファイルのバックアップを作成する。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    backup=yes
    state=present
    regexp='old file'
    line='new file'

実行前

old file
$ vagrant provision

実行後

$ ls /home/vagrant/lineinfile/
text.txt text.txt.yyyy-mm-dd@hh:mm:ss~
new file
old file

backrefs

regexpとlineで後方参照を行う。
backrefs=yesとなった場合モジュールの挙動が変更されinsertafterとinsertbeforeが無視され、正規表現にマッチする行が無ければ変更は実行されずマッチする行がある場合にはその中で最後の行に変更が実施されます。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    backrefs=yes
    regexp='(text line)'
    line='change \1'

backrefs=yes

text line
$ vagrant provision
change text line

backrefs=no

backrefs=no
$ vagrant provision
change \1

その他のオプション

参照:
http://docs.ansible.com/ansible/lineinfile_module.html#options

あとがき

数が多すぎて全ては扱いきれませんでしたが、特に気になっていたオプションを確認してみました。
設定ファイルの編集の場合細かいオプションの知識よりも正規表現をきちんと書けるかどうかがより重要になってくるかなとも思いますが、オプションについても押さえておくと他人のコードを見る場合などに役立つと思います。