質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1617閲覧

Ansible with_listで渡した配列をモジュールの中でループに使用するには

Ki2neudon

総合スコア8

Ansible

Ansibleは、Python で書かれたサーバーの設定を管理するための 構成管理ツールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/01 10:41

前提・実現したいこと

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_afile_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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
引数受取時にtype = listを指定するだけでよかったです。

python

1 # AnsibleModuleクラス: moduleを作成 2 module = AnsibleModule( 3 argument_spec=dict( 4 message=dict(type=list) 5 ) 6 ) 7 msg = module.params['message'] 8 num = 0 9 for pkg in msg: 10 num += 1 11 # 処理終了 12 module.exit_json(msg = num)

yml

1- name: rpm install 2 rpm: 3 message: "{{ item }}" 4 with_list: 5 - [ 'file_a','file_b' ]

bash

1$ ansible-playbook -i test_grp -l test_srv -u root test.yml -vvv 2:#(省略) 3ok: [192.168.56.104] => (item=[u'file_a', u'file_b']) => { 4 "ansible_facts": { 5 "discovered_interpreter_python": "/usr/bin/python" 6 }, 7 "ansible_loop_var": "item", 8 "changed": false, 9 "invocation": { 10 "module_args": { 11 "message": [ 12 "file_a", 13 "file_b" 14 ] 15 } 16 }, 17 "item": [ 18 "file_a", 19 "file_b" 20 ], 21 "msg": 2 22}

投稿2020/06/02 01:27

Ki2neudon

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問