Digamos que tiene una matriz de diccionarios y le gustaría crear una matriz con algunos atributos de diccionario. Hay varios métodos para hacer esto: selectattr, map y el nuevo filtro de extracción .
Eso funciona muy bien hasta que decide usar hosts de algún grupo como una matriz inicial de diccionarios. Entonces, debe obtener hostvars
para cada host en un grupo con un filtro. Por lo general, podemos solucionar esto con algunas iteraciones jinja, pero eso no funciona para establecer variables.
Dicho esto, hay una solución :
def fetchlistfromdict(d, l):
result = []
for item in l:
result.append(d[item])
return result
class FilterModule(object):
def filters(self):
return {
'fetchlistfromdict': fetchlistfromdict,
}
Y ahora:
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Este caso parece ser muy específico y podría estar relacionado con el módulo route53
.
Entonces, ¿podemos agregar este filtro a ansible? ¿Hago un PR? ¿Qué pasa con el nombramiento? Guardé el original pero list_from_dict
me parece mejor.
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
¿Qué hace esto diferente de
{{ grupos['servidores web']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}
?
@amenonsen buen punto, solo he intentado obtener esto con map(attribute=
, parece que el nuevo filtro de extracción hace el trabajo, ¡espero jugar con él en una nueva versión!
Este ejemplo debe incluirse en la documentación. Busqué mucho antes de encontrar este problema.
Comentario más útil
Este ejemplo debe incluirse en la documentación. Busqué mucho antes de encontrar este problema.