我正在嘗試使用 jmesquery 在 Ansible 中的給定 JSON 中獲取滿足特定條件的介面名稱。
問題是串列中的專案是命名的,它不是一個包含其中每個專案的所有值的串列,并且無法弄清楚如何過濾它。
與VLAN是一個條件== “1”這JSON應該給作為輸出像[ '介面GigabitEthernet0 / 0', '介面GigabitEthernet0 / 1']
使用 dict2items (如@mdaniel 建議的那樣)后,我設法應用帶有條件的過濾器,但我正在努力檢索現在在key 中的介面名稱:
- name: PRINT
debug:
msg: "{{ jsondata.interfaces | dict2items | json_query( query ) }}"
vars:
query: >-
[][value][?vlan=='1']
JSON
interfaces: {
"GigabitEthernet0/0": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
},
"GigabitEthernet0/1": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
應用 jsondata.interfaces 后的 JSON | dict2items
[
{
"key": GigabitEthernet0/0",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
},
{
"key": GigabitEthernet0/1",
"value": {
"duplex_code": "auto",
"port_speed": "a-100",
"status": "connected",
"type": "10/100/1000BaseTX",
"vlan": "1"
}
}
]
先感謝您!
uj5u.com熱心網友回復:
幾個解決方案:
- name: set_fact
set_fact:
result: "{{ result | d([]) [item.key] }}"
loop: "{{ lookup('dict', jsondata.interfaces) }}"
when: "'1' == item.value.vlan"
或使用 jinja2 回圈:
- name: build
set_fact:
result: "{{ _request.strip(',').split(',') }}"
vars:
_query: "1"
_request: >-
{%- for k in jsondata.interfaces -%}
{%- if jsondata.interfaces[k].vlan == _query -%}
{{ k }},
{%- endif -%}
{%- endfor -%}
結果:
ok: [localhost] =>
result:
- GigabitEthernet0/0
- GigabitEthernet0/1
uj5u.com熱心網友回復:
例如,下面的任務列出了vlan=='1'的鍵
- debug:
msg: "{{ interfaces|dict2items|
selectattr('value.vlan', 'eq', '1')|
map(attribute='key')|list }}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/347896.html
