LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

前回の記事: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 root@192.168.56.104 "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 root@192.168.56.104 "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

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

0
0
1

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
0
0