Anonymous
Хотя я почти уверен что хватит уровня окружения
Anonymous
Я даже скажу грубое. Надеюсь не забанят - завязываете на локалхост - сродне одется гопой жопой на самотык
Anonymous
Вроде можно. Но практическая ценность сомнительная
𝚔𝚟𝚊𝚙𝚜
На самом деле я недавно похожую проблему решал, очень мне понравился ksonnet и qbec со своей логикой, когда есть: 1) компоненты 2) параметры 3) environments компоненты - это прототипы объектов которые нужно применить environments - это кластер кубернетиса и неймспейс куда применять компоненты параметры - это переменные которые вычисляются на основе environment и подставляются в компоненты И вот описываешь ты свое приложение таким образом, потом применяешь его в нужный кластер Захотелось реализовать что-то подобное но для ansible, при этом не сильно ломая логику самого ansible, и если с inventory всё понятно то environments и компонентами (объектами которые нужно применить) - не совсем Сначала я все объекты описывал в inventory для конкретного environment, но потом я нашел более простой путь, и вот что получилось: 1) все действия описываются в ролях (с этим всё ок) 2) в инвентори описываются окружения (environments) к примеру я имею хост staging и хост production, каждый имеет свои переменные 3) в плейбуках описываются конкретные объекты которые нужно применить (компоненты) для определенных хостов в идеале я стремился достичь простоты kubectl apply -f my-object.yaml --context stagingв результате получилось: ansible-playbook my-object.yaml -l staging
𝚔𝚟𝚊𝚙𝚜
на правильность моих действий не претендую но если комуто понятна моя боль и есть идеи как это можно улучшить, буду рад выслушать
𝚔𝚟𝚊𝚙𝚜
Получается что: в ролях - как в инвентори - куда в плейбуках - что
Anonymous
А если натурал - и кубер но подвезли ?
Vladislav 👻
Господа ребятки, юзает кто митоген? Стабильная поделка?
Поставили у себя на 2.6 - полет отличный
Anonymous
Но отдам уважение товарищу выше
Anonymous
Система. И что важно с целостным подходом
Anonymous
Есть нюанс - это изобрели давно
Anonymous
Но все равно круто
Vladislav 👻
Исключение только, если у вас кластер дева и прода и вы разделяете среды
Anonymous
В плане исключение
Anonymous
На каждый кластер делать группу
группы есть вопрос именно в конкретном плейбуке, который заточен на localhost. Это очевидно неверно, завтра я буду пробовать советы выше - как это сделать удобно для использования.
Anonymous
Это же как раз варс окружения решается
Anonymous
а может кто-то показать - как вы enviroment в inventory задаёте ?
Anonymous
Можем
Anonymous
Но завтра ))
Anonymous
👍
Vladislav 👻
Второй метод
Anonymous
Второй метод
второй метод по этой ссылке или какой-то другой ? https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html
Я и твой кот
Вопрос по доке ansible: ansible-doc -a > ansible-doc-a.txt less ansible-doc-a.txtИ там набрать &with_seq и нажать Enter. Почему так подозрительно долго ищется?
Anonymous
Эм. Причём тут ансамбл?
Я и твой кот
Ну почти про ansible.
Anonymous
В девушке есть дырочка. В мальчике есть дырочка
Anonymous
Почти про секс
Viktor
Всем доброй ночи ! Устал боротся сам прошу помощи :( есть vars file в ктотором: —- rocket_chat_mongodb_vars: - { rocket_chat_mongodb_configpath: '/etc/mongod_arbiter.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_arbiterdb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_arbiterdb.log',rocket_chat_mongodb_port: '2701'} - { rocket_chat_mongodb_configpath: '/etc/mongod_primary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_primarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_primarydb.log', rocket_chat_mongodb_port: '2702' } - { rocket_chat_mongodb_configpath: '/etc/mongod_secondary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_secondarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_secondarydb.log', rocket_chat_mongodb_port: '2703' } Потом нужно передавать переменные из списка в темплейт файл и не только. name: Deploy MongoDB systemd service configuration template: src: mongod.service.j2 dest: "{{ item.rocket_chat_mongodb_systemd }}" notify: Restart the MongoDB service loop: - "{{ rocket_chat_mongodb_vars }}" Как их оттуда достать ? :)
Я и твой кот
rocket_chat_mongodb_systemd у вас нет в переменных
Я и твой кот
--- - name: variables hosts: localhost connection: local vars: rocket_chat_mongodb_dbpath_prefix: /abc/ rocket_chat_mongodb_logpath_prefix: /def/ rocket_chat_mongodb_vars: - { rocket_chat_mongodb_configpath: '/etc/mongod_arbiter.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_arbiterdb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_arbiterdb.log',rocket_chat_mongodb_port: '2701'} - { rocket_chat_mongodb_configpath: '/etc/mongod_primary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_primarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_primarydb.log', rocket_chat_mongodb_port: '2702' } - { rocket_chat_mongodb_configpath: '/etc/mongod_secondary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_secondarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_secondarydb.log', rocket_chat_mongodb_port: '2703' } tasks: - name: show variables debug: msg: "Configpath: {{ item['rocket_chat_mongodb_configpath'] }}" loop: "{{ rocket_chat_mongodb_vars }}" ...
Я и твой кот
@vsc1t - ^^^^^^^^^^^^^^^^
Я и твой кот
Дальше сами.
Viktor
rocket_chat_mongodb_systemd у вас нет в переменных
Да, чутка не то скопировал суть та же
Я и твой кот
замените выше debug на нужный вам модуль
Я и твой кот
и вроде всё ОК должно быть
Я и твой кот
чуть поправил, а то там строки обрезались.
Я и твой кот
что значит одновременно?
Я и твой кот
луп по чему?
Viktor
Они в темплейт подставляются, луп по темплейту
Viktor
-{} - первый заход, -{} следующий и т.д.
Я и твой кот
[x@rhel7 ansible]$ cat playbook.yaml --- - name: variables hosts: localhost connection: local vars: rocket_chat_mongodb_dbpath_prefix: /abc/ rocket_chat_mongodb_logpath_prefix: /def/ rocket_chat_mongodb_vars: - { rocket_chat_mongodb_configpath: 'mongod_arbiter.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_arbiterdb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_arbiterdb.log',rocket_chat_mongodb_port: '2701'} - { rocket_chat_mongodb_configpath: 'mongod_primary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_primarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_primarydb.log', rocket_chat_mongodb_port: '2702' } - { rocket_chat_mongodb_configpath: 'mongod_secondary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_secondarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_secondarydb.log', rocket_chat_mongodb_port: '2703' } tasks: - name: show variables debug: msg: "Configpath: {{ item['rocket_chat_mongodb_configpath'] }}" loop: "{{ rocket_chat_mongodb_vars }}" - name: write template template: src: mongod.service.j2 dest: "{{ item['rocket_chat_mongodb_configpath'] }}" loop: "{{ rocket_chat_mongodb_vars }}" ... [x@rhel7 ansible]$ cat mongod.service.j2 dbpath_prefix: {{ vars['rocket_chat_mongodb_dbpath_prefix'] }} logpath_prefix: {{ vars['rocket_chat_mongodb_logpath_prefix'] }} {% for v in vars['rocket_chat_mongodb_vars'] %} {{ loop.index }} rocket_chat_mongodb_configpath: {{ v['rocket_chat_mongodb_configpath'] }} {{ loop.index }} rocket_chat_mongodb_dbpath: {{ v['rocket_chat_mongodb_dbpath'] }} {{ loop.index }} rocket_chat_mongodb_logpath: {{ v['rocket_chat_mongodb_logpath'] }} {{ loop.index }} rocket_chat_mongodb_port: {{ v['rocket_chat_mongodb_port'] }} {% endfor %} [x@rhel7 ansible]$@vsc1t
Я и твой кот
@vsc1t
Я и твой кот
Там у вас вложенность лишняя - не знаю, как обойти. Поищите.
Я и твой кот
И jinja2 парсится на вашем хосте, и только потом грузится на другой хост. Потому у вас будут лищние данные.
Я и твой кот
Покопайтесь ещё. Чем смог - тем помог.
Sergey
Всем доброй ночи ! Устал боротся сам прошу помощи :( есть vars file в ктотором: —- rocket_chat_mongodb_vars: - { rocket_chat_mongodb_configpath: '/etc/mongod_arbiter.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_arbiterdb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_arbiterdb.log',rocket_chat_mongodb_port: '2701'} - { rocket_chat_mongodb_configpath: '/etc/mongod_primary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_primarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_primarydb.log', rocket_chat_mongodb_port: '2702' } - { rocket_chat_mongodb_configpath: '/etc/mongod_secondary.conf', rocket_chat_mongodb_dbpath: '{{ rocket_chat_mongodb_dbpath_prefix }}rocket_chat_secondarydb', rocket_chat_mongodb_logpath: '{{ rocket_chat_mongodb_logpath_prefix }}rocket_chat_secondarydb.log', rocket_chat_mongodb_port: '2703' } Потом нужно передавать переменные из списка в темплейт файл и не только. name: Deploy MongoDB systemd service configuration template: src: mongod.service.j2 dest: "{{ item.rocket_chat_mongodb_systemd }}" notify: Restart the MongoDB service loop: - "{{ rocket_chat_mongodb_vars }}" Как их оттуда достать ? :)
#странное
Sergey
1. Используй pastebin, пожалуйста. 2. systemd умеет в template 3. {} и [] "обходить" не нужно: достаточно понимать, что это такое. {} - mapping/dict/словарь, доступ по ключу ("то, что слева от двоеточия" ) Например, есть такой словарь: key1: {key2: {key5: val1 }} Как получить val1? Вот так: key1['key2']['key5'] [] - sequence/list/список, доступ по номеру, т.е. дописываем номер элемента в квадратных скобках (нумерация с нуля) Например, есть такой словарь: key1: {key2: [val1, val2, val3]} Как получить val1? Вот так: key1['key2'][2]
Viktor
@tnt4brain , @paper_planes_squad Спасибо огромное! Продолжу попытки через пару часов :)
Viktor
Сергей, а можно перебрать все элементы не зная их количество? Сейчас 3 переменных, потом я допишу ещё 2 в Варс и мне нужно будет открывать плейбук, искать где применяется и добавлять [3], [4] Что-то типо [*] или [0]..[len-1] есть? 🥴
Я и твой кот
Но есть ещё вариант, но сходу не помню.
Vladislav 👻
Этот метод решает и вторую проблему, с монгой в рокет-чате...
Vladislav 👻
Никогда не понимал, почему все начинают писать через vars файлы и городить ужас, потом же просто ужас будет контролить это все...
Viktor
Этот метод решает и вторую проблему, с монгой в рокет-чате...
А можно для невыспавшихсч прямо указать что почитать по ссылке, а то так не понятно :(
Vladislav 👻
Альтернативная структура проекта
Vladislav 👻
Все раскидываем по енвайрменту и хорошо становится
Vladislav 👻
Наверно плохо выразился, решает косвенную проблему, чтобы не было ужаса в плейбуке
George
вообще идея со средами (а как еще назвать это?) - она блестящая
George
и она не ансибл-специфична
Vladislav 👻
Самое вкусное, это объединение энвайрментов, просто при запуске перечисляем и оно само из коробки, даже одинаковые группы сджойнит
Vladislav 👻
и она не ансибл-специфична
Но в ансибле специфична логика работы
George
эт да
Viktor
loop в jinja2
Спасибо, попробую
Viktor
Добрый день. В .bashrc указана переменная (например, PROJECT_DIR=/Users/user/work). Как ее вытащить в плейбуку, чтобы можно было делать манипуляции в этой папке? Копировать в нее файлы, клонировать проект с гитхаба, использовать в конфигах nginx?
George
имеется в виду получить в плейбуке как переменную
George
чтоб потом можно было использовать путь к каталогу
George
мне очень странно, что мне это очевидно, а Вам нет, @tgadiev
Viktor
да, имеено так, как написал @gecube :)
George
мне лично видится ботвень с register )))) это как пока черновой вариант. Либо вычитать .bashrc, либо распечатать env, а потом грепнуть переменную
George
застрипать левую часть, оставить правую (после "=")
George
ну и дальше дело техники
George
потом можно отрефакторить и сделать красивее. наверняка ансибл умеет брать переменные из переменных окружения
George
типа ansible_vars[environment][PROJECT_DIR]