Digamos que você tenha um array de dicionários e gostaria de construir um array com alguns atributos de dicionário. Existem vários métodos para fazer isso: selectattr, map e o novo filtro de extração .
Isso funciona muito bem até que você decida usar hosts de algum grupo como uma matriz inicial de dicionários. Portanto, você precisa obter hostvars
para cada host em um grupo com um filtro. Normalmente, podemos contornar isso com algumas iterações jinja, mas isso não funciona para definir variáveis.
Dito isso, há uma solução :
def fetchlistfromdict(d, l):
result = []
for item in l:
result.append(d[item])
return result
class FilterModule(object):
def filters(self):
return {
'fetchlistfromdict': fetchlistfromdict,
}
E agora:
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Este caso parece ser muito específico e pode estar relacionado ao módulo route53
.
Então, podemos adicionar esse filtro ao ansible? Devo fazer um PR? E a nomenclatura? Eu salvei o original, mas list_from_dict
parece melhor para mim.
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
O que isso faz diferente de
{{ groups['webservers']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}
?
@amenonsen bom ponto, eu só tentei fazer isso com map(attribute=
, parece que o novo filtro de extração faz o trabalho, ansioso para brincar com ele em uma nova versão!
Este exemplo deve ser incluído na documentação. Eu pesquisei muito antes de encontrar esse problema.
Comentários muito úteis
Este exemplo deve ser incluído na documentação. Eu pesquisei muito antes de encontrar esse problema.