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

/

導入

Ansibleは実行するタスクの種類を細かく設定出来るので、OSやディストリビューションに合ったプロパティを使えば標準のリポジトリに存在するようなパッケージであれば名前を指定するだけでまとめてサーバーにインストールする事が出来ます。
しかし多くのパッケージではインストール後に設定を施す必要があるため、Ansibleでサーバーのセットアップを完了させるにはインストールとは別に設定ファイルを編集するタスクを用意してやる必要があります。

Ansibleでサーバーのファイルを編集する方法はいくつか用意されているので、例えばtemplateファイルをを用意してファイルごと入れ替えてしまうという方法もありますがデフォルトの設定ファイルを1,2行変更するだけで済む場合には無駄に大掛かりになってしまいますので、ちょっとした編集ならファイルを1行単位で編集してくれるlineinfileオプションを使ったほうが簡単に設定をする事が出来ます。

Ansibleで行うVagrantの開発環境構築 – Koltatt

Ansible – lineinfile

Ansibleのlineinfileは指定のファイルの任意の1行毎の書き換え、もしくは削除を実行してくれます。
lineinfile – docs/Ansible

実行環境

今回はVagrantを使った仮想環境上でlineinfileのテストを行いました。

VirtualBox 5.0.24
Vagrant 1.8.1
HostOS ubuntu16.04
GuestOS CentOS7.2
ansible 2.0.1.0

準備

仮想マシン

Ansibleで編集するため空のテキストファイルを作成。

$ vi /home/vagrant/lineinfile/text.txt

Playbook

lineinflieを実行するタスクを作成しdestに編集するファイルのパスを、lineに挿入したいテキストを指定します。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    line='Hello World!!'
- hosts: all
  become: yes
  become_user: root
  tasks:
    - include: tasks/lineinfile.yml

Provisioning

Vagrantでプロビジョニングを実行。

$ vagrant provision
$ vagrant ssh
$ vi ~/lineinfile/text.txt
Hello World!!

with_items

lineの指定にwith_itemsを利用すると複数行の書きこみをまとめて編集する事が出来ます。

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    line='{{ item.line }}'
  with_items:
    - line: "text1"
    - line: "text2"
    - line: "text3"
text1
text2
text3

Options

lineinfileにはファイルを編集するための細かなオプションが用意されています。
Options/lineinfile – docs/Ansible

state

指定した内容のテキストが対象のファイル内に存在するべきか否かを指定する。

state=present テキストファイル内に対象の行が書き込まれている状態にする。
state=absent テキストファイル内で対象の行が書き込まれていない状態にする。

regexp

正規表現にマッチした行を操作する。

state=present 最後に正規表現にマッチした行を置き換える。
state=absent 最後に正規表現にマッチした行を削除する。

Test case 1

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

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=absent
    regexp='absent line'
text line
text line
text line

line
absent line
line
$ vagrant provision
text line
text line
change line

line
line

Test case 2

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=present
    regexp='^[#|;]+text line'
    line='change line'

- lineinfile: >
    dest=/home/vagrant/lineinfile/text.txt
    state=absent
    regexp='liner$'
#text line
;text line
//text line

text liner
text line
$ vagrant provision
#text line
change line
//text line

text line

Ansbileの正規表現はPythonの正規表現に準じて実行されます。
http://docs.python.jp/2/library/re.html

続き

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