[英]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.