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

前回の記事：[Ansible 自作モジュール作成 ～その1:引数受け取りたい人生～](https://qiita.com/Ki2neudon/items/f6e1ee4fc8f29e12893f)

# 振り返り

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

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

相変わらずの教科書 [Ansibleのモジュール開発（Python実装編）](https://dev.classmethod.jp/articles/ansible-develop-module-python/) 様を参考に、まずは``run_command``を試してみる。

```python: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()
```

実行～

```bash
$ 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``やん・・・」と気づいて名前変えた。

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

えーと、、ここに…どうすんだ？じつは``Python``使うの初めてなので変数の結合とかわからないんだよな。
そしたら``ping.py``を調べる時に参考にしていた [[python初心者向け]関数の引数のアスタリスク(*)の意味](https://dev.classmethod.jp/articles/what-does-asterisk-mean-at-args/)様 に書いてあるぞ！

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

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

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

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

あ！これも[Ansibleのモジュール開発（Python実装編）](https://dev.classmethod.jp/articles/ansible-develop-module-python/)さんに書いてったな！

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

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

```python: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()
```

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

```bash
$ 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
```

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