Nklya
Я такое делал для деплоя war'ников в томкат, нормально выглядит
Evgeniy
https://stackoverflow.com/questions/25694249/ansible-using-with-items-with-notify-handler
Evgeniy
Нужен. Сейчас мне приходится пилить такую конструкцию зачастую: - name: Generate {{ daemon }} template: .. - name: Reload systemd systemd: .. Помоему это проще: - name: Generate {{ daemon }} template: .. handler: restart_systemd {{ daemon}}
Evgeniy
не то?
Evgeniy
А у меня задача прочитать переменные из файла - не важно на локальном компе или на удаленном и использовать эти переменные, чтобы затем на удаленной машине пополнять конфиги в соотв. строках не подскажите, как реализовать?
Evgeniy
я так понял ансибл читает из yaml или json
Evgeniy
а нужно из простого файлика txt, который правит юзер
Evgeniy
можно, конечно генерировать его в yaml или json или т.д. но может подскажите, что удобнее?
Evgeniy
я не прошу кода, достаточно лишь ключевых слов, куда копать)
Ievgen
Yaml хорошо читаем и достаточно прост, совсем не вариант научить юзера делать в тхт файлике что то типа: variable: value ?
Evgeniy
думаю, так и буду делать, нормальный вариант а если будут задачи брать на удаленной машине - то конвертировать в json\yaml каким-нибудь скриптом...
Evgeniy
нужно будет просить юзера заполнить var, а затем проверить еще эти значения, видимо внешним скриптом... ай, ладно как-нибудь сделаю)
Evgeniy
как я понял, он все переменные отдаст как контент, а переменные разные и их около 10, а не 1
ShadoWalkeR
А зачем жестко прописывать зависимости? Просто если чтото заставит рестартануть target (например кривые руки эксплуатации), от которого жестко зависят все сервисы, то они тоже рестартанут.
ShadoWalkeR
А друг от друга сервисы не зависят
Vladimir
а почему ты массивом то не хочешь сделать список
ShadoWalkeR
А почему вы уверенны что у меня не так?
Vladimir
- name: Generate {{ item }} template: .. with_items: ....
Vladimir
и не нужны никакие хендлеры.
ShadoWalkeR
У меня для разных типов сервисов разные правила генерации - гдето достаточно только имени, гдето нужно описать дополнительные параметры - и список слов превращается в список списков. Хэндлер хотел использовать чтобы уйти от block/include_tasks - вместо двух шагов выполнять 1
ShadoWalkeR
Вообще самое позорное что могли разрабы ансибла придумать - директиву block. Loop на нее повесить нельзя (потому что это не нужно по словам разрабов), name, на который блок вешается, в лог не выводится. Поэтому его выполнение в логе выглядит не как: block: Generate daemon {{name}} -> template -> systemd А просто template -> systemd
ShadoWalkeR
Хочешь пояснений? Вешай на каждое действие в блоке name
ShadoWalkeR
И в итоге вместо аккуратной группировки получается эталонная херня
Nklya
каждый таск должен быть с name, вот и все
Nklya
тебе даже ansible-lint об этом скажет
Evgeniy
И в итоге вместо аккуратной группировки получается эталонная херня
я так понял чтобы использовать ansible в programming-style нужно копать в сторону jinga и использовать всякие макросы, ты не изучал в эту сторону? Правильно я понял или нет?
ShadoWalkeR
каждый таск должен быть с name, вот и все
Зачем? Что если я хочу несколько таск сгруппировать логически? Просто пример: - name: Generate monitoring target template: src=etc/systemd/monitoringLLD.target.j2 dest=/etc/systemd/system/{{ SYSTEMD_ZABBIX_MAIN_KEY|default("monitoringLLD") }}.target - name: Generate monitoring failure service template: src=etc/systemd/onfailureLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_ONFAILURE|default("onfailureLLD") }}@.service - name: Generate monitoring probe template: src=etc/systemd/probeLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_PROBE|default("probeLLD") }}@.service
Nklya
ну вот и группируй их в блок, если очень надо
ShadoWalkeR
Казалось бы логично что я могу их объединить через block в одну таску: - name: Generate monitoring infrastructure. block: - template: src=etc/systemd/monitoringLLD.target.j2 dest=/etc/systemd/system/{{ SYSTEMD_ZABBIX_MAIN_KEY|default("monitoringLLD") }}.target - template: src=etc/systemd/onfailureLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_ONFAILURE|default("onfailureLLD") }}@.service - template: src=etc/systemd/probeLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_PROBE|default("probeLLD") }}@.service
ShadoWalkeR
Но изза ебанутой реализации блока приходится делать так: - name: Generate/Re-Generate monitoring infrastructure. block: - debug: msg: Generate/Re-Generate monitoring infrastructure. - template: src=etc/systemd/monitoringLLD.target.j2 dest=/etc/systemd/system/{{ SYSTEMD_ZABBIX_MAIN_KEY|default("monitoringLLD") }}.target - template: src=etc/systemd/onfailureLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_ONFAILURE|default("onfailureLLD") }}@.service - template: src=etc/systemd/probeLLD@.service.j2 dest=/etc/systemd/system/{{ SYSTEMD_PROBE|default("probeLLD") }}@.service
Vadim
а чем with_items \ lookup не походит?
Nklya
логично-не логично, код открытый, идешь и смотришь, можно ли творить такую дичь
ShadoWalkeR
Не знаю для какой версии тот пример со stack overflow но в 2.6 хэндлер дергается 1 раз после отыгрывания всего плейбука. И если один и тот же хэндлер вызывается для разных переменных, то он выполнится только для самой последней. Если бы у меня был просто один список сервисов это бы полностью устраивало, но этого нет.
ShadoWalkeR
я так понял чтобы использовать ansible в programming-style нужно копать в сторону jinga и использовать всякие макросы, ты не изучал в эту сторону? Правильно я понял или нет?
Я пробовал в имя хэндлера макрос подпихнуть, но сходу не завелось - дальше не стал разбираться - и так на это времени много потратил
Evgeniy
Не знаю для какой версии тот пример со stack overflow но в 2.6 хэндлер дергается 1 раз после отыгрывания всего плейбука. И если один и тот же хэндлер вызывается для разных переменных, то он выполнится только для самой последней. Если бы у меня был просто один список сервисов это бы полностью устраивало, но этого нет.
печально, спасибо что проверил, у меня руки еще не дошли, учусь пока что да и вообще я сделал выводы, что ансибл скорее всего буду использовать связкой: питон поверх ансибла, там и проверить пользовательские переменные введенные можно и самому сгенерировать хендлеры и все таски похожие генерировать функциями. Роли мне не понравились... если будут нерешаемые корявости - вообще буду чисто питон использовать с его родными модулями для тех же задач, что и ансибл хотя, возможно, сказывается малый опыт использования этого инструмента у меня и непонимание многого, роли вообще не понял зачем нужны... У меня конкретные задачи: 1 раскатать ПО из набора сервисов на хост, подменить переменные в конфиге на пользовательские. Хосты разные и не связаны с друг другом. Это виделось мне одним плейбуком. 2. Точно также, что выше- но связанные хосты с сервисами (в первом случае однонодовая инсталяция, во втором- многонодовая)
Nklya
ну так и делаешь блин одну роль и вызываешь ее для разных хостов потом с разными именами
Nklya
нахера это лепить одной сраной простыней на ямле?
ShadoWalkeR
печально, спасибо что проверил, у меня руки еще не дошли, учусь пока что да и вообще я сделал выводы, что ансибл скорее всего буду использовать связкой: питон поверх ансибла, там и проверить пользовательские переменные введенные можно и самому сгенерировать хендлеры и все таски похожие генерировать функциями. Роли мне не понравились... если будут нерешаемые корявости - вообще буду чисто питон использовать с его родными модулями для тех же задач, что и ансибл хотя, возможно, сказывается малый опыт использования этого инструмента у меня и непонимание многого, роли вообще не понял зачем нужны... У меня конкретные задачи: 1 раскатать ПО из набора сервисов на хост, подменить переменные в конфиге на пользовательские. Хосты разные и не связаны с друг другом. Это виделось мне одним плейбуком. 2. Точно также, что выше- но связанные хосты с сервисами (в первом случае однонодовая инсталяция, во втором- многонодовая)
Лучше на логические блоки разбить и из них собирать таски, а в main оставить только какую таску вызвать
ShadoWalkeR
И конфиги лучше генерировать из j2 шаблонов
Evgeniy
Разве одна простыня на yaml читаемее меньшей простыни на yaml с походами в директории и чтения отдельных, маленьких yaml? - с IDE это будет еще читаемо, а вот кто использует чисто консоль- печаль. Генерировать питоном (как это делает jinga) - не правильный подход? Мне второй вариант больше нравится именно из-за возможности использования регулярок для проверки variables, т.к. на разных хостах они разные или лучше просто сначала запускать проверку var, а затем просто использовать ansible? Вообщем сложно что-то заранее решить без опыта)
ShadoWalkeR
j2 - и есть jinja2 шаблоны
Evgeniy
генерировать с j2 удобнее, чем просто формировать yaml функциями с питона(другого_яп)?
Joe
Всем привет, подскажите как сделать чтобы к client01.csr подписывался ip ноды на которой он сгенерировался? 10.0.0.1-client01.csr http://telegra.ph/ansible-07-18
Joe
ip получаем с eth0
ShadoWalkeR
генерировать с j2 удобнее, чем просто формировать yaml функциями с питона(другого_яп)?
К примеру можно включать файл из vars так: include_vars: "{{ ansible_hostname }}.yml" В файле просто указать все специфичные для хоста переменные, а template при раскатывании из j2 сам подставит их значения в шаблоне
Joe
К примеру можно включать файл из vars так: include_vars: "{{ ansible_hostname }}.yml" В файле просто указать все специфичные для хоста переменные, а template при раскатывании из j2 сам подставит их значения в шаблоне
В инвентори я прописываю уже IP Ноды #hosting-location-server1 ansible_host=xxx.xxx.xxx.xxx ansible_port=22 ansible_connection=ssh ansible_user=root По идее мне его надо передать в название сертификата
Evgeniy
К примеру можно включать файл из vars так: include_vars: "{{ ansible_hostname }}.yml" В файле просто указать все специфичные для хоста переменные, а template при раскатывании из j2 сам подставит их значения в шаблоне
это я понимаю, я о том (уже пообщался с разработчиком и он вроде не видит особых причин почему бы и нет) почему мне бы просто не генерировать своим яп кодом yaml а потом просто его запускать зачем мне маяться с j2? На простых задачах я просто сэкономлю время, т.к. изучать макросы jinja сложнее применимо к моей задаче, на мой взгляд
Sergey
Есть штатные средства для подтягивания хост-зависимых переменных, host_vars называется
ShadoWalkeR
Можно. Но мне надо через include_vars 😃
Nklya
Надо доклад сделать про это
Sergey
Можно. Но мне надо через include_vars 😃
Да, согласен, в магазин можно и на одной ноге допрыгать, держа вторую рукой за пятку. Однако разработчиком предусмотрены штатные, более простые и удобные средства - тупо идти двумя ногами. Достаточно прозрачная аналогия?
Nklya
будет сильный конкурент тому, что в баду генерируют
Vadim
помните - жгут выше артерии, но ниже вены
ShadoWalkeR
Например политика написания плебуков для ансибла, которая от меня не зависит?
Nklya
вот еще более прозрачная аналогия http://i.imgur.com/QBPfJAl.jpg
ShadoWalkeR
вот еще более прозрачная аналогия http://i.imgur.com/QBPfJAl.jpg
Вообще забавно слушать советы от людей, которые не в курсе что with_item заменяется на loop
Nklya
Sergey
А вы не думали что может быть есть какие то причины, которые не позволяют host_vars использовать?
Думал. "У нас есть очень веские причины чистить зубы не зубной щёткой, а топором" - это уж как угодно, просто порезы дёсен обычно будут глубокими, кровоточащими и долго заживающими. Да, я знаю, что, в принципе, существуют люди, которые почистят зубы топором лучше, чем условный я - зубной щёткой, но, кажется, здесь другой случай. Дело в том, что минимум раз в три дня сюда, в чат по Ансиблу, забегает недовольный человек с тонной критики, а на поверку оказывается, что он обвиняет инструмент в проблемах процессов в его организации, или (реже) в диком неумении/нежелании читать маны и изучать инструмент.
Sergey
гиф припас, спасибо 😊
Nikita
Оооо
Nikita
Холиварчик
Nikita
Sergey
И из всего что я сегодня высказал вы докапываетесь только до одной фразы сказанной как пример. Могу считать что со всеми остальными аргументами вы согласны
Менять твоё мнение я никоим образом не собираюсь - не моя специальность, просто хочу обратить твоё внимание на тот факт, что у инструмента есть вполне конкретная область применимости и способ применения, если ты выходишь за границы - инструмент может себя вести как угодно или не вести вовсе. Знание же границ области применимости инструмента и корректных с точки зрения предметной области способов преодоления этих границ само по себе выходит достаточно далеко за рамки манов, а тебя же выводит из подмастерьев в мастера.
Joe
Лучше будет если, этот IP при гнерации файла я буду получать из переменной "ansible_host=" как это сделать?
Sergey
или речь шла о штатной переменной?
ShadoWalkeR
Я вижу многие из присутствующих любят делать далеко идущие выводы на основе пары фраз, вырванных из контекста.
Vladimir
Тебе уже дали рядж советов
Vladimir
ты продолжаешь гнуть свою линию
Vadim
Я вижу многие из присутствующих любят делать далеко идущие выводы на основе пары фраз, вырванных из контекста.
нет уж, ты сам в первом сообщении сказал "наркомания", а теперь обиделся за то что мы тебя отговариваем?
ShadoWalkeR
нет уж, ты сам в первом сообщении сказал "наркомания", а теперь обиделся за то что мы тебя отговариваем?
Ну вообщето если вы пропустили момент - то с хэндлерами изза того что это не реализуемо я отказался от идеи.