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

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

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

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

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

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

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

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

Связанный контент