モジュールの開発
モジュールの作成については公式ドキュメントの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フォルダで良いと思います。