前回の記事: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
よしよし、なんか少しずつ進んでるぞぉ。
今日はココまで。