Mam zmienną o nazwie „sieć” zarejestrowaną w 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"
}
]
}
}
Czy można uzyskać adres IP („addr”) z type = „floating”, robiąc coś takiego?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
Wiem, że składnia jest nieprawidłowa, ale masz pomysł.
Aby przefiltrować listę dykt, możesz użyć filtra selectattr razem z testem equalto :
Powyższe wymaga Jinja2 v2.8 lub nowszej (niezależnie od wersji Ansible).
Ansible ma
match
search
również testy i , które przyjmują wyrażenia regularne:Aby zredukować listę dykt do listy ciągów, aby uzyskać tylko listę
addr
pól, możesz użyć filtra mapy :Lub jeśli chcesz ciąg znaków oddzielonych przecinkami:
W połączeniu wyglądałoby to tak.
źródło
{{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | list }}
Niekoniecznie lepiej, ale ponieważ fajnie jest mieć opcje, oto jak to zrobić za pomocą instrukcji Jinja :
Lub jeśli wolisz umieścić to wszystko w jednej linii:
Który zwraca:
źródło