Ansible: So konvertieren Sie die Ausgabe eines Shell-Befehls in Elemente oder Variablen

Ansible: So konvertieren Sie die Ausgabe eines Shell-Befehls in Elemente oder Variablen

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 splitFilter 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(':') }}"

verwandte Informationen