LoginSignup
37
37

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-09-02

モジュールの開発

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

37
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
37