У меня есть переменная с именем "сеть", зарегистрированная в 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"
}
]
}
}
Возможно ли получить IP-адрес ("addr") с помощью type = "Floating", сделав что-то подобное?
- debug: var={{ network.addresses.private_man | filter type="fixed" | get "addr" }}
Я знаю, что синтаксис неправильный, но идею вы поняли.
Чтобы отфильтровать список диктовок, вы можете использовать фильтр selectattr вместе с тестом equalto :
Для вышеуказанного требуется Jinja2 v2.8 или новее (независимо от версии Ansible).
В Ansible также есть тесты
match
иsearch
, которые принимают регулярные выражения:Чтобы сократить список диктовок до списка строк, чтобы вы получали только список
addr
полей, вы можете использовать фильтр карты :Или, если вам нужна строка, разделенная запятыми:
В совокупности это будет выглядеть так.
источник
{{ network.addresses.private_man | selectattr("type", "equalto", "fixed") | map(attribute='addr') | list }}
Не обязательно лучше, но, поскольку приятно иметь варианты, вот как это сделать с помощью операторов Jinja :
Или, если вы предпочитаете поместить все это в одну строку:
Что возвращает:
источник