前提・実現したいこと
Ansibleの自作モジュールをpython
で作成しています。
業務都合によりyum
の使用が封印されている状況で、rpm
を利用するモジュールを作成しています。
そこで以下のように配列で渡したパラメータを利用してモジュール内でfor
ループを行いたいと考えています。
yml
1- name: rpm install (replacefiles) 2 rpm: # 自作モジュールの名前 3 pkgs: "{{ item }}" 4 with_list: 5 - [ 'file_a','file_b' ] # ココにいくつ渡されるかは決まっていない
例えばdebug
モジュールのmsg
を使うと以下のようにリストで渡されてい(るように見え)ます。
bash
1$ ansible-playbook -i test_grp -l test_srv -u root test.yml 2ok: [192.168.56.104] => (item=[u'aaa', u'bbb', u'ccc']) => { 3 "msg": [ 4 "aaa", 5 "bbb", 6 "ccc" 7 ] 8}
そこで自作モジュールにてpkgs
をループ条件にしてfile_a
、file_b
それぞれに同じ処理を行いたいです。
試しに受け取ったリストをexit_json
に渡すだけにしてみたのですがpkgs
がリストではなく文字列として認識されているように見えます。
python
1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4from ansible.module_utils.basic import AnsibleModule 5 6# メイン処理 7#----------------------------------------------------------- 8def main(): 9 # AnsibleModuleクラス: moduleを作成 10 module = AnsibleModule({}) 11 # 引数受け取り 12 argument_spec=dict( 13 pkgs=dict(), 14 ), 15 ) 16 # 処理終了 17 module.exit_json(pkgs = module.params['pkgs']) 18 19if __name__ == '__main__': 20 main()
bash
1$ ansible-playbook -i test_grp -l test_srv -u root test.yml -vvv 2TASK [test : rpm install ] *************************************************************** 3:#(省略) 4ok: [192.168.56.104] => (item=[u'file_a', u'file_b']) => { 5 "ansible_facts": { 6 "discovered_interpreter_python": "/usr/bin/python" 7 }, 8 "ansible_loop_var": "item", 9 "changed": false, 10 "invocation": { 11 "module_args": { 12 "pkgs": "['file_a', 'file_b']" #ダブルクォートで囲まれている = 1つの文字列? 13 } 14 }, 15 "item": [ 16 "file_a", #こっちはリストっぽい 17 "file_b" 18 ], 19 "pkgs": "['file_a', 'file_b']", # 結果を見るとやっぱり1つの文字列? 20 "warnings": [ 21 "The value ['file_a', 'file_b'] (type list) in a string field was converted to u\"['file_a', 'file_b']\" (type string). If this does not look like what you expect, quote the entire value to ensure it does not change." 22 ] 23}
このまま例えば以下のようにループに使おうとしても"num" : 20
が返り、これは['file_a', 'file_b']
の文字数に一致します。
python
1 num = 0 2 for pkg in module.params['pkgs']: 3 num += 1 4 module.exit_json(num = num)
どうしたらAnsibleの自作モジュールで配列を受け取り、for
ループ処理を行うことができるでしょうか。
よろしくお願いいたします。
発生している問題・エラーメッセージ
原因のヒントはwarnings
のメッセージだとは目星をつけています。
bash
1"warnings": [ 2 "The value ['file_a', 'file_b'] (type list) in a string field was converted to u\"['file_a', 'file_b']\" (type string). If this does not look like what you expect, quote the entire value to ensure it does not change." 3 ]
例えば結果は変わりませんが、以下のように{{ item | string }}
にするとこの警告はでなくなります。
しかし私はコレがどういった意味を示すのか理解できていません。
yml
1- name: rpm install (replacefiles) 2 rpm: 3 pkgs: "{{ item | string}}" # ココ 4 with_list: 5 - [ 'file_a','file_b' ]
補足情報(FW/ツールのバージョンなど)
bash
1$ ansible --version 2ansible 2.9.7 3 config file = /etc/ansible/ansible.cfg 4 configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] 5 ansible python module location = /usr/lib/python2.7/site-packages/ansible 6 executable location = /usr/bin/ansible 7 python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] 8 9$ cat /etc/redhat-release 10CentOS Linux release 7.7.1908 (Core)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。