Pit
Надо было мне в разведку идти, а не эти ваши линуксы ковырять. Уже бы поднялся
Max
есть ириски?
Timur
господа, а можно перед стартом применения ролей проводить (или определять) какие-то pre-flight чеки, чтобы например не было конфликтов итд?
Timur
хотя бы начать с необходимых переменных для ролей
Timur
понятно, что я могу в роли сделать fail: when и оно спотыкнётся
Timur
так и делаю
Timur
assert
а. Хм.
Timur
а оно будет проверяться в момент импорта роли?
Lamobot
https://docs.ansible.com/ansible/latest/modules/assert_module.html
Lamobot
Сделайте его первым таском в роли
Timur
Сделайте его первым таском в роли
...и он сфейлится, когда до него дойдёт очередь, правильно?
Timur
а мне надо, чтобы фейлилось перед плеем
Lamobot
...и он сфейлится, когда до него дойдёт очередь, правильно?
В нём вы укажете все проверки, который должны пройти, для того, чтобы роль нормально запустилась
Lamobot
а мне надо, чтобы фейлилось перед плеем
Как вариант делать assert первым таском в плее
Timur
Как вариант делать assert первым таском в плее
т.е. assert, а потом import_role? Ну, наверное, можно и так... Но вообще, конечно, хотелось бы где-то в роли определять список необходимых ей параметров, а потом ansible собирал эти параметры и проверял, определены ли они :)
Timur
т.е. assert, а потом import_role? Ну, наверное, можно и так... Но вообще, конечно, хотелось бы где-то в роли определять список необходимых ей параметров, а потом ansible собирал эти параметры и проверял, определены ли они :)
потому как этот ассёрт необходимо будет а) синхронизировать для каждого плейбука, который деплоит какие-то роли куда-то и б) при обновлении роли в гите переменные могут поменяться (хотя ладно, этого у меня нет, роли у меня импортятся по тегам)
Max
(интуитивно, мне кажется тебе нужно создать роль preflight, которая будет зависимостью или вызываться explicitly из плея)
Max
но я не знаю всей глубины (_)(_)
Max
(проблемы)
Timur
дай пример префлайтов, которые ты хочешь ловить
ну вот хотя бы список отсутствующих переменных. Т.е. зависимости, которые подтянутся нужной ролью без установки этой роли не особо-то и нужны. Понятное дело, что идемпотентность всё спишет и повторно роли отработают нормально, но хорошо было бы как-то изящно это решить - чтобы ansible тебе говорил "чувак, ты тут слейв постгреса поднять пытаешься, а между тем нет ни данных, откуда брать basebackup, ни данных, к какому сервису цепляться". Сейчас оно так говорит (fail: when вполне работает), но уже после того, как применит пачку ролей - мониторинг, сборщик логов, первоначальная настройка системы итд.
Timur
жопы на самом деле никакой нет - всё работает :) просто хочется красоты
Max
я поставил 2 пустых стакана
Timur
:)
Max
входные валидации роли должна валидировать сама роль.
Timur
входные валидации роли должна валидировать сама роль.
да, но базовые валидации вполне можно было бы концептуально запихнуть в meta.yml, чтобы ansible при импорте роли знал, что ей гарантированно понадобятся такие-то параметры
Timur
я так это вижу с архитектурной т.з.
Max
то, что имеет смысл валидировать отдельно, это состав инвентаря, сетевой доступ, базовый функционал типа ssh/python/winrm
Max
да, но базовые валидации вполне можно было бы концептуально запихнуть в meta.yml, чтобы ansible при импорте роли знал, что ей гарантированно понадобятся такие-то параметры
может я не аптудейт, но meta позволяет указать зависимости в форме ролей. т.е. тебе придется создавать для каждой роли отдельную роль валидации. на фига ?
inqfen
Вообще, так как это не декларативный формат - такое тестирование будет сложно
inqfen
В meta валидация в смысле
inqfen
А оно много где описано
inqfen
Поэтому это уже тестирование плейбука
inqfen
Чот сообщение не отправилось
Timur
Ну я многого не требую - ассерт в формате жинжа2 выражения при импорте роли :)
Timur
Эхма. Понятно, что пока нет. Но было бы красиво, кмк
inqfen
только учти, что может наример или тот или тот набор переменных быть
Timur
Ну тогда напиши
Дело за малым, да :)
inqfen
А зависимости от других параметров - могут например различаться ключи словаря, который ты будешь проверять
inqfen
И вот это все там учти
Timur
Блин, 250 открытых фичреквестов по ключевому слову "role" :)
Georgy Kharitonov
всем привет. есть такая задачка, надо через ансибл крон настроить на нескольких хостах. но так чтобы на всех хостах время начала выполнения задания по планировщику отличалось на 5 минут. то есть на первом хосте должно быть 0 1 * * *, на втором 5 1 * * *, 10 1 * * * и тд. что-то не могу придумать как это в ансибл реализовать.
inqfen
Темплейт
inqfen
Или переменные с datetime
inqfen
А, хотя туплю с datetime
inqfen
А это одна хостгруппа?
inqfen
Если да, то можно установить для каждого хоста в хостгруппе через цикл специальную hostvar где будет это число в минутах. А каждую итерацию будет делаться +5
inqfen
А запись в крон в качестве первого числа будет эту hostvar юзать
inqfen
И надо обработать, что это число не может быть больше 60 например и вместо 65 должно быть 0
Georgy Kharitonov
А обязательно через 5 минут? Или можно просто рандомом выдавать время?
нет, 5 минут это от себя добавил. совсем рандомное тоже плохо я думаю
Georgy Kharitonov
да, hostvar наверное правильное решение. спасибо
Lamobot
нет, 5 минут это от себя добавил. совсем рандомное тоже плохо я думаю
Если рандом, то https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#random-number-filter {{ 59 | random(step=5) }}
Lamobot
Но я бы на вашем месте пошёл через номера хостов в группе, как указал @inqfen только без циклов, всё можно сделать проще {{ groups[hosts_group_name].index(ansible_host) }} - выдает номер хоста в группе
Rad
приветствую , подскажите пожалуйста в awx роли подтягивать только через roles/requirements.yml ? Напрягает необходимость для каждого плейбука указывать роли через requirements.yml, хотел указывать в плейбуке в виде roles: -- {role: rolename, tags: [ 'tagname'] }
Max
hostvar наверное будет более прозрачным решением. чтобы потом можно было еще изменять на конкретное время
вообще, шедулинг лучше делать не с ансиблом. с каким-то шедулером, используя ансибл как драйвер. это вмки или контейнеры?
Max
просто крон штука невидимая.
Max
(извне)
Rad
И откуда он узнает где эта роль живёт?
В AWX есть настройка выбора ansible galaxy, если поднять свой и настроить что по дефолту бери с galaxy
Max
вм
а откуда запускается ансибл? руками или автоматически через какой-то оркестратор?
Georgy Kharitonov
а откуда запускается ансибл? руками или автоматически через какой-то оркестратор?
руками. плейбук расчитан на одноразовый запуск на нодах
⎈
Если не докер, то можно вместо крона использовать встроенные инструменты systemd
Max
руками. плейбук расчитан на одноразовый запуск на нодах
в принципе похоже, что вы пытаетесь контролировать нагрузку на какое-то узкое место при помощи инструмента, которому пофиг на узкие места (крон).
Max
если у вас есть узкое место (как напр. общая бд), то используйте механизм, позволяющий запускать DAGи и т.п. таких есть много. кроме этого, запуск крона еще и не видно вне вмки. у вас получается есть какой-то процесс, который надо запустить максимум в одной-двух ипостасях параллельно. наверняка было бы приятно знать что все или не все запустились, и завершились успешно. и кроны иногда могут запускаться из-за проблем синхронизации времени "не вовремя".
Max
в инфре есть какой-то сервер выкатки? и т.п.
Georgy Kharitonov
в инфре есть какой-то сервер выкатки? и т.п.
есть ансибл контроллер, он же awx
Georgy Kharitonov
вряд ли выделят ресурсы под такую софтину. можно попробовать конечно...
Max
вряд ли выделят ресурсы под такую софтину. можно попробовать конечно...
решение кроном точно проблемное. есть всякие воркфлоу менеджеры.
Georgy Kharitonov
ну, я максимум могу им посоветовать такое поставить.
Georgy Kharitonov
пасиба, в общем. не видел еще, чтобы у нас что-то подобное кто-то у себя использовал.