Опять же, еще один юзкейс из опыта. Есть та же

роль настройки некого приложения, оперирующая неким набором начальных данных. Используется эта роль на разные проектах разными командами и работает в существенно разном окружении. В одном случае роли на вход нужны данные, получаемые из одного хранилища секретов, скажем, а в другом проекте - из совсем другого. Проекты друг о друге не знают почти ничего и общей кодовой базы почти не имеют (кроме некоторых универсальных ролей). Как прикажете реализовать ваш подход с зависимостями в этом случае?

35 ответов

27 просмотров

Никак, зависимостями тут не решишь. Надо хранить факты, в которых описано состояние. Ну или проводить декомпозицию на более мелкие рольки.

Timur-Gadiev Автор вопроса
Николай М
Никак, зависимостями тут не решишь. Надо хранить ф...

Никакие факты не помогут в конкретном случае. Условно говоря, нам нужно сделать ряд запросов по API в определенное приложение и получить оттуда набор неких данных, которые потом и скармливаются универсальной роли, которая отвечает за конфигурацию. Хранить эти факты нигде не нужно, они короткоживущие и привязанные к конкретной сессии сценария.

Кстати, если роль работает в существенно разных окружениях, то её надо дробить, чтобы в ней не происходило слишком много ветвлений.

Николай М
Никак, зависимостями тут не решишь. Надо хранить ф...

Вот ещё источник для вдохновения (но я не со всем там согласен) https://docs.debops.org/en/stable-3.0/dep/dep-0002.html

Timur Gadiev
Никакие факты не помогут в конкретном случае. Усло...

Вот! Собака зарыта в антипаттерне "универсальная роль".

Timur-Gadiev Автор вопроса
Николай М
Кстати, если роль работает в существенно разных ок...

Всякое бывает. Иногда наоборот - мы делали роль, которая покрывает максимальное число существенно разных сценариев использования и имеет кучу ветвлений. Ее поддерживать может быть проще, чем 100500 отдельных ролей, которые делают по сути одну и ту же вещь

Timur-Gadiev Автор вопроса
Elenhil
Лукап? 🤔

Это не всегда просто лукапом делается. Ну, и лукапы тоже разные бывают, и на вход тоже разного требуют. В общем, юзкейс, когда одна роль готовит для другой входной набор данных, вполне нормальный и рабочий. И зависимость тут как раз совершенно лишняя между ролями.

Timur Gadiev
Это не всегда просто лукапом делается. Ну, и лукап...

Ну, ты про секретменеджеры упоминал, и там обычно лукап. Но да, имхо депенденси тоже зло Явное > неявного

Timur Gadiev
Это не всегда просто лукапом делается. Ну, и лукап...

Нормальный, кто ж спорит. Этот набор данных записывается в структуру (факт). Если вторая роль этот факт явным образом не находит -- то падает с визгом. Всё по бест практис))

Timur-Gadiev Автор вопроса
Николай М
Вот! Собака зарыта в антипаттерне "универсальная р...

Тут нет антипаттерна. Это, собственно, и есть основной юзкейс для роли, которая сделана для максимального переиспользвания

Timur Gadiev
Тут нет антипаттерна. Это, собственно, и есть осно...

Даже в программировании переиспользование с универсальностью не коррелируют (или коррелируют отрицательно). Юникс-утилиты минимально универсальны и максимально переиспользуемы.

Timur-Gadiev Автор вопроса
Николай М
Нормальный, кто ж спорит. Этот набор данных записы...

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

Timur-Gadiev Автор вопроса
Николай М
Даже в программировании переиспользование с универ...

Это не так. В современном линуксе куча дублирующего функционала даже в самых базовых инструментах

Timur Gadiev
Если вы не скормите роли правильные параметры под ...

Правильность параметров описывается в argument_specs.yml. Имею в виду, что роль должна получать данные явным образом на входе, а не падать посередине оттого, что ей чего-то не подготовили.

Timur Gadiev
Это не так. В современном линуксе куча дублирующег...

так никто и не говорит, что весь современный линукс -- юниксвеен.

Timur-Gadiev Автор вопроса
Николай М
Правильность параметров описывается в argument_spe...

Не очень понятно, что для вас тут «явным образом». И чем вариант с конкретным кодом, который задает динамически входные параметры, не явный.

Timur-Gadiev Автор вопроса
Николай М
так никто и не говорит, что весь современный линук...

Этого юниксвея не было по сути никогда. Это красивая идея, но на практике реализуется все чуть иначе

Timur Gadiev
Этого юниксвея не было по сути никогда. Это красив...

В coreutils не слишком много универсального или дублирующегося функционала

Timur Gadiev
Не очень понятно, что для вас тут «явным образом»....

Явным образом означает то, что все возможные входные параметры описаны в argument_specs и, тем самым, проверяются на наличие/отсутствие/корректность (типы, например) до начала выполнения всех тасков роли.

Timur-Gadiev Автор вопроса
Николай М
Явным образом означает то, что все возможные входн...

И как их описание поможет в случае, если если их указать неправильно?

Timur Gadiev
И как их описание поможет в случае, если если их у...

В смысле как поможет? Роль упадёт с жалобой на некорретные входные параметры. Т.е. именно то, что и нужно. Никакого непредвиденного поведения.

Timur-Gadiev Автор вопроса
Николай М
В смысле как поможет? Роль упадёт с жалобой на нек...

Непонятно, почему она не сможет этого сделать, если параметры ей задает не человек руками, а другая роль.

Timur Gadiev
Непонятно, почему она не сможет этого сделать, есл...

каким образом первая роль задаёт параметры для второй? Вторая роль напрямую читает переменную, которую сформировала первая?

Timur-Gadiev Автор вопроса
Николай М
каким образом первая роль задаёт параметры для вто...

В смысле - каким образом? Делает set_fact и задает нужный набор переменных, грубо говоря. Эти переменные уже используются второй ролью как входные параметры.

Timur Gadiev
В смысле - каким образом? Делает set_fact и задает...

Т.е. вся суть спора в том, что вы передаёте переменную, а я бы записал данные в файлик. И мой подход применим в вашем случае, если заменить прямую передачу переменной (при обязательном помещении ролей поочередно в один плей) записью структуры данных в факт. Всё верно?

Timur-Gadiev Автор вопроса
Николай М
Т.е. вся суть спора в том, что вы передаёте переме...

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

Timur Gadiev
Верно. Просто в конкретных случаях запись в файл д...

Для передачи данных между ролями в ансибле есть стандартизованное место -- /etc/ansible/facts.d. В остальном -- не вижу смысла продолжать, всё уже обсудили. В целом, вы подтвердили общую применимость моих подходов :-)

Timur-Gadiev Автор вопроса
Николай М
Для передачи данных между ролями в ансибле есть ст...

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

Timur Gadiev
Это место, которое используется, как стандартный и...

Что за место такое, в котором нельзя создать вышеуказанный путь?! Даже в самом маленьком контейнере есть /etc

Timur-Gadiev Автор вопроса
Николай М
Что за место такое, в котором нельзя создать вышеу...

/etc есть, а вот запись туда кому-то кроме рута доступна далеко не всегда. И права на создание директорий тоже есть далеко не всегда. В том же контейнере файловая система может быть вообще read-only

Timur Gadiev
/etc есть, а вот запись туда кому-то кроме рута до...

Ваши паттерны использования ансибла отличаются от общепринятых (обычно всегда можно сделать become; если нельзя -- присвойте этому каталогу нужные права заранее, когда можно). А на r/o ансибл вообще нет смысла запускать, что ему там делать, если r/o.

Timur-Gadiev Автор вопроса
Николай М
Ваши паттерны использования ансибла отличаются от ...

Рутовая система r/o, пользовательская - доступна для записи. Пакер тот же, например, так работает в ряде сценариев

Николай М
Ваши паттерны использования ансибла отличаются от ...

Да нормально тут все. На любую ситуацию и пример, можно будет ответить ну это есть и вот это не надо. В целом же подход абсолютно нормальный. То, что люди творят порой лютую дичь, не означает, что это дичь для них :)

Похожие вопросы

Обсуждают сегодня

Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Подскажите, пожалуйста, где в backende, или не в нем можно дату поправить? Логирует действия не в том часовом поясе
Лео
7
Есть магистры regex в чате? Задача: нужно написать regex который мэтчит полные (без сокращений по типу ::1/128) ipv6 адреса кроме 2001:0df7:cef7:29f7:52f7:adf7:2cf7:4ff7, при ...
Илья
5
Всем привет В общем надо на странице вакансии вывести вакансии с hh, но когда я пишу код в разделе Code ошибка Invalid URL format. The URL should start with the forward slash...
A da
1
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
DataGrip не сканирует почему-то все таблицы, хотя раньше показывал их че за херня, сталкивались?
Magic
9
Это немного оффтоп, но я просто хз куда писать. Как можно решить проблему эту? У некоторых людей автовоспроизведение гифок включено, но все равно подобное вместо гифок
Anton Shvets
1
Помните я тут рассказывал про таролога программистку? Мне выдали новый мем
Magic
6
Карта сайта