Допустим, у вас есть массив словарей, и вы хотите создать массив с некоторыми атрибутами словаря. Для этого есть несколько способов: selectattr, map и новый фильтр извлечения .
Это прекрасно работает, пока вы не решите использовать хосты какой-то группы в качестве начального массива словарей. Таким образом, вы должны получить hostvars
для каждого хоста в группе с фильтром. Обычно мы можем обойти это с помощью некоторых итераций jinja, но это не работает для установки переменных.
Тем не менее, есть решение :
def fetchlistfromdict(d, l):
result = []
for item in l:
result.append(d[item])
return result
class FilterModule(object):
def filters(self):
return {
'fetchlistfromdict': fetchlistfromdict,
}
И сейчас:
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Этот случай кажется очень специфичным и может быть связан с модулем route53
.
Так можем ли мы добавить этот фильтр в ansible? Мне сделать пиар? А что с неймингом? Я сохранил оригинал, но list_from_dict
выглядит лучше для меня.
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Чем это отличается от
{{ groups['webservers']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}
?
@amenonsen хорошее замечание, я пытался получить это только с помощью map(attribute=
, похоже, что новый фильтр извлечения делает свою работу, с нетерпением жду возможности поиграть с ним в новой версии!
Этот пример должен быть включен в документацию. Я ищу довольно долго, прежде чем я нашел эту проблему.
Самый полезный комментарий
Этот пример должен быть включен в документацию. Я ищу довольно долго, прежде чем я нашел эту проблему.