前提・実現したいこと
Ansibleで多階層になっているリスト・辞書をあつかっています。
後述の"list1"から、"Key2"内"KeyB"の値に文字列abcが入っていない場合
(あるいは"Key2"の値が[]で空のとき)、
その要素の"Key1"の値を抜き出して、別のリスト(list2)に追加したいです。
"list1"の内容は後述しますが、この場合でしたらlist2に"Value1-2"だけ入ってきてほしいです。
発生している問題・エラーメッセージ
このような場合に、"Key2"の値に文字列abcが入っていないかどうか
どのように確認すればよいかが分からず困っております。
"Key2"の値がリストでなく単一の値であれば、後述のように
"if 'abc' not in list1[i].Key2"
で調べられるとは思うのですが…。
このまま実行すると以下のようにlist2に"Value1-1","Value1-2"どちらも入ってきてしまいます。
TASK [debug] ******************************************************************* ok: [127.0.0.1] => { "msg": [ "Value1-1", "Value1-2" ] }
該当のソースコード
yml
1# test 2--- 3- name: list test 4 hosts: localhost 5 gather_facts: no 6 vars: 7 list1: [ 8 { 9 "Key1": "Value1-1", 10 "Key2": [ 11 { 12 "KeyA": "ValueA-1", 13 "KeyB": "abc" 14 }, 15 { 16 "KeyA": "ValueA-2", 17 "KeyB": "defg" 18 } 19 ], 20 "Key3": "Value3-1", 21 }, 22 { 23 "Key1": "Value1-2", 24 "Key2": [], 25 "Key3": "Value3-2", 26 } 27 ] 28 tasks: 29 - name: create list2 30 set_fact: 31 list2: >- 32 {%- set tmplist = [] -%} 33 {%- for i in range(list1|length) -%} 34 {%- if 'abc' not in list1[i].Key2 -%} 35 {%- set _ = tmplist.append(list1[i].Key1) -%} 36 {%- endif -%} 37 {%- endfor -%} 38 {{ tmplist }} 39 - name: 'debug' 40 debug: 41 msg: '{{ list2 }}'
補足情報(FW/ツールのバージョンなど)
$ ansible --version ansible 2.9.7 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Apr 2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] $ cat /etc/system-release CentOS Linux release 7.8.2003 (Core)
2020/06/07 追記
ご回答頂いた内容より試してみたPlaybookは以下です。
yaml
1- name: Append List 2 hosts: localhost 3 connection: local 4 gather_facts: False 5 vars: 6 list1: [ 7 { 8 "Key1": "Value1-1", 9 "Key2": [ 10 { 11 "KeyA": "ValueA-1", 12 "KeyB": "abc" 13 }, 14 { 15 "KeyA": "ValueA-2", 16 "KeyB": "defg" 17 } 18 ], 19 "Key3": "Value3-1", 20 }, 21 { 22 "Key1": "Value1-2", 23 "Key2": [], 24 "Key3": "Value3-2", 25 }, 26 { 27 "Key1": "Value1-3", 28 "Key2": [ 29 { 30 "KeyA": "ValueA-2", 31 "KeyB": "defg" 32 } 33 ], 34 "Key3": "Value3-3", 35 } 36 ] 37 tasks: 38 - name: create list2 39 set_fact: 40 list2: >- 41 {%- set tmplist = [] -%} 42 {%- for item in list1 -%} 43 {#- Key2が空の場合はそのままリストに追加 -#} 44 {%- if (item.Key2 | length) <= 0 -%} 45 {%- set dummy = tmplist.append(item.Key1) -%} 46 {%- elif (item.Key2 | json_query('[?KeyB==`abc`]') | length > 0) == False -%} 47 {#- Key2が空ではない場合はabcの文字列がなければリストに追加する -#} 48 {%- set dummy = tmplist.append(item.Key1) -%} 49 {%- endif -%} 50 {%- endfor -%} 51 {{ tmplist }} 52 53 - name: 'debug' 54 debug: 55 msg: '{{ list2 }}'
yaml
1# 切り分けのためifの分岐を減らす 2- name: Append List 3 hosts: localhost 4 connection: local 5 gather_facts: False 6 vars: 7 list1: [ 8 { 9 "Key1": "Value1-1", 10 "Key2": [ 11 { 12 "KeyA": "ValueA-1", 13 "KeyB": "abc" 14 }, 15 { 16 "KeyA": "ValueA-2", 17 "KeyB": "defg" 18 } 19 ], 20 "Key3": "Value3-1", 21 }, 22 { 23 "Key1": "Value1-2", 24 "Key2": [], 25 "Key3": "Value3-2", 26 }, 27 { 28 "Key1": "Value1-3", 29 "Key2": [ 30 { 31 "KeyA": "ValueA-2", 32 "KeyB": "defg" 33 } 34 ], 35 "Key3": "Value3-3", 36 } 37 ] 38 tasks: 39 - name: create list2 40 set_fact: 41 list2: >- 42 {%- set tmplist = [] -%} 43 {%- for item in list1 -%} 44 {%- if (item.Key2 | json_query('[?KeyB==`abc`]') | length > 0) == False -%} 45 {#- Key2が空ではない場合はabcの文字列がなければリストに追加する -#} 46 {%- set dummy = tmplist.append(item.Key1) -%} 47 {%- endif -%} 48 {%- endfor -%} 49 {{ tmplist }} 50 51 - name: 'debug' 52 debug: 53 msg: '{{ list2 }}'
TASK [debug] ******************************************************************************************** ok: [localhost] => { "msg": [ "Value1-1" ] }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/07 08:39 編集
2020/06/07 12:18
退会済みユーザー
2020/06/08 04:28
2020/06/08 05:46
2020/06/08 05:51 編集
退会済みユーザー
2020/06/08 09:09
2020/06/08 12:47
退会済みユーザー
2020/06/10 07:44
2020/06/10 08:16
退会済みユーザー
2020/06/10 08:41
2020/06/10 09:10