
Ich führe einen Shell-Befehl in meinem Playbook aus, um die Ergebnisse eines Befehls zu extrahieren. Die Ausgabe von
- debug: msg="{{ dblist.stdout_lines }}"
Ist
ok: [host] => {
"msg": [
"inst1:db1"
"inst1:db2"
"inst1:db3"
"inst2:db4"
"inst2:db3"
]
}
Ich muss diesen Wert in einem Format speichern, das es mir ermöglicht, mein nächstes Playbook auszuführen und dabei den Wert von item.0 als inst1 und item.1 als db2 usw. zu berücksichtigen.
Momentan
- debug: msg="{{ item.0 }} has a value {{ item.1 }}"
with_items: "{{ dblist.stdout_lines }}"
gibt Werte an wie
ok: [host] => (item=inst1:db1) => {
"msg": "i has a value n"
}
ok: [host] => (item=inst1:db2) => {
"msg": "i has a value n"
Danke.
Antwort1
Zum Beispiel
- debug:
msg: "{{ _key }} has a value {{ _val }}"
loop: "{{ dblist.stdout_lines }}"
vars:
_arr: "{{ item.split(':') }}"
_key: "{{ _arr.0 }}"
_val: "{{ _arr.1 }}"
gibt
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
Antwort2
Wenn Sie eine ausreichend neue Version haben (Ansible-Core >= 2.11), können Sie den split
Filter verwenden:
- debug:
msg: "{{ item.0 }} has a value {{ item.1 }}"
loop: "{{ dblist.stdout_lines | map('split', ':') }}"
Es ist möglich, mit älteren Versionen ein ähnliches Ergebnis zu erzielen, allerdings ist es hässlicher:
- debug:
msg: "{{ item.0 }} has a value {{ item.1 }}"
loop: "{{ dblist.stdout_lines }}"
loop_control:
loop_var: _item
vars:
item: "{{ _item.split(':') }}"