ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

AnsibleのModuleを自作してみる

お疲れ様です。伊藤です。

~前回までのあらすじ~
昨日Moduleを使って設定ファイルの書き換えを行おうと思ったところ、今のModuleでは使い勝手が悪いっ!・・ということに気づきました。ここはやはりModuleを自作するしかないか。。。(゚A゚;)ゴクリ
詳細はAnsibleでファイル編集を行いたい~そして見つかる致命的な弱点とは~ - ときどきAnsible日記をご参照ください。


というわけで本日はAnsibleのModuleを作ってみます。と、大層な風に書きましたが、実際やってみたら大したことありませんでした。まずは作るModuleの仕様を決めます。今回はこんな感じ。

 state = present
 line = 変更内容
 row = 指定行
 path = 対象ファイル
 動作:指定された行のデータを見てlineの内容と違っていたら追加
 
 state = present
 regexp = 変更対象
 line = 変更内容
 row = 指定行
 path = 対象ファイル
 動作:指定された行のデータを見てregexpの内容とあっていたらlineの情報に変更

 state = absent
 regexp = 削除内容
 row = 指定行
 path = 対象ファイル
 動作:指定された行のデータを見てregexpの内容とあっていたら削除

既存のlineinfileに行数指定を追加した、みたいな内容です。なのでほとんどlineinfileのモジュールを流用出来ます。
ModuleはPythonで書かれており、Ansibleの中にまんまソースがあるので、それを探します。ファイル名はModule名+.pyです。

# find / -name lineinfile.py
/usr/lib/python2.7/site-packages/ansible/modules/files/lineinfile.py

で、これをいつもAnsibleを実行しているフォルダに持ってきます。Ansibleは配下にlibraryというフォルダがあればその中を検索しに行くようなので、フォルダを切ります。

# cd /ansible
# mkdir library
# cp -p /usr/lib/python2.7/site-packages/ansible/modules/files/lineinfile.py /ansible/library/

であとはModuleの名前にシェル名を変えます。

# cd library
# mv lineinfile.py rowinfile.py

とりあえず今回はrowinfileとしました(ネーミングセンスは気にしないでください。。。。)

なんとこれでオリジナルModulleのrowinfileの完成です。Playbookからrowinfileが呼び出せます!


後はPythonができる人を探して、仕様通りに直してもらって。。。。というのは無理なので自力で頑張ります。

ア-シテ\(゜ロ\)(/ロ゜)/コ-シテ

で、何とかスクリプトが完成。Playbookから呼び出して動かしてみます。Playbookの内容は下記のような感じ。
f:id:pj_doaa:20170915100414p:plain


管理対象側の設定ファイルを事前に確認しておきます。
f:id:pj_doaa:20170915100447p:plain


で、実行!
f:id:pj_doaa:20170915100517p:plain
デキタ━━━━━━━━m9( ゚∀゚)━━━━━━━━!!

対象ファイルを見るとできてる!
f:id:pj_doaa:20170915100541p:plain
後はこんな感じで動作確認しながら修正を加えていきます。例えばこれ5行目を指定してますが、6行目に入ってます。おそらくPythonが0からスタートしてるからと。。。


こんな感じで非常に簡単にModuleが作れました。作る前まではなかなか敷居が高かったのですが、実際にやってみるとそうでもありませんので皆さまも是非!(これを公式に挙げるとなると相当大変ですが。。。)


注 本格的に自作Moduleを作成する場合には色々とルールがありますので下記URLをご参照ください(英語ですが。。。)
http://docs.ansible.com/ansible/developing_modules.html


以上、お疲れ様でした。

Ansibleでファイル編集を行いたい~そして見つかる致命的な弱点とは~

お疲れ様です。伊藤です。

いよいよ本格的にAnsibleを使って環境構築を自動化していきたいと思っていますが、早速壁にぶつかりました。AnsibleではModuleを使ってLinuxやらWindowsやらの設定変更を行います。これまでに記載したようなyumですとか、user、groupなんかを使って設定変更していきます。その中でも一番多い設定変更は設定ファイルの書き換えです。


が、しかしこれがAnsibleは苦手っぽいようです。例えば考えられるファイル編集で使えるModuleは下記になります。

module名 いいとこ わるいとこ
lineinfile 1行ずつ追加や変更や削除ができる。使えるオプションが一番多くて細かい指示が出せる 行を追加したり変更するときに対象行を検索するが、文字列検索しかできないので1ファイルに同じ内容の行があったら一番上の行が対象になってしまう
replace 複数行置き換えができる 新規追加ができない。あとlineinfileと同じ問題も起きる
blockinfile lineinfileの複数行版。lineinfileでは出来ないファイルの中間に複数行の塊を追加できる 複数行の塊を分けて追加できない。再度追加すると一度追加した内容を書き換える。あとlineinfileと同じ問題も起きる
copy 事前にファイルを作っておいてファイルごと置き換え。ファイルは自分で作るので自由が利く ファイルを事前に作る必要があるので面倒

その他にini_fileというiniファイル専用書き換えModuleがありますがかなり限定的なのでここでは書き控えます。
で、それぞれ一長一短があります。

まあそれぞれ使うには結構致命的な問題があります(個人的には)
そもそも設定ファイルって結構同じ文字列が散らばってたりするから文字列検索で対象探すのは難しいんですよね。。。なぜ行数指定ができないんだ。。
f:id:pj_doaa:20170914154821p:plain

で、それを解決するとなるとcommandやshellを使ってsedなどで編集したりする必要が発生してきます。う~ん。。。それはちょっと。。。Playbookでcommandを多用すると判断とか分岐がきついんですよねぇ・・・

そうなると考えられる手段は自作でModuleを作る方法しかありません!次回はついに自作でModuleを作る!に挑戦の巻です。AnsibleのModuleを自作してみる - ときどきAnsible日記


お疲れ様でした。