Jinja: Permitir que o filtro do mapa recupere vários itens

Criado em 29 fev. 2016  ·  4Comentários  ·  Fonte: pallets/jinja

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.

Comentários muito úteis

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',])

Todos 4 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

glasserc picture glasserc  ·  4Comentários

AMDmi3 picture AMDmi3  ·  4Comentários

RickGray picture RickGray  ·  6Comentários

hvnsweeting picture hvnsweeting  ·  4Comentários

guettli picture guettli  ·  5Comentários