Edited at

Ansibleで自作モジュールを作成してplaybookと一緒に配布

More than 5 years have passed since last update.


モジュールの開発

モジュールの作成については公式ドキュメントのDeveloping Modules — Ansible Documentationに説明があります。


  • モジュールはスクリプトファイルとして作成します。

  • モジュールはどの言語で記述しても良いです。ただし、本家にpull requestを送って取り込んでもらうにはPythonで記述する必要があります。

  • モジュールの実行結果のステータスをJSONとして標準出力に出力するようにします。changedというbooleanのキーは必ず含めるようにします。モジュールの実行によってシステムが変更されたかどうかを設定します。

  • 上記のJSON以外にモジュールの中で標準出力や標準エラー出力に出力するのはご法度です。

あとは組み込み標準のモジュールのソースansible/library at devel · ansible/ansibleを参考にしつつ、モジュールの最後で

# include magic from lib/ansible/module_common.py

#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
main()

として読み込んでいるansible/lib/ansible/module_common.pyの中で定義されている共通関数を適宜利用しつつ、モジュールを作ります。

例としてhostnameという拙作のホスト名設定モジュールを示します。

ansible-playbooks/library/system/hostname at master · hnakamur/ansible-playbooks

RHEL/CentOS/Debian/Ubuntuのみ対応で、hostnameコマンドの実行と/etc/sysconfig/networkまたは/etc/hostnameを書き換える処理を行っています。

使う側はtaskのところで以下のように書くだけです。

hostname: name=_YOUR_HOSTNAME_TO_SET_

hostnameモジュールを使わない場合と比べると、かなりシンプルになりました。

Add custom hostname module and modify hostname task to use it. · 6aa9f1e · hnakamur/ansible-playbooks

このhostnameモジュールは本家に取り込んでもらうべくpull request中です。Add a hostname module, which sets system's hostname. by hnakamur · Pull Request #3940 · ansible/ansible


モジュールの配布

Best Practices — Ansible Documentationにある通り、playbookのlibraryフォルダに自作モジュールを置いておくと自動で読み込まれます。

もし、それ以外の場所に置きたい場合はANSIBLE_LIBRARY環境変数か--module-pathコマンドラインオプションを指定すればそれも可能です。

Developing Modules — Ansible Documentation

特別な理由がなければlibraryフォルダで良いと思います。