
Мне нужна помощь с развертыванием системы, над которой я работаю уже полтора года. Чтобы вы поняли мою обеспокоенность, я немного расскажу о нашей инфраструктуре.
У нас есть сервер (назовем его TESTING_SERVER), на котором у нас есть различные среды тестирования для нашей системы. Каждая из этих сред работает полностью с docker. Каждый экземпляр среды тестирования состоит из: 1. Контейнера Docker с nginx, выступающим в качестве прокси 2. Контейнера Docker с веб-сайтом Django 3. Контейнера Docker с mysql
Каждый раз, когда нам необходимо создать новую среду для целей тестирования (например, QA хочет протестировать новую функцию), мы используем ansible playbook, который запускает следующие задачи на TESTING_SERVER:
- Создать сеть докеров
- Создать контейнер базы данных
- Клонируйте или обновите git-репозиторий django где-нибудь в TESTING_SERVER
- Создать контейнер django
- Запустите команду django collectstatic внутри контейнера django
- Запустите команду django migrate внутри контейнера django
- Создать контейнер nginx
В нашей производственной среде у нас есть простой сервер ubuntu (PRODUCTION_SERVER), на котором запущены mysql, django и nginx. Каждый раз, когда нам нужно развернуться в производстве, мы запускаем ansible playbook, который (почти) повторяет шаги, перечисленные выше:
- проверьте соединение с mysql (база данных находится на другом сервере)
- Клонируйте или обновите git-репозиторий django где-нибудь на PRODUCTION_SERVER
- Проверьте и перезапустите gunicorn (это эквивалентно созданию контейнера django)
- запустить django collectstatic
- запустить django migrate
- проверьте конфигурацию nginx
Эти два плейбука отличаются, хотя у них много общего. Я думал преобразовать каждый шаг в задачу ansible и использовать условие, чтобы знать, какие задачи (dockerized или direct) должны быть запущены. Но у меня все равно будут разные задачи для каждого шага (та же самая книга, но кажется немного сложной).
У меня такой вопрос: есть ли способ «объединить» эти книги так, чтобы получилась одна, не повторяясь?
решение1
Я бы создал роль для каждой «задачи» и использовал ее в руководстве, подобно тому, как описано в документе с передовой практикой.
http://docs.ansible.com/ansible/latest/playbooks_best_practices.html#directory-layout
например
roles/
create_a_docker_network/
tasks/
main.yml
create_database_container/...
...
Create_nginx_container/
и в пьесе назовите роли
тестирование.yml
- hosts: testserver
roles:
- create_a_docker_network
- create_database_container
- ...