Fire
Все плейбуки в одном репозитории.
Fire
Ибо они тривиальны и просто проигрывают роли.
George
Всем привет. Взялся за переписывание ролей и плейбуков с кошмарами на баше, думаю над тем, как хранить роли и плейбуки, . Кто как это делает? Мне видятся варианты с монорепой и сабмодулями, но почему-то оба кажутся гемором, с той или иной точки зрения.
Сабмодули зло. Пока что у нас сложилась такая практика: монорепа на проект, но если есть общий код между проектами, то он вендорится используя git-vendor (отдельная утилита). Вся механика galaxy находится в детском возрасте и для продакшена не годится (там даже update нету).
George
Я очень советую посмотреть git-vendor. Он немного необычный, но очень разумный.
checkdiff
А собирать их вместе руками?
Мы через galaxy собираем. Плейбук и инвентарь в отдельном репозитории отвечает за одно окружение. Внутри может быть много плейбуков с плеями.
Vladimir
Используем gilt https://gilt.readthedocs.io/en/latest/ Пока довольны)
Alex
А что не так с сабмодулями?
Vladimir
А что не так с сабмодулями?
Не тянут обновления как вариант
Alex
Не тянут обновления как вариант
в каком смысле не тянут?
Fire
Вы не умеете работать с сабмодулями?
fs
привет всем, кто может вкратце сказать что такое play в ansible, ато чет документация мне не доходит...
fs
ок спс
Gleb
Вы не умеете работать с сабмодулями?
Рано или поздно кто-то что то не закоммитит или закоммитпт не то
Fire
Рано или поздно кто-то что то не закоммитит или закоммитпт не то
Это при любой конфигурации возможно. Для такого есть политики коммитинга.
George
Вы не умеете работать с сабмодулями?
Я не умею. Как submodule работает знаю, а как сделать так, чтобы можно было комфортно работать, а не заниматься defensive programming, не знаю.
Отделение Bereke Bank
Ну и всякие варнинги когда гений разработчик нахуярил зависимостей в свою роль, а ты хочешь одну из этих зависимостей другой версии
George
А можно уточнить про недостатки galaxy? Что неудобно, какие кейсы не решает.
ansible-galaxy collection update: ansible-galaxy collection: error: argument COLLECTION_ACTION: invalid choice: 'update' (choose from 'init', 'build', 'publish', 'install')Единственный метод что-то обновить - стереть и скачать заново. При этом процесс "стёр/скачал" полностью ручной и никаким образом не менеджится. Если со старой копии файл пролезет, об это никто не узнает. Аудита нет, reinstall нет, update нет, управления установленными коллекциями нет, lock-файла нет.
Gleb
так если оно в ci делается смысл вообще стейт хранить?
Gleb
даже стирать не надо
k
А, понял Я в контейнере ансибл запускаю, там изначально пусто и force не нужен Каждый раз качаются роли фиксированных версий и это кешируется до изменения requirements-файла Ну а локально типа make roles_refresh хватает когда разрабатываю
k
Спасибо
Anonymous
Кто-нибудь знает, почему task: - name: Accept 1234 port connections iptables: chain=INPUT protocol=tcp match=tcp destination_port=1234 match=state ctstate=NEW jump=ACCEPT делает из правила: -A INPUT -p tcp -m tcp --dport 1234 -m state --state NEW -j ACCEPT вот такую кашу: -A INPUT -p tcp -m state --state NEW -m tcp --dport 1234 -j ACCEPT ?
Full
Вероятно, потому, что всем плевать на порядок аргументов, кроме тебя. В смысле, это архитектурно так. ЕМНИП тут недавно один amarao упоминал, что ансибл предпринимает отдельные усилия, чтоб порядок выдержать, но это относилось не к аргументам а к спискам значений.
Vladislav 👻
Народ, подскажите, что-то запутался и кажется начинаю лепить горбатого. Есть центос и оракл и базовая роль по установке пакетов. Надо разный список пакетов ставить, в зависимости от ОС. И тут я завис, где и как ставить условие
inqfen
И передавать нужный в зависимости от os
Vladislav 👻
Это я понимаю, не могу понять, где правильнее сделать проверку? Наверно просто сделать два таска и в одном проверка на одну ОС, а в другом - другую?
Vladislav 👻
Или инклуд файла таски в зависимости от семейства ОС?
Lamobot
Или инклуд файла таски в зависимости от семейства ОС?
инклюд переменных в зависимости от ОС
Lamobot
Ну или тасок, если что-то более сложное нужно
Vladislav 👻
А переменных, это через vars папку в роли?
inqfen
- name: install packages yum: name: "{{ list1 if os1 else list2 }}" state: latest Попробуй что-то типа того
inqfen
Если у тебя разница только в 1 таске
inqfen
по итогу вычисления jinja выражения у тебя останется 1 конкретный лист
Lamobot
А переменных, это через vars папку в роли?
Вот примеры есть в ролях админов канала: https://github.com/lean-delivery/ansible-role-java/blob/master/tasks/main.yml
inqfen
Кстати да, include_vars будет более явно
inqfen
И менее магически
Lamobot
- name: install packages yum: name: "{{ list1 if os1 else list2 }}" state: latest Попробуй что-то типа того
А если нужно будет добавить ещё ОС? Или на новой версии этой же ос будут другие пакеты нужны? У тебя получится пачка when с тасками
Alex
Так и не услышал ни одного недостатка сабмодулей
Balagur
а как под awx обновить сабмодули?
Gleb
Так и не услышал ни одного недостатка сабмодулей
это проще на себе испытать, дольше пары лет на моей памяти никто не продержался
fs
и так, я так понял по этой статье что play все что идет после - hosts ?
fs
ато как то все размыто
Rostislav (aka RosT)
Доброго, vars: ports: - 80 - 443 ips: - 10.0.0.1 - 10.0.0.2 - 10.0.0.3 Как списки скомбинировать так, чтобы в итоге получилось ... with_items: - { ip: 10.0.0.1, port: 80} - { ip: 10.0.0.1, port: 443} - { ip: 10.0.0.2, port: 80} - { ip: 10.0.0.2, port: 443} - { ip: 10.0.0.3, port: 80} - { ip: 10.0.0.3, port: 443}
George
так если оно в ci делается смысл вообще стейт хранить?
А локальная разработка? Вариант "всегда в CI" снижает продуктивность ровно на время push/начала джобы на CI. Обычно over 30s, что на практике уничтожает quick loop.
George
Если у тебя при этом каждый раз install для зависимостей, ты снижаешь производительность. Если чёрти-что, то и на выходе чёрти-что.
Alex
это проще на себе испытать, дольше пары лет на моей памяти никто не продержался
я юзал на одном проекте - проблем не было. Вы не любите кошек? Вы просто не умеете их готовить
Gleb
я юзал на одном проекте - проблем не было. Вы не любите кошек? Вы просто не умеете их готовить
один что ли? так это не интересно, вот будет человека 3-5 и больше вот где веселье начнется
Gleb
один вообще можешь любую дичь делать
Rostislav (aka RosT)
Доброго, vars: ports: - 80 - 443 ips: - 10.0.0.1 - 10.0.0.2 - 10.0.0.3 Как списки скомбинировать так, чтобы в итоге получилось ... with_items: - { ip: 10.0.0.1, port: 80} - { ip: 10.0.0.1, port: 443} - { ip: 10.0.0.2, port: 80} - { ip: 10.0.0.2, port: 443} - { ip: 10.0.0.3, port: 80} - { ip: 10.0.0.3, port: 443}
В итоге сообразил как со списком списков работать: ``` wait_for: host: "{{ item[0] }}" port: "{{ item[1] }}" state: started delay: 0 timeout: 3 ignore_errors: yes with_cartesian: - "{{dest_ips}}" - "{{dest_ports}}" ``` @Lamobot @amarao @vkhramov спасибо за помощь
Я и твой кот
Тут loop & lookup не любят? :)
Rostislav (aka RosT)
Дичь. Оркестратор на Ансибле.
😂 Дичь - да, оркестратор - нет. Наверное.. Просто чекалка портов
George
Дичь. Оркестратор на Ансибле.
Catesian - это ещё вполне уровень ansible'а. Сделать matrix из пары массивов это вполне себе адекватный код.
Rostislav (aka RosT)
Какую задачу решаешь?
Ну я не думаю, что это в рамках конфы.. Но если кратко, то есть кластера k8s по разным подсетям их ноды, + отдельные подсети порты сторонних сервисов. Всё жестко зарезано СБ по сети. Собственно надо уметь оперативно проверять, что сетевая связность не исчезла
George
- name: Check if node can reach other nodes over public net hosts: osds,mons,mgrs gather_facts: true gather_subset: network tasks: - name: check if public network is ok assert: that: - public_network is defined - ansible_all_ipv4_addresses|ipaddr(public_network)|length > 0 - name: Ping neighbor command: ping -c 1 {{ neighbor_ip }} -w 1 changed_when: false vars: neighbor_ip: '{{ (hostvars[item].ansible_all_ipv4_addresses|ipaddr(public_network))[0] }}' with_items: '{{ groups.osds + groups.mons + groups.mgrs }}'
kevit
Не понимаю чего вы взъелись, аудит ансиблом отличная тема
George
Не аудит, а "тесты". Главная проблема тестов в ансибле - они очень мало говорят о том, что именно сломалось. Плюс, они не дают все сообщения, а ломаются на первом попавшемся.
kevit
Ассерты?
George
Тесты пишут на языках программирования, а ансибл плох для языков программирования. Да, иногда проще на Ансибле, но testinfra лучше.