Ansible: Cómo convertir la salida del comando Shell en elementos o variables

Ansible: Cómo convertir la salida del comando Shell en elementos o variables

Estoy ejecutando el comando Shell en mi libro de jugadas para extraer los resultados de un comando. La salida de

- debug: msg="{{ dblist.stdout_lines }}"

es

ok: [host] => {
    "msg": [
"inst1:db1"
"inst1:db2"
"inst1:db3"
"inst2:db4"
"inst2:db3"
  ]
}

Necesito almacenar este valor en un formato que me permita ejecutar mi próximo libro de jugadas considerando el valor de item.0 como inst1 y item.1 como db2 y así sucesivamente.

Actualmente

- debug: msg="{{ item.0 }} has  a value {{ item.1 }}"
  with_items: "{{ dblist.stdout_lines }}"

está dando valores como

ok: [host] => (item=inst1:db1) => {
    "msg": "i has  a value n"
}
ok: [host] => (item=inst1:db2) => {
    "msg": "i has  a value n"

Gracias.

Respuesta1

Por ejemplo

    - debug:
        msg: "{{ _key }} has a value {{ _val }}"
      loop: "{{ dblist.stdout_lines }}"
      vars:
        _arr: "{{ item.split(':') }}"
        _key: "{{ _arr.0 }}"
        _val: "{{ _arr.1 }}"

da

  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

Respuesta2

Si tiene una versión suficientemente nueva (ansible-core>=2.11), puede usar el splitfiltro:

    - debug:
        msg: "{{ item.0 }} has a value {{ item.1 }}"
      loop: "{{ dblist.stdout_lines | map('split', ':') }}"

Es posible lograr un resultado similar en versiones anteriores, pero es más feo:

    - debug:
        msg: "{{ item.0 }} has a value {{ item.1 }}"
      loop: "{{ dblist.stdout_lines }}"
      loop_control:
        loop_var: _item
      vars:
        item: "{{ _item.split(':') }}"

información relacionada