Ansible 自作モジュール作成 ~その2:ただコマンドを実行したい人生~


前回の記事:Ansible 自作モジュール作成 ~その1:引数受け取りたい人生~

振り返り

  • モジュールの雛形作った
  • 複数の引数受け取れた

ただコマンドを実行してみる

相変わらずの教科書 Ansibleのモジュール開発(Python実装編) 様を参考に、まずはrun_commandを試してみる。

makefifo.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

# メイン処理
#-----------------------------------------------------------
def main():
    # AnsibleModuleクラス: moduleを作成
    module = AnsibleModule(

        # 引数受け取り
        argument_spec=dict(

            # 引数: path(str型, 必須)
            path=dict(type='str', required=True),
            # 引数: owner(str型, 必須)
            owner=dict(type='str', required=True),
            # 引数: group(str型, 必須)
            group=dict(type='str', required=True),
            # 引数: mode(str型, 必須)
            mode=dict(type='str', required=True),
        ),
        # 引数チェックを有効
        supports_check_mode=True
    )

    # 何も考えずに実行するんだぜ
    rc, stdout, stderr = module.run_command("/bin/touch /tmp/udon.txt")

    # コマンド結果を返却
    module.exit_json(
        changed=True,
        rc=rc,
        stdout=stdout,
        stderr=stderr
    )

if __name__ == '__main__':
    main()

実行~

$ ansible -i test_grp 192.168.56.104 -m makefifo -M library -u root -a "path=/tmp/hoge owner=root group=root mode=0644"
192.168.56.104 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "rc": 0,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "",
    "stdout_lines": []
}

$ ssh [email protected] "ls -l /tmp"
合計 0
-rw-r--r--. 1 root root 0  5月 29 10:45 2020 udon.txt
-rw-------. 1 root root 0  5月 27 06:34 2020 yum.log

よしよし。

引数を利用してコマンド実行

取り急ぎはpathを利用してmkfifoしてみよう。ownerとかはまたあとで。
ちなみにココで「makefifoじゃなくてmkfifoやん・・・」と気づいて名前変えた。

mkfifo.py
    # pathを利用したい
    rc, stdout, stderr = module.run_command("/usr/bin/mkfifo ")

えーと、、ここに…どうすんだ?じつはPython使うの初めてなので変数の結合とかわからないんだよな。
そしたらping.pyを調べる時に参考にしていた [python初心者向け]関数の引数のアスタリスク(*)の意味様 に書いてあるぞ!

def loop2(before, *args, after):
    print(before)
    for arg in args:
        print(arg + '!')
    print(after)

なるほど、+で文字列結合できるんやな。

mkfifo.py
    # pathを利用したい
    rc, stdout, stderr = module.run_command("/usr/bin/mkfifo " + )

・・・えーと、、この変数はなんだ?dict型というperlでいうところのHashみたいなもんだというのはわかるのだが。

あ!これもAnsibleのモジュール開発(Python実装編)さんに書いてったな!

print '{"message_key":"%s"}' % (module.params['message']) 

ということはつまりこうだな!

mkfifo.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

# メイン処理
#-----------------------------------------------------------
def main():
    # AnsibleModuleクラス: moduleを作成
    module = AnsibleModule(

        # 引数受け取り
        argument_spec=dict(

            # 引数: path(str型, 必須)
            path=dict(type='str', required=True),
            # 引数: owner(str型, 必須)
            owner=dict(type='str', required=True),
            # 引数: group(str型, 必須)
            group=dict(type='str', required=True),
            # 引数: mode(str型, 必須)
            mode=dict(type='str', required=True),
        ),
        # 引数チェックを有効
        supports_check_mode=True
    )

    # pathを利用したい
    rc, stdout, stderr = module.run_command("/usr/bin/mkfifo " + module.params['path'])

    # コマンド結果を返却
    module.exit_json(
        changed=True,
        rc=rc,
        stdout=stdout,
        stderr=stderr
    )

if __name__ == '__main__':
    main()

さぁときは満ちた!実行!!

$ ansible -i test_grp 192.168.56.104 -m mkfifo -M library -u root -a "path=/tmp/udon_pipe owner=root group=root mode=0644"
192.168.56.104 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "rc": 0,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "",
    "stdout_lines": []
}

$ ssh [email protected] "ls -l /tmp"
合計 0
-rw-r--r--. 1 root root 0  5月 29 10:45 2020 udon.txt
prw-r--r--. 1 root root 0  5月 29 10:54 2020 udon_pipe
-rw-------. 1 root root 0  5月 27 06:34 2020 yum.log

よしよし、なんか少しずつ進んでるぞぉ。
今日はココまで。