George
https://docs.ansible.com/ansible/2.4/intro_configuration.html#hash-behaviour
George
Он грязный, потому что тогда нельзя override делать.
Timur
Это для словарей, а не для списков
Timur
Значения ключей с одинаковым именем там точно также перетираются при этом :)
Timur
Согласно приоритету
citius
Народ, а подскажите архитектурно по плагинам. Есть vars plugin, который дергает данные из consul-а. ансибл вызывает плагин несколько перед каждым таском, все это есессно жутчайшим образом тормозит. хочется прикрутить в плагин кеширование, как это сделать кошернее - тупо складывать в json файлики, или раскуривать механизм кеширования самого ансибла? Есть ли вообще возможность использовать встроенный механизм кеширования для этих целей?
citius
к сожалению по расширению плагинов литература устаревшая, а в доке как-то ну очень куцо все (
Timur
По аналогии с gather_facts
George
Вопрос: а можно как-то сделать динамическую подгрузку playbook'ов (не путать с play)? import_playbook: '{{ hostvars.localhost.plugin }}' жалуется, мол 'hostvars' is undefined
George
when к import_playbook мне прикрутить удалось, а вот параметризацию - не очень. :(
citius
Один раз вызвать варсы и перевести в локальные переменные hostvars ансибла, которые закешированы в памяти, не?
вот да, но я не понимаю как это сделать? ансибл автоматом вызывает vars plugin несколько раз перед каждым _таском_. даже если заполнить hostvars, плагин же все равно будет дергаться и дергать консул.
Timur
Зачем дергать vars plugin перед каждым таском?
Timur
Не понимаю
Timur
Имена плейбук, в смысле
George
hostvars.localhost. Если предыдущая play была, они инициалированы. Например, если сделать when: hostvars.localhost.foobar, то оно проверит правильно. (На урвне playbook, да).
citius
Зачем дергать vars plugin перед каждым таском?
я тоже не понимаю зачем, но ансибл дергает. это же автоматом происходит. в доке написано: Using Vars Plugins Vars plugins are used automatically after they are enabled. и все, никаких настроек этого поведения я не нашел.
George
Э... ERROR! 'hostvars' is undefined.
citius
Ничего не понял. Как у вас код выглядит? И где этот плагин у вас дергается какими тасками?
плагин выглядит так: https://pastebin.com/V2qT8gWz скрипт лежит в папке, которая в ansible.cfg указана как vars_plugin. принудительно я его не вызываю сам нигде, это ансибл автоматом делает. и делает перед каждым таском, это видно если в скрипте включить какой-нить из print. причем ансибл зачем-то еще и по два раза его дергает, передавая одинаковые параметры.
Timur
Гляну чуть погодя
Timur
При том, что у вас уже есть from ansible.plugins.vars import BaseVarsPlugin
citius
Вот такая конструкция вам зачем? from ansible.plugins.vars.host_group_vars import VarsModule as HostGroupVarsModule
да хрен знает, я из примера плагина все это взял. нет под руками питониста, который бы глубоко мог погрузиться, приходится стековерфлошить (
Timur
Выпилите эту строку и посмотрите на результат
Timur
Есть подозрение, что она что-то не то делает
citius
попробую, спс.
citius
не изменилось поведение, но и хуже не стало
Timur
Ок. Тогда зайдем с другого конца. Зачем вам vars_plugin для консула при наличии lookup плагина для него же?
citius
а об этом я уже писал, lookup плагин нужен для того, чтобы дергать конкретное значение для конкретной переменной. а у меня в консуле дерево hostvars - дефолты сервиса, настройки проекта, настройки сервиса в проекте и т.д. я это хочу получить целиком, смержить и положить в hostvars.
citius
чтобы избавиться от файликов в group_vars и host_vars.
Timur
Ну, дерните лукапом и положите
Timur
В чем проблема-то?
citius
я с этим эксперементировал несколько месяцев назад уже, точно не вспомню конкретную проблему, но лукап плагин не поможет.
citius
там другая логика.
citius
в прямом, не получается получить дерево и смержить его в hostvars.
Timur
Он дергает любые данные из консула в нужный вам момент
Timur
Что с ними делать дальше - решаете сами
citius
эт все понятно, но мне не поможет к сожалению.
Timur
Ну, вы сами себе создаете проблему на пустом месте, получается
Timur
Я так понимаю, вы хотите dynamic_inventory из консула сделать?
Timur
Для этого же готовый скрипт есть уже просто
citius
не инвентарь из консула, а только хостварс. и мне нужна совместимость: 1) с легаси ансибл кодом, коего очень дохрена 2) с номадом на который переезжают сервисы, а там уже consul-template
citius
поэтому я фактически все конвертирую в формат удобный номаду, и учусь с этим же форматом работать и из ансибла
citius
Инвентори тоже в хостварс попадает, вообще-то
не суть важно, проблема то не в этом ) на самом деле я уже решил вопрос, включили родное ансибловское кеширование, и складываем в него ответы консула. все норм.
citius
ну включено то оно есессно и так было, просто в этот скрипт добавили. не могу коммит показать, он во внутреннем гите. так что сорри за кривой вид. примерно так: imports ... +CACHE = {} class VarsModule(BaseVarsPlugin): def get_vars(self, loader, path, entities): result = {} def kv_get(url): + if url in CACHE: + return CACHE[url] # print('getting url:', url) try: r = requests.get(url) build_tree(result, value) except BaseException as e: raise AnsibleError('Error getting vars: %s' % to_native(e)) + CACHE[url] = result return result
Timur
А, ок. Неплохо получилось!
Timur
Можно было еще вот так сделать: def get_vars(self, loader, path, entities, cache=True)
Timur
Сравните как в оригинальном hostvars плагине сделано: https://github.com/ansible/ansible/blob/devel/lib/ansible/plugins/vars/host_group_vars.py
citius
спасибо большое )
igi
Всем привет если ли возможность в следствие выполнение роли выполнить что небудь на мастере?
igi
средствами самого ансибла
Womchik
кто такой мастер?
igi
ну да
Александр
кто такой мастер?
Типа с чего запускаешь.
igi
да
Womchik
да
https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html local action
igi
идея такая запускается роль для создания пользователя для работы через ансибл (логин/пароль/ключь/привелеги ) после чего дописавыется в инвентори файл в группу на например "valid"
Timur
Ансибл создает пользователя для работы ансибла? Какая-то рекурсия получается
Mikhail
- name: Install a list of packages apt: name: "{{ packages }}" vars: packages: - foo - foo-tools теперь так надо ставить список пакетов?
Mikhail
вроде loop какой то был
Алексей
вроде loop какой то был
луп нужен если необходимо сделать пошаговые действия - отдельно к каждому элементу списка например.
Mikhail
ок, понял
igi
Ансибл создает пользователя для работы ансибла? Какая-то рекурсия получается
ну например появился новый сервак. есть логин и пароль написал роль которая создает отдельного пользователя для ансибла, подкидывает ключи, права и прочее и теперь я хочу что бы этот сервер добавился в определеную группу в инвентори файле
George
запушил - там сработал триггер на пуш и пошло раскатываться дальше
igi
ну вопрос в том можно ли это сделать стандартными средствами ансибла
Timur
Можно просто напрямую списком без vars