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
Timur
По аналогии с gather_facts
George
Вопрос: а можно как-то сделать динамическую подгрузку playbook'ов (не путать с play)? import_playbook: '{{ hostvars.localhost.plugin }}' жалуется, мол 'hostvars' is undefined
George
when к import_playbook мне прикрутить удалось, а вот параметризацию - не очень. :(
Timur
Timur
Зачем дергать vars plugin перед каждым таском?
Timur
Не понимаю
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.
и все, никаких настроек этого поведения я не нашел.
Timur
Timur
George
Э... ERROR! 'hostvars' is undefined.
citius
Ничего не понял. Как у вас код выглядит? И где этот плагин у вас дергается какими тасками?
плагин выглядит так:
https://pastebin.com/V2qT8gWz
скрипт лежит в папке, которая в ansible.cfg указана как vars_plugin.
принудительно я его не вызываю сам нигде, это ансибл автоматом делает.
и делает перед каждым таском, это видно если в скрипте включить какой-нить из print.
причем ансибл зачем-то еще и по два раза его дергает, передавая одинаковые параметры.
citius
Timur
Гляну чуть погодя
Timur
Timur
При том, что у вас уже есть
from ansible.plugins.vars import BaseVarsPlugin
Timur
Выпилите эту строку и посмотрите на результат
Timur
Есть подозрение, что она что-то не то делает
citius
попробую, спс.
citius
не изменилось поведение, но и хуже не стало
Timur
Ок. Тогда зайдем с другого конца. Зачем вам vars_plugin для консула при наличии lookup плагина для него же?
citius
а об этом я уже писал, lookup плагин нужен для того, чтобы дергать конкретное значение для конкретной переменной.
а у меня в консуле дерево hostvars - дефолты сервиса, настройки проекта, настройки сервиса в проекте и т.д.
я это хочу получить целиком, смержить и положить в hostvars.
citius
чтобы избавиться от файликов в group_vars и host_vars.
Timur
Ну, дерните лукапом и положите
Timur
В чем проблема-то?
citius
я с этим эксперементировал несколько месяцев назад уже, точно не вспомню конкретную проблему, но лукап плагин не поможет.
citius
там другая логика.
Timur
citius
в прямом, не получается получить дерево и смержить его в hostvars.
Timur
Он дергает любые данные из консула в нужный вам момент
Timur
Что с ними делать дальше - решаете сами
citius
эт все понятно, но мне не поможет к сожалению.
Timur
Ну, вы сами себе создаете проблему на пустом месте, получается
Timur
Я так понимаю, вы хотите dynamic_inventory из консула сделать?
Timur
Для этого же готовый скрипт есть уже просто
citius
не инвентарь из консула, а только хостварс.
и мне нужна совместимость:
1) с легаси ансибл кодом, коего очень дохрена
2) с номадом на который переезжают сервисы, а там уже consul-template
citius
поэтому я фактически все конвертирую в формат удобный номаду, и учусь с этим же форматом работать и из ансибла
Timur
Timur
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
Timur
Ансибл создает пользователя для работы ансибла? Какая-то рекурсия получается
Mikhail
- name: Install a list of packages
apt:
name: "{{ packages }}"
vars:
packages:
- foo
- foo-tools
теперь так надо ставить список пакетов?
Mikhail
вроде loop какой то был
Алексей
Алексей
вроде loop какой то был
луп нужен если необходимо сделать пошаговые действия - отдельно к каждому элементу списка например.
Mikhail
ок, понял
George
George
запушил - там сработал триггер на пуш и пошло раскатываться дальше
igi
ну вопрос в том можно ли это сделать стандартными средствами ансибла
igi
Timur
Timur
Можно просто напрямую списком без vars