Ansible: Как преобразовать вывод команды оболочки в элементы или переменные

Ansible: Как преобразовать вывод команды оболочки в элементы или переменные

Я запускаю команду shell в моем плейбуке, чтобы извлечь результаты команды. Вывод

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

Связанный контент