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 には対応していません。そのうち対応させたいと思います。
おわりに
如何でしょうか。
個人的にはシンプルな手法で使いやすいモジュールが作れたと思っています。
ぜひご利用頂き、不具合等のフィードバックを頂ければ幸いです。