Ansible の自作モジュールご紹介 ~行置換(複数行対応)~

はじめに

おはようございます。こんにちは。こんばんは。
今回は Ansible でこんなモジュールを作ったので見てくれ!という記事です。

Ansible はファイル編集に弱い

いきなりですが、Ansible でファイル編集を行おうと思った場合以下のようなモジュールが使えそうですが、大体欠点があります。

  • lineinfile ⇒ 複数行定義したい場合、冪等性が崩壊
  • blockinfile ⇒ マーカー行が必須
  • replace ⇒ lineinfileと同じく複数行で冪等性が崩壊

じゃあ template 使いなさいよって話です。
しかしながら、構成管理として使用するなら間違いなくその方がいいのですが、構築自動化として利用する場合、ディストリビューションやバージョンが多種多様でいちいち用意していられません。

複数行定義可能なモジュールが欲しくなってしまいます。

無いなら作ればいいじゃない

github.com 作りました。その名も「replacelines」です。そのまんまですね

使い方

公式モジュールみたくコメントで使用例とか載せたいけど一旦後回し・・・
使えるオプションは以下です。ちなみに全部必須です。

  • path : ファイルパス
  • state : 有効/無効 [ present | absent ]
  • prev : 置換前の行
  • current : 置換後の行

例えば次のような/etc/hostsファイルがあったとします。

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101    host1
192.168.1.102    host2

これを次のように書き換えたい場合

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101    host1
192.168.1.102    host2
192.168.1.103    host3

次のように playbook を書きます。
複数行対応ですので、yamlの複数行記載が使用できます。

- hosts: all
  tasks:
    - name: config hosts file
      replacelines:
        state: present
        path: /etc/hosts
        prev: 192.168.1.102    host2
        current: |
          192.168.1.102    host2
          192.168.1.103    host3

もちろん複数行に対する置換も可能です。
これを

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101    host1
192.168.1.102    host2
192.168.1.103    host3

こうしたい場合

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.1.1    host1
10.0.1.2    host2
10.0.1.3    host3

このように書きます。

- hosts: all
  tasks:
    - name: config hosts file
      replacelines:
        state: present
        path: /etc/hosts
        prev: |
          192.168.1.101    host1
          192.168.1.102    host2
          192.168.1.103    host3
        current: |
          10.0.1.1    host1
          10.0.1.2    host2
          10.0.1.3    host3

制約

以下についてご理解頂いた上でご利用下さい。

  • あまりテストしていないため、playbook 次第で想定外の挙動をする可能性があります。
    playbook 実行後、編集したファイルをご確認頂くことを推奨致します。
  • prev, current には行全体が指定されることを想定しています。
    そのため、正規表現の使用はできません。
  • check mode には対応していません。そのうち対応させたいと思います。

おわりに

如何でしょうか。
個人的にはシンプルな手法で使いやすいモジュールが作れたと思っています。
ぜひご利用頂き、不具合等のフィードバックを頂ければ幸いです。