ときどき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


以上、お疲れ様でした。