Ansible: filtrer une liste de ses attributs
J'ai variable nommée "réseau", enregistré 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"
}
]
}
}
Est-il possible d'obtenir l'adresse IP ("adr") avec type="flottant" de faire quelque chose comme ça?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
Je sais que la syntaxe est mauvaise, mais vous obtenez l'idée.
Vous devez vous connecter pour publier un commentaire.
J'ai envoyé un pull request (disponible en Ansible 2.2+) qui permettra de faire ce genre de situations plus facile en ajoutant jmespath prise en charge des requêtes sur Ansible. Dans votre cas, il pourrait fonctionner comme:
serait de retour:
Pour filtrer une liste des dicts vous pouvez utiliser le selectattr filtre avec le equalto test:
Ci-dessus nécessite Jinja2 v2.8 ou plus (quel que soit Ansible version).
Ansible aussi a l'tests
match
etrecherche
, qui prennent des expressions régulières:De réduire la liste des dicts à une liste de chaînes, de sorte que vous obtenez seulement une liste des
addr
champs, vous pouvez utiliser le carte filtre:Ou si vous voulez une chaîne séparée par des virgules:
Combiné, il devrait ressembler à ceci.
{{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | list }}
Pas nécessairement mieux, mais comme c'est agréable d'avoir des options voici comment le faire en utilisant Jinja états:
Ou si vous préférez le mettre sur une seule ligne:
Qui retourne: