Ansible - 목록의 항목을 조건부로 변경하는 방법

Ansible - 목록의 항목을 조건부로 변경하는 방법

두 개의 목록이 있습니다.

        "combo_all": [
        [
            null,
            "3",
            "210
        ],
        [
            "r0004",
            "65",
            "212"
        ]

그리고

        "zone_name_list": [
        {
            "dns_zone_id": 10423,
            "name": "212.18.172.in-addr.arpa."
        },
        {
            "dns_zone_id": 10424,
            "name": ""210.18.172.in-addr.arpa."."
        }

"name"의 첫 번째 옥텟이 첫 번째 목록(210, 212)의 세 번째 항목과 일치할 때마다 "combo_all"(첫 번째 목록)의 세 번째 항목을 "dns_zone_id" 번호(두 번째 목록의)로 어떻게 바꿀 수 있습니까? ?

답변1

사전 만들기옥텟1_id

  dns_zone_id: "{{ zone_name_list|map(attribute='dns_zone_id') }}"
  octet1: "{{ zone_name_list|map(attribute='name')
                            |map('split', '.')
                            |map('first') }}"
  octet1_id: "{{ dict(octet1|zip(dns_zone_id)) }}"

준다

  octet1_id:
    '210': 10424
    '212': 10423

그런 다음 목록을 작성하십시오.

    - set_fact:
        combo_id: "{{ combo_id|d([]) + [item[:-1] + [octet1_id[item[-1]]]] }}"
      loop: "{{ combo_all }}"

준다

  combo_id:
    - [null, '3', 10424]
    - [r0004, '65', 10423]

테스트를 위한 전체 플레이북의 예

- hosts: all

  vars:

    combo_all:
      - [ null, "3", "210"]
      - [ "r0004", "65", "212"]
    zone_name_list:
      - {dns_zone_id: 10423, name: 212.18.172.in-addr.arpa.}
      - {dns_zone_id: 10424, name: 210.18.172.in-addr.arpa.}

    dns_zone_id: "{{ zone_name_list|map(attribute='dns_zone_id') }}"
    octet1: "{{ zone_name_list|map(attribute='name')
                              |map('split', '.')
                              |map('first') }}"
    octet1_id: "{{ dict(octet1|zip(dns_zone_id)) }}"

  tasks:

    - debug:
        var: dns_zone_id
    - debug:
        var: octet1
    - debug:
        var: octet1_id

    - set_fact:
        combo_id: "{{ combo_id|d([]) + [item[:-1] + [octet1_id[item[-1]]]] }}"
      loop: "{{ combo_all }}"
    - debug:
        var: combo_id|to_yaml

답변2

일반적으로 Ansible은 훌륭한 도구가 아닙니다.수정데이터 구조. 당신은새로운다음과 같이 하여 원하는 내용으로 변수를 변경하세요.

- hosts: localhost
  gather_facts: false
  vars:
    "combo_all": [
      [ null, "3", "210" ],
      [ "r0004", "65", "212" ]
      ]
    "zone_name_list": [
        {
            "dns_zone_id": 10423,
            "name": "212.18.172.in-addr.arpa."
        },
        {
            "dns_zone_id": 10424,
            "name": "210.18.172.in-addr.arpa."
        }
      ]

  tasks:
    - vars:
        new_combo_all: []
        prefix: "{{ item[1]['name'].split('.')[0] }}"
      set_fact:
        new_combo_all: >
          {{ new_combo_all + [[item[0][0], item[0][1], item[1]['dns_zone_id']]] }}
      loop: "{{ combo_all | product(zone_name_list) }}"
      when: prefix == item[0][2]

    - debug:
        var: new_combo_all

다음과 같이 설정됩니다 new_combo_all.

ok: [localhost] => {
    "new_combo_all": [
        [
            null,
            "3",
            10424
        ],
        [
            "r0004",
            "65",
            10423
        ]
    ]
}

combo_all이는 및 의 데카르트 곱을 반복하여 접두어 옥텟이 하위 목록의 세 번째 멤버와 동일한 zone_name_list쌍만 선택 하고 이를 사용하여 변수를 생성하는 방식으로 작동합니다 .namecombo_allnew_combo_all

관련 정보