簡體   English   中英

可靠的; 如何將字典列表添加到嵌套字典中?

[英]Ansible; how to add list of dicts into nested dict?

我有空字典“ixes”,應該用從外部源收集到“peeringdb_response_net”的數據填充。

vars:
  ixes:
    ix_id_001:
      ix_short_name: 'ix1'
      ixlan_id: '331'
      ix_neighbors:
    ix_id_002:
      ix_short_name: 'ix2'
      ixlan_id: '222'
      ix_neighbors:


{
    "peeringdb_response_net": {
        "data": [
            {
                "aka": "BIX.BG",
                "netixlan_set": [
                    {
                        "asn": 15669,
                        "ipaddr4": "193.169.199.10",
                        "ipaddr6": "2001:7f8:58::3d35:0:2",
                        "ixlan_id": 331,
                        "operational": true,
                        "status": "ok",
                    },
                    {
                        "asn": 15669,
                        "ipaddr4": "193.169.198.10",
                        "ipaddr6": "2001:7f8:58::3d35:0:1",
                        "ixlan_id": 331,
                        "operational": true,
                        "status": "ok",
                    }
                ],
            }
        ],
    }
}

請幫助我找到獲得以下結果的方法。 僅當“status”:“ok”,“operational”:true 和“ixlan_id”等於時,才應填寫鄰居條目。 'ix_neighbor_short_name' 應該被索引。

vars:
  ixes:
    ix_id_001:
      ix_short_name: 'ix1'
      ixlan_id: '331'
      ix_neighbors:
        - { ix_neighbor_ipv4_addr: '193.169.199.10', ix_neighbor_short_name: 'rs1' }
        - { ix_neighbor_ipv4_addr: '193.169.198.10', ix_neighbor_short_name: 'rs2' }
    ix_id_002:
      ix_short_name: 'ix2'
      ixlan_id: '222'
      ix_neighbors:

不知道如何編碼

鑒於數據

  peeringdb_response_net:
    data:
      - aka: BIX.BG
        netixlan_set:
        - asn: 15669
          ipaddr4: 193.169.199.10
          ipaddr6: 2001:7f8:58::3d35:0:2
          ixlan_id: 331
          operational: true
          status: ok
        - asn: 15669
          ipaddr4: 193.169.198.10
          ipaddr6: 2001:7f8:58::3d35:0:1
          ixlan_id: 331
          operational: true
          status: ok

選擇集合

  sets: "{{ peeringdb_response_net.data|
            map(attribute='netixlan_set')|
            map('groupby', 'ixlan_id')|
            list }}"

  sets:
  - - - 331
      - - asn: 15669
          ipaddr4: 193.169.199.10
          ipaddr6: 2001:7f8:58::3d35:0:2
          ixlan_id: 331
          operational: true
          status: ok
        - asn: 15669
          ipaddr4: 193.169.198.10
          ipaddr6: 2001:7f8:58::3d35:0:1
          ixlan_id: 331
          operational: true
          status: ok

使用 Jinja 創建結構並將其從 YAML 轉換

  ixes_str: |
    {% for set in sets %}
    ix_id_{{ "%03d"|format(loop.index) }}:
      ix_short_name: 'ix{{ loop.index }}'
      ixlan_id: '{{ set.0.0 }}'
      ix_neighbors: [
    {% for neighbor in set.0.1 %}
    {% if neighbor.status == 'ok' and neighbor.operational %}
      {ix_neighbor_ipv4_addr: '{{ neighbor.ipaddr4 }}',
       ix_neighbor_short_name: 'rs{{ loop.index }}'},
    {% endif %}
    {% endfor %}
      ]
    {% endfor %}
  ixes: "{{ ixes_str|from_yaml }}"

  ixes:
    ix_id_001:
      ix_neighbors:
      - ix_neighbor_ipv4_addr: 193.169.199.10
        ix_neighbor_short_name: rs1
      - ix_neighbor_ipv4_addr: 193.169.198.10
        ix_neighbor_short_name: rs2
      ix_short_name: ix1
      ixlan_id: '331'

您可以使用默認詞典

  ixes_default:
    ix_id_001:
      ix_short_name: 'ix1'
      ixlan_id: '331'
      ix_neighbors:
    ix_id_002:
      ix_short_name: 'ix2'
      ixlan_id: '222'
      ix_neighbors:

並結合字典

  ixes: "{{ ixes_default|combine(ixes_str|from_yaml) }}"

  ixes:
    ix_id_001:
      ix_neighbors:
      - ix_neighbor_ipv4_addr: 193.169.199.10
        ix_neighbor_short_name: rs1
      - ix_neighbor_ipv4_addr: 193.169.198.10
        ix_neighbor_short_name: rs2
      ix_short_name: ix1
      ixlan_id: '331'
    ix_id_002:
      ix_neighbors: null
      ix_short_name: ix2
      ixlan_id: '222'

用於測試的完整劇本示例

- hosts: localhost vars: peeringdb_response_net: data: - aka: BIX.BG netixlan_set: - asn: 15669 ipaddr4: 193.169.199.10 ipaddr6: 2001:7f8:58::3d35:0:2 ixlan_id: 331 operational: true status: ok - asn: 15669 ipaddr4: 193.169.198.10 ipaddr6: 2001:7f8:58::3d35:0:1 ixlan_id: 331 operational: true status: ok sets: "{{ peeringdb_response_net.data| map(attribute='netixlan_set')| map('groupby', 'ixlan_id')| list }}" ixes_str: | {% for set in sets %} ix_id_{{ "%03d"|format(loop.index) }}: ix_short_name: 'ix{{ loop.index }}' ixlan_id: '{{ set.0.0 }}' ix_neighbors: [ {% for neighbor in set.0.1 %} {% if neighbor.status == 'ok' and neighbor.operational %} {ix_neighbor_ipv4_addr: '{{ neighbor.ipaddr4 }}', ix_neighbor_short_name: 'rs{{ loop.index }}'}, {% endif %} {% endfor %} ] {% endfor %} ixes1: "{{ ixes_str|from_yaml }}" ixes2: "{{ ixes_default|combine(ixes_str|from_yaml) }}" ixes_default: ix_id_001: ix_short_name: 'ix1' ixlan_id: '331' ix_neighbors: ix_id_002: ix_short_name: 'ix2' ixlan_id: '222' ix_neighbors: tasks: - debug: var: peeringdb_response_net - debug: var: sets - debug: var: ixes_str - debug: var: ixes1 - debug: var: ixes2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM