Год назад у нас в компании еще никто специально не занимался серверами и их конфигурацией.
Был целый спектр проблем, обычных для такого случая:
* ручная выкатка новых версий на продакшн занимала несколько часов;
* большая часть времени программистов уходила на настройку своих окружений разработки и синхронизацию их между собой;
* везде на тестовых серверах стояли неизвестно какие версии, и из-за этого куча времени уходила на баги, которые могли быть уже исправлены несколько дней назад;
* неправильная конфигурация каких-то компонентов приложения приводила к неработоспособности приложения целиком.
Чтобы исправить положение мы сделали следующее:
* завернули всю конфигурацию в Chef;
* для управления конфигами приложений начали использовать augeas (у нас большие и часто меняющиеся конфиги;
* теперь ежедневно автоматически собирается образ сервера со всеми установленными и настроенными приложениями последней версии, из которого разработчики при помощи Vagrant могут создавать себе сервера по мере необходимости, не отвлекаясь на установку, обновление и настройку;
* Ежедневно Jenkins из того же образа Vagrant-ом поднимает сервера и прогоняет на них тесты.
Теперь наши разработчики спокойно спят ночами, вместо того, чтобы спешно фиксить баги.
Процесс разработки стал более предсказуемым. Скорость исправления багов возросла. Все счастливы.
4. Ситуация год назад
• Инфраструктурой еще
никто не занимается
• Более 10 сильносвязанных
компонентов приложения
• Много конфигов
• Тесты зависят от данных
5. Проблемы
• Долгий деплой
• Сложность конфигурации
• Создание окружений
• Синхронизация тестовых
окружений
• Воспроизводимость
14. Плюсы Augeas
• Всеми конфигами
управляем единообразно
• Поддерживает почти все
форматы конфигов
• Строгий — встроенная
валидация синтаксиса
• Можно расширять
15. Минусы Augeas
• Расширять сложно
• Плохо работает с
нестрогими форматами
• Форматов обычно мало —
теряет смысл
17. Образ сервера
• Jenkins ежедневно
собирает AMI при
помощи Packer
• Публикует Vagrant box в
нашем репозитории
Vagrant
18. Vagrant box
• Packer создает его, если
указан постпроцессор
• Кладем файл .box на
локальный HTTP
• Обновляем JSON с
информацией о версиях
19. Vagrant box
$
cat
~/.vagrant.d/boxes/cinarra-‐VAGRANTSLASH-‐baseami-‐
daily-‐1.2/1.0.174/aws/Vagrantfile
Vagrant.configure("2")
do
|config|
config.vm.provider
"aws"
do
|aws|
aws.region_config
"eu-‐west-‐1",
ami:
"ami-‐fb384f8c"
end
end
23. Разработчику
#
Делается
один
раз
при
добавлении
box-‐а
export
VAGRANT_SERVER_URL="http://www.example.com/boxes"
vagrant
box
add
orgname/baseami
#
Перед
работой
каждый
день
vagrant
box
update
vagrant
up
#
После
работы
vagrant
destroy
32. Центральная сборка
• Задает дополнительные
параметры
• Checkout всех git repo
• Запускает сборки с
нужными параметрами
• Достает и публикует
тесты и артефакты