Ansible: фильтр fetchlistfromdict

Созданный на 25 мар. 2016  ·  3Комментарии  ·  Источник: ansible/ansible

ТИП ПРОБЛЕМЫ

  • Идея функции
    РЕЗЮМЕ

Допустим, у вас есть массив словарей, и вы хотите создать массив с некоторыми атрибутами словаря. Для этого есть несколько способов: selectattr, map и новый фильтр извлечения .

Это прекрасно работает, пока вы не решите использовать хосты какой-то группы в качестве начального массива словарей. Таким образом, вы должны получить hostvars для каждого хоста в группе с фильтром. Обычно мы можем обойти это с помощью некоторых итераций jinja, но это не работает для установки переменных.

Тем не менее, есть решение :

def fetchlistfromdict(d, l):
    result = []
    for item in l:
        result.append(d[item])

    return result

class FilterModule(object):
    def filters(self):
        return {
            'fetchlistfromdict': fetchlistfromdict,
        }

И сейчас:

{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}

Этот случай кажется очень специфичным и может быть связан с модулем route53 .

Так можем ли мы добавить этот фильтр в ansible? Мне сделать пиар? А что с неймингом? Я сохранил оригинал, но list_from_dict выглядит лучше для меня.

Самый полезный комментарий

Этот пример должен быть включен в документацию. Я ищу довольно долго, прежде чем я нашел эту проблему.

Все 3 Комментарий

{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}

Чем это отличается от

{{ groups['webservers']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}

?

@amenonsen хорошее замечание, я пытался получить это только с помощью map(attribute= , похоже, что новый фильтр извлечения делает свою работу, с нетерпением жду возможности поиграть с ним в новой версии!

Этот пример должен быть включен в документацию. Я ищу довольно долго, прежде чем я нашел эту проблему.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги