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

から直接引用しています。