No momento, a função de mapa só pode ser usada desta forma:
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute='path')
com o retorno de
['/var/file1', '/var/file2']
(Documentos: http://jinja.pocoo.org/docs/dev/templates/#map)
Eu quero propor permitir isso:
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute=['path', 'mtime'])
ou
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attributes=['path', 'mtime'])
que deve retornar
[{'path':'/var/file1', 'mtime': '123'},{'path':'/var/file2', 'mtime': '123'}]
Você já pode ver para que isso é útil: manipular uma lista de dicts de forma que esses dicts retenham apenas um conjunto limitado de atributos.
Adoraria esse recurso.
Não estou claro por que isso é necessário nos modelos. Apenas iterar os dicionários e usar os atributos de que você precisa realizará a mesma coisa. Se você precisar de dados diferentes, provavelmente é uma ideia melhor fazer essa manipulação em Python antes da renderização. Eu poderia _talvez_ ver uma utilidade para ele retornar tuplas.
Se alguém ainda precisar disso, você pode usar o seguinte código (coloque em playbooks/filter_plugins/mapattributes.py
):
#!/usr/bin/env python
class FilterModule(object):
def filters(self):
return { 'mapattributes': self.mapattributes }
def mapattributes(self, list_of_dicts, list_of_keys):
l = []
for di in list_of_dicts:
newdi = { }
for key in list_of_keys:
newdi[key] = di[key]
l.append(newdi)
return l
Use via:
ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])
Por que este problema foi encerrado e a solução Nee6ione não foi implementada oficialmente? Seria muito mais simples se isso fosse suportado sem quaisquer plug-ins adicionais
Comentários muito úteis
Se alguém ainda precisar disso, você pode usar o seguinte código (coloque em
playbooks/filter_plugins/mapattributes.py
):Use via: