Tengo una variable llamada "red" registrada en Ansible:
{
"addresses": {
"private_ext": [
{
"type": "fixed",
"addr": "172.16.2.100"
}
],
"private_man": [
{
"type": "fixed",
"addr": "172.16.1.100"
},
{
"type": "floating",
"addr": "10.90.80.10"
}
]
}
}
¿Es posible obtener la dirección IP ("addr") con type = "floating" haciendo algo como esto?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
Sé que la sintaxis es incorrecta, pero entiendes la idea.
Para filtrar una lista de dictados, puede usar el filtro selectattr junto con la prueba equalto :
Lo anterior requiere Jinja2 v2.8 o posterior (independientemente de la versión de Ansible).
Ansible también tiene las pruebas
match
ysearch
, que toman expresiones regulares:Para reducir la lista de dictados a una lista de cadenas, de modo que solo obtenga una lista de los
addr
campos, puede usar el filtro de mapa :O si quieres una cadena separada por comas:
Combinado, se vería así.
fuente
{{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | list }}
No necesariamente mejor, pero dado que es bueno tener opciones, aquí se explica cómo hacerlo usando declaraciones de Jinja :
O si prefiere ponerlo todo en una sola línea:
Que devuelve:
fuente