Ansible: 셸 명령 출력을 항목이나 변수로 변환하는 방법

Ansible: 셸 명령 출력을 항목이나 변수로 변환하는 방법

명령 결과를 추출하기 위해 내 플레이북에서 쉘 명령을 실행하고 있습니다. 의 출력

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

관련 정보