Aleksandr
Вот и выше тут, вместо того чтобы взять готовое городит своё
Vladimir
так проверка прошла так - validate: 'nginx -c %s -t'
Sebor▂▅▇█▓▒░
Если из них тебе надо поменять не много от дефолта то по мне слишком и хотелось бы легкой версии
ну когда делают для "паблика", то делают максимально универсальное отсюда и приходится выносить много параметров про городить свое - надо просто баланс соблюдать, не кидаться из крайности в крайность
George
так проверка прошла так - validate: 'nginx -c %s -t'
Я бы не переоценивал эту проверку
George
https://trac.nginx.org/nginx/ticket/1300
George
Ну, ок 🤷‍♂
Sebor▂▅▇█▓▒░
+
Артём
А чем validate лучше, чем обычный nginx -s reload?
niko
релоад при сломанном конфиге возвращает сакцесс
niko
а рестарт возвращает выключенный нжинкс)
George
Я им в багтрекер писал и сильно матюгался на это вот все
Александр
Есть задача выкладывать конфиги на сервер из files/config. Содержимое этой директории - субдиректории с шаблонами. Накидал такой вот код (если можно так выразится) - name: deploy configuration directories file: path: "/data/config/{{ item.path }}" mode: "{{ item.mode }}" state: directory loop: "{{ lookup('filetree', 'files/config', wantlist=True) | json_query('[?state == `directory`]') | list }}" loop_control: label: "/data/config/{{ item.path }}" tags: deploy_conf - name: deploy configuration files (>>>> you must manually restart the necessary services <<<<) template: src: "{{ item.src }}" dest: "/data/config/{{ item.path }}" mode: "{{ item.mode }}" loop: "{{ lookup('filetree', 'files/config', wantlist=True) | json_query('[?state != `directory`]') | list }}" loop_control: label: "/data/config/{{ item.path }}" tags: deploy_conf В принципе всё работает, за исключением небольшой неприятной тонкости. На целевом хосте работает docker. Один из путей прописан в контейнере как volume. Примерно так /data/config/nginx/conf.d/nginx.conf:/etc/nginx/conf.d/nginx.conf:ro и если вдруг, так получилось, что контейнер выкатили раньше конфигов. Путь /data/config/nginx/conf.d/nginx.conf создаётся как директория, и template (таск deploy configuration files...) выкладывает конфиг уже по адресу /data/config/nginx/conf.d/nginx.conf/nginx.conf
Александр
есть способ сказать модулю template (или copy). Перезатри мне эту папку?
Александр
может вы предложите какие-то свои оптимальные методы выкладывания конфигурации на целевые хосты?
Aleksey
докеру не надо пробрасывать файл
Антон
Ты всегда можешь добавить таск, в котором чистишь эту директорию)
Aleksey
пробрасывайте диреткорию
Александр
конечно я могу добавить сюда ещё один или пару тасков, для удаления директории если она существует, но хотелось бы найти более оригинальный подход
Александр
пробрасывайте диреткорию
это мне не подходит
Aleksey
тогда попробуйте unsafe_writes
Aleksey
а
Александр
unsafe_writes - я читал про это в документации, но если честно ничего не понял(
Aleksey
я не дочитал
Aleksey
это вы еще не столкнулись с реальной проблемой
Aleksey
то что вам создаётся диреткорией это ерунда
Aleksey
у вас основная беда будет в том что у вас при обновлении конфигурации докер ёё не подхватит
Aleksey
ибо монтируете файл а это известный антипаттерн
Антон
Всё равно после обновления nginx.conf придётся ребутать nginx
Aleksey
не nginx а контейнер
Aleksey
что бы вольюмы востановились
Александр
можно просто сказать pkill -1 nginx но это уже отдельная тема
Антон
не nginx а контейнер
Я думаю, что он в курсе)
Александр
да
Aleksey
ну ок. хозяин барин
Александр
это работает во многих плейбуках в нашей компании. Но это сделает reload nginx'а во всех контейнерах на хосте
Aleksey
🤷‍♂️ ну ок
Александр
а! стоп!
Александр
перечитал... вы имеете виду, что в контейнере не будет изменений в файле, пока я его не рестартану?
Aleksey
да
Александр
честно говоря я всегда использую монтирование директорий, но в данном случае, контейнер не мой... тогда мне придётся, тащить в ансибл все содержимое /etc/nginx/conf.d/ из контейнера
Александр
что не хотелось бы ((
Антон
nginx без перезагрузки файл не перечитает, а в контейнере он будет доступен изменённый
Aleksey
Что-то мне подсказывает, что mount не так работает
стоит не опираться на интуицию и прочитать документацию
Aleksey
вот этот вариант я подсуну только nginx.conf 100500 раз проходили
Aleksey
https://docs.docker.com/storage/bind-mounts/#mount-into-a-non-empty-directory-on-the-container
Aleksey
этот пример с nginx расмотрен в доке :)
Aleksey
ну и ниже про bind propogation
Александр
когда-то оооочень давно, мы использовали для этих целей svn, но потом решили, что конфиги должны быть в ансибл и что по флагам -CD он обязательно должен показывать изменения. Кроме того, как я уже сказал, в ансибле лежат шаблоны
Александр
ну у нас тоже все роли и плейбуки в гите. Но обновлять конфигурацию на серверах из гита, при этом использовать шаблоны (к примеру, с персонализацией для хоста или ЦОДа) - это что-то на грани фантастики, про велосипеды на костылях по граблям...
Igor
Только осваиваю ansible. Кто нибудь может подсказать по роли которая будет устанавливать openvpn клиент на Ubuntu xenial и генерировать для него файл конфигурации на основании переменных хоста ansible. Результатом выполнения плейбука, запускающего роль, должен быть настроенный и запущенный опенвпн клиент.
Igor
Что за L/P можете пояснить?
Sebor▂▅▇█▓▒░
Igor
Готовое на гитхабе нашёл но чета с разбега не понял.
George
как тут интересно вчера было
Oleg Y.
господа, у меня странный вопрос. Есть inventory серверов, которые разбиты на много групп вида: -- inventory/group1/hosts [app] 10.116.6.66 10.116.6.67 -- inventory/group2/hosts [app] 10.116.7.66 10.116.7.67 ... etc Запускается плейбук на группу хостов. Плейбук вида: - hosts: app roles: - whatever1 - whatever2 Я решаю задачу сделать общий кластер из серверов, входящих во все группы. На первом уровне наивности, когда группа была одна, в template работала конструкция: members: {{ ansible_play_hosts_all | join(',') }} Сейчас по очевидным причинам она не подходит, т.к. групп стало много. Вопрос. какие практики организации inventory вы могли бы порекомендовать?
George
не писать плейбуки на 1000-и хостов? ну, вообще я просто фильтровал хосты из конкретной группы
George
"{{ groups['project-a'] | map('extract', hostvars, ['ansible_host']) | map('regex_replace', '$', ':9100') | list }}" <- причем я такое в переменных писал, а не в плейбуке
Артём
Вопрос больше про jinja2, чем про ansible, но рискну. Если я хочу получить строку MY_VARIABLE = {a},{b} где a и b - переменные, как заэскейпить это? MY_VARIABLE = { {{a}},{{b}} } Где внешние curly braces нужны нетронутыми.
George
я вопроса не понял
George
дай пример входа и пример выхода
Timur
И зря. У nginx родная роль вполне годная. И протестированная на реальном проде, в отличие от
Andrey
https://github.com/nginxinc/ansible-role-nginx
Timur
ansible-galaxy install robertdebock.openvpn
Отделение Bereke Bank
Какой ужас https://github.com/robertdebock/ansible-role-openvpn/blob/master/tasks/main.yml#L21
Timur
Какой ужас https://github.com/robertdebock/ansible-role-openvpn/blob/master/tasks/main.yml#L21
Там идемпотентность обеспечена, тем не менее. Плюс, это серверная часть. Если тебе нужен только клиент, эта часть кода не задействована
Артём
дай пример входа и пример выхода
Вход: var1 = 'a' MY_VAR={"{{var1}}"} Даёт выход MY_VAR={"a"} Хочу избавиться от кавычек в итоговом варианте.
George
ну так грохни кавычки посередине
George
{"{{"var1"}}"}
George
ты наверное так хочешь?
Артём
Хочу, что бы в итоге в файле было MY_VAR={a}
George
просто для меня это странно, т.к. я обычно джинджу двойными оборачиваю )))) и я не спец по ансиблу