Eu tenho uma lista de dictos onde cada dicionário possui as mesmas chaves, apenas valores diferentes. Posso percorrer a lista e obter o atributo "ip" que desejo, mas é uma lista grande e queria saber se não existe um comando de pesquisa que funcione muito melhor. Aqui está um pequeno exemplo da lista:
"current": [
{
"fvSubnet": {
"attributes": {
"annotation": "",
"childAction": "",
"configIssues": "",
"ctrl": "",
"debugMessage": "",
"descr": "",
"dn": "uni/tn-MYBD/BD-VLAN_10/subnet-[114.66.71.17/28]",
"extMngdBy": "",
"ip": "114.66.71.17/28",
"ipDPLearning": "enabled",
"lcOwn": "local",
"modTs": "2023-07-11T08:18:19.497+00:00",
"monPolDn": "uni/tn-common/monepg-default",
"name": "",
"nameAlias": "",
"preferred": "yes",
"scope": "public",
"status": "",
"uid": "19044",
"userdom": ":all:",
"virtual": "yes"
}
}
},
{
"fvSubnet": {
"attributes": {
"annotation": "",
"childAction": "",
"configIssues": "",
"ctrl": "nd",
"debugMessage": "",
"descr": "",
"dn": "uni/tn-MYBD/BD-VLAN_20/subnet-[1008:125:0:e56::1/64]",
"extMngdBy": "",
"ip": "1008:125:0:e56::1/64",
"ipDPLearning": "enabled",
"lcOwn": "local",
"modTs": "2023-07-11T08:18:19.497+00:00",
"monPolDn": "uni/tn-common/monepg-default",
"name": "",
"nameAlias": "",
"preferred": "no",
"scope": "public",
"status": "",
"uid": "19044",
"userdom": ":all:",
"virtual": "no"
}
}
}
]
Estou interessado apenas no atributo "ip" de cada ditado. Posso fazer uma pesquisa e obter todos eles ou é necessário percorrer a lista de dictos?
Qualquer transformação de dados, que não exija a execução de um módulo nos dados, pode ser feita de forma mais eficiente como uma expressão de filtro.
Crie uma nova variável para a expressão por conveniência (mas crie um nome melhor):
O filtro de mapa integrado do Jinja pode obter apenas um atributo para você, transformando assim uma lista de dictos em apenas uma lista. Menos obviamente, a notação de ponto pode ser usada para examinar dictos de dictos. Sintaxe mais compacta do que encadear múltiplas funções de mapa.
Despejar fvSubnet_ip de fato resulta em
Se a filtragem baseada em outros atributos também for desejada, considere outro filtro integrado, selectattr . Primeiro selecione qual dos objetos e depois extraia o atributo necessário. É por isso que os filtros Jinja podem ser encadeados.
Como estas são sub-redes IP, observe que a família de filtros ipaddr existe para fazer coisas úteis.
ansible-doc -t filter ipaddr
Você pode usar
json_query
filter, que usa JMESPath para extrair valores JSON.Observe que você precisa instalar
jmespath
em seu host. Você pode usarpip
para isso:Então podemos usar o seguinte modelo:
Exemplo de manual de depuração com seus dados:
Saída: