
私はプレイブックでシェルコマンドを実行してコマンドの結果を抽出しています。
- debug: msg="{{ dblist.stdout_lines }}"
は
ok: [host] => {
"msg": [
"inst1:db1"
"inst1:db2"
"inst1:db3"
"inst2:db4"
"inst2:db3"
]
}
この値は、item.0 の値を inst1、item.1 の値を db2 などとして次のプレイブックを実行できる形式で保存する必要があります。
現在
- debug: msg="{{ item.0 }} has a value {{ item.1 }}"
with_items: "{{ dblist.stdout_lines }}"
次のような値を与える
ok: [host] => (item=inst1:db1) => {
"msg": "i has a value n"
}
ok: [host] => (item=inst1:db2) => {
"msg": "i has a value n"
ありがとう。
答え1
例えば
- debug:
msg: "{{ _key }} has a value {{ _val }}"
loop: "{{ dblist.stdout_lines }}"
vars:
_arr: "{{ item.split(':') }}"
_key: "{{ _arr.0 }}"
_val: "{{ _arr.1 }}"
与える
msg: inst1 has a value db1
msg: inst1 has a value db2
msg: inst1 has a value db3
msg: inst2 has a value db4
msg: inst2 has a value db3
答え2
十分に新しいバージョン (ansible-core>=2.11) を使用している場合は、次のsplit
フィルターを使用できます。
- debug:
msg: "{{ item.0 }} has a value {{ item.1 }}"
loop: "{{ dblist.stdout_lines | map('split', ':') }}"
古いバージョンでも同様の結果を得ることは可能ですが、見た目は劣ります。
- debug:
msg: "{{ item.0 }} has a value {{ item.1 }}"
loop: "{{ dblist.stdout_lines }}"
loop_control:
loop_var: _item
vars:
item: "{{ _item.split(':') }}"