Мой веб-сайт организации - это приложение Django, работающее на веб-серверах front end + несколько серверов обработки фоновых изображений в AWS.
В настоящее время мы используем Ansible для обоих:
- Конфигурация системы (из голого образа ОС)
- частое развертывание кода с ручным запуском.
Такая же Ansible playbook может предоставить либо локальную Vagrant dev VM, либо экземпляр EC2 производства с нуля.
Теперь мы хотим реализовать автомасштабирование в EC2, и для этого требуются некоторые изменения в отношении лечения серверов как крупного рогатого скота, а не домашних животных./p >
Первым обязательным условием было перейти от статически управляемого Ansible инвентаря к динамическому, основанному на EC2 интерфейсу.
Следующий большой вопрос - как развернуть в этом новом мире, где промежуточные экземпляры появляются вверх и вниз посреди ночи. Возможные варианты:
- Выпекать новый полностью развернутый AMI для каждого развертывания, создать новую конфигурацию AS Launch и обновить группу AS с этим. Звучит очень, очень громоздко, но также очень надежно из-за подхода чистого сланца и гарантирует, что любая система изменит требуемый код. Кроме того, никаких дополнительных шагов, необходимых для загрузки экземпляра, не запускается и не выполняется быстрее.
- Использовать базовый AMI, который не изменяется очень часто, автоматически получает последний код приложения из git при загрузке, запускает веб-сервер. Как только это произойдет, просто ручное развертывание по мере необходимости, как и раньше. Но что, если новый код зависит от изменения конфигурации системы (новый пакет, разрешения и т.д.)? Похоже, вам нужно начинать заботиться о зависимостях между версиями кода и версиями системы /AMI, тогда как подход "просто сделать полный контроль" более интегрирован и более надежным. Это больше, чем просто потенциальная головная боль на практике?
- Использовать Docker? У меня есть сильная догадка, что это может быть полезно, но я еще не уверен, как это будет соответствовать нашей картине. Мы являемся относительно автономным интерфейсным интерфейсом Django с помощью только RabbitMQ + memcache в качестве сервисов, которые мы никогда не будем запускать на том же хосте в любом случае. Итак, какие преимущества существуют при создании образа Docker с использованием Ansible, который содержит системные пакеты + последний код, а не как Ansible, просто делать это непосредственно на экземпляре EC2?
Как вы это делаете? Любые идеи/лучшие практики? Спасибо!