Ansible: доступ к переменным хоста/группы из пользовательского модуля.

Есть ли способ получить доступ к переменным хоста/группы из специально написанного модуля? Я хотел бы избежать передачи всех необходимых переменных в качестве параметров модуля.

Мой модуль написан на Python, и я использую шаблон. Я проверил почти все доступные вары, но они нигде не хранятся:

def main():
    pprint(dir())
    pprint(globals())
    pprint(locals())
    for name in vars().keys():
        print(name)

Теперь моя единственная надежда на то, что они каким-то образом доступны через недокументированные модули utils.

Я предполагаю, что это невозможно, поскольку модуль работает на целевой машине, и, вероятно, переменные fact/host/group не передаются вместе с модулем...

Изменить: теперь найдены модульные утилиты, и это не выглядит многообещающе.


person udondan    schedule 13.03.2015    source источник


Ответы (2)


Я думаю, что вы в значительной степени попали в точку со своими мыслями здесь:

Я предполагаю, что это невозможно, поскольку модуль работает на целевой машине, и, вероятно, переменные fact/host/group не передаются вместе с модулем...

Однако, сказав это, если у вас действительно есть потребность в этом, то может быть немного грязный способ сделать это. Начиная с Ansible 1.8 вы можете настроить кэширование фактов, которое использует Redis для кэширования фактов. между тиражами пьес. Поскольку Redis довольно прост в использовании и имеет клиенты для большинства популярных языков программирования, вы можете запросить модуль у сервера Redis. для любых фактов, которые вам нужны. Это не самый чистый способ сделать это, но он может сработать.

person Bruce P    schedule 13.03.2015
comment
Это очень интересно! Прямо сейчас это не вариант, потому что для этого потребуется дополнительный хост Redis, доступный из локального и удаленного ящиков. Это слишком много накладных расходов. Но мы могли бы реализовать это позже, когда у нас будет больше автоматизации с помощью Ansible. Кэширование фактов — это то, что мы, вероятно, захотим в любом случае позже. Я приму ваш ответ - хотя это и не оптимальное решение, оно кажется лучшим из доступных. - person udondan; 16.03.2015
comment
Вы можете просто установить Redis на существующий доступный сервер. Redis очень легкий, поэтому дополнительный сервер не требуется. - person Bruce P; 16.03.2015
comment
Ну тут немного сложнее. Работа с несколькими тысячами хостов в 8 цветах с несколькими отдельными вланами в каждом. Мы только начинаем работать с Ansible. Прямо сейчас это потребовало бы слишком много усилий, но очевидно, что нам понадобится кэширование фактов не так далеко в будущем, и тогда это должно быть очень легко реализовано. - person udondan; 16.03.2015

Есть ли способ получить доступ к переменным хоста/группы из пользовательского написанного модуля?

Не встроенный.

Вам придется пройти их самостоятельно так или иначе:

  • Аргументы модуля.
  • Сериализировать в локальную файловую систему (с pickle или yaml.dump() или json или...) и отправить файл.
  • любые другие инновационные идеи, которые вы можете придумать.

К сожалению, вы не можете просто отправить целые файлы host/groupvar как есть, потому что вам придется реализовать алгоритм разрешения переменной области/приоритета ansible, который не определен (это не дзен-философия ansible для определения таких мелочей :P ).

person Kashyap    schedule 13.03.2015