Назад | Перейти на главную страницу

Использование ansible для развертывания dockerized тестовой среды и простого ubuntu для производства

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

У нас есть сервер (назовем его TESTING_SERVER), где у нас есть разные среды тестирования для нашей системы. Каждая из этих сред полностью работает с докером. Каждый экземпляр тестовой среды состоит из: 1. Контейнера Docker с nginx в качестве прокси 2. Контейнера Docker с веб-сайтом Django 3. Контейнера Docker с mysql

Каждый раз, когда нам нужно создать новую среду для целей тестирования (например, QA хочет протестировать новую функцию), мы используем доступный playbook, который запускает эти задачи на TESTING_SERVER:

  1. Создать докер-сеть
  2. Создать контейнер базы данных
  3. Клонировать или обновлять репозиторий django git где-нибудь на TESTING_SERVER
  4. Создать контейнер django
  5. Запустить команду django collectstatic внутри контейнера django
  6. Запустите команду django migrate внутри контейнера django
  7. Создать контейнер nginx

В нашей производственной среде у нас есть простой сервер ubuntu (PRODUCTION_SERVER), на котором запущены mysql, django и nginx. Каждый раз, когда нам нужно выполнить развертывание в производственной среде, мы запускаем доступный playbook, который (почти) повторяет шаги, перечисленные выше:

  1. проверьте соединение mysql (db находится на другом сервере)
  2. Клонировать или обновлять репозиторий django git где-нибудь в PRODUCTION_SERVER
  3. Проверьте и перезапустите gunicorn (эквивалентно созданию контейнера django)
  4. запустить django collectstatic
  5. запустить django migrate
  6. проверьте конфигурацию nginx

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

Мой вопрос: есть ли способ «объединить» эти пьесы, чтобы получить только одну, не повторяя себя?

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

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/

и в пьесе назовите роли

testing.yml

- hosts: testserver
  roles:
    - create_a_docker_network
    - create_database_container
    - ...