На данный момент функцию карты можно использовать только так:
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute='path')
с возвращением
['/var/file1', '/var/file2']
(Документы: http://jinja.pocoo.org/docs/dev/templates/#map)
Я хочу предложить разрешить это:
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute=['path', 'mtime'])
или
[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attributes=['path', 'mtime'])
который должен вернуться
[{'path':'/var/file1', 'mtime': '123'},{'path':'/var/file2', 'mtime': '123'}]
Вы уже можете видеть, для чего это полезно: манипулировать списком словарей, чтобы в этих словах сохранялся только ограниченный набор атрибутов.
ПОНРАВИТСЯ эту функцию.
Я не понимаю, зачем это нужно в шаблонах. Просто перебирая словари и используя нужные атрибуты, вы добьетесь того же результата. Если вам нужны другие данные, вероятно, лучше провести эту манипуляцию в Python перед рендерингом. Я мог _maybe_ увидеть, как он возвращает кортежи.
Если кому-то это все еще нужно, вы можете использовать следующий код (введите 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
Использовать через:
ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])
Почему этот вопрос закрыт, а решение Nee6ione официально не реализовано? Было бы намного проще, если бы это поддерживалось без каких-либо дополнительных плагинов.
Самый полезный комментарий
Если кому-то это все еще нужно, вы можете использовать следующий код (введите
playbooks/filter_plugins/mapattributes.py
):Использовать через: