2015-03-13 2 views
6

Есть ли способ получить доступ к vars хоста/группы изнутри custom written module? Я хотел бы избежать передачи всех необходимых параметров в качестве параметров модуля.Ansible: Доступ к хостам/группам vars из пользовательского модуля

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

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

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

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

Редактировать: Найден module utils сейчас, и не выглядит многообещающим.

ответ

1

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

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

Однако, заявив, что, если у вас действительно есть необходимость в этом, может возникнуть немного грязный способ сделать это. Начиная с Ansible 1.8 вы можете настроить fact caching, который использует redis для кэширования фактов между прогонами. Поскольку redis довольно прост в использовании и имеет clients for most popular programming languages, вы можете запросить модуль на сервере redis для любых фактов, которые вам нужны. Это не самый чистый способ сделать это, но это может сработать.

+0

Это очень интересно! Сейчас это не вариант, потому что для этого потребуется дополнительный узел redis, доступный из локального поля и удаленного окна. Это слишком много накладных расходов. Но мы можем реализовать его таким образом позже, когда у нас будет больше автоматизации с Ansible. Кэширование фактов - это то, что мы, вероятно, захотим в любом случае позже. Я приму свой ответ - хотя это не оптимальное решение, оно кажется лучшим. – udondan

+0

Вы можете просто установить redis на существующий сервер. redis очень легкий, поэтому дополнительный сервер не требуется. –

+0

Ну, здесь это немного сложнее.Работа с несколькими тысячами хостов в 8 колодах с несколькими отдельными vlans в каждом. Мы только начинаем с Ansible. Прямо сейчас это потребует слишком много усилий, но очевидно, что в будущем нам нужно кэширование фактов, и это должно быть очень легко реализовать. – udondan

3

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

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

Вы должны пройти их самостоятельно, так или другой:

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

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

Смежные вопросы