Ansible-Python でカスタム モジュールを作成する
Ansible モジュール
Ansible には、リモート ホストまたは Playbooks で直接実行できる多数のモジュール (「モジュール ライブラリ」と呼ばれます) が同梱されています。 これらのモジュールは、サービス、パッケージ、またはファイル (本当に何でも) などのシステム リソースを制御したり、システム コマンドの実行を処理したりできます。
独自のモジュールを作成する理由
前述のように、ansible にはさまざまなタスクを実行するための多くのモジュールがあります。
フォルダー構造
カスタム・モジュールを作成する前に、フォルダーとファイルの構造を知っておくことが重要です。 参考のために、以下の画像をチェックしてください。
root@ubuntu:~/ANSIBLEtesting# tree
.
└───playbooks
├── library
│ └─── testing.py
.YAML
.PY
└───playbooks
├───playbooks
└───player.py2687py
└── main.yaml
2 ディレクトリ、2 ファイル
Write your first python program
ansible を実用的に書くには、モジュールユーティリティを理解する必要があります。 Ansible には、独自のモジュールを開発するときに使用できるヘルパー関数を提供する、いくつかのモジュール ユーティリティが用意されています。 testing.py モジュール ユーティリティは、Ansible ライブラリにアクセスするための主要なエントリ ポイントを提供し、すべての Ansible モジュールは、少なくとも、testing.py からインポートしなければなりません。
from ansible.module_utils.basic import *
これは、カスタム モジュールを作成するためのすべての module_utils ファイルをインポートします。 Python ファイルの出力形式は JSON のみです。 そのため、python ファイルの出力を印刷する場合、JSON でなければなりません。
重要な部分には、次のように ansible.module_utils.basic から常にボイラープレート コードをインポートします。
from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()
ここでメイン クラスをインスタンス化しますが、メイン クラスに直接記述することもできます。
if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
AnsibleModuleは戻り値の処理に関する多くの共通のコードを提供して、あなたの代わりに引数を解析し、入力内容を確認することができます。 ここで yourName は python ファイルに与えられた入力です。 この入力は ansible playbook から取得されます。
Successful return is made like this:
module.exit_json(changed=True, something_else=12345)
And failures are just as simple (where msg is a required parameter to explain the error):
module.fail_json(msg="Something fatal happened")
The final python program looks like this
#!/bin/env python
from ansible.module_utils.basic import *
import os, json
import re, sysdef firstProg(text):
text1 = "Hello " + text
return text1if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
Get your playbook ready
Know we will use the custom module name same as the python file name.The moduleは、カスタム モジュールの名前と同じです。
- hosts: all
remote_user: root
gather_facts: yes vars_prompt:
- name: giveName
prompt: "Please provide your name"
private: no
failed_when: giveName is undefined tasks:
- name: Python Execution
testing: yourName={{ giveName }}
register: result
- debug: var=result
ここで vars_prompt が名前を尋ね、task の下の testing モジュールがその名前を python スクリプトに渡します。 どのような出力になるかわかりますか?
ansible-playbook main.yaml
おわりに
Ansible Documentation でカスタムモジュールの詳細を確認することができます。 カスタムモジュールでできることはまだまだたくさんあります。
この記事は www.9tocloud.com
から直接引用しています。