Как я автоматизировал деплой с помощью Ansible
До недавнего времени деплой у нас выглядел так: заходишь по SSH на сервер,
делаешь git pull, перезапускаешь сервис через systemd. Работало,
но каждый раз руками и с шансом ошибиться в мелочи.
Решил перевести это на Ansible. Ниже — что получилось и какие грабли собрал.
Структура
Сделал минимальный набор:
inventory.ini— список хостов.deploy.yml— основной плейбук.roles/app/— роль приложения.
Плейбук
Сам плейбук получился коротким:
- hosts: app
become: yes
roles:
- app
Вся логика уехала в роль. Там — установка зависимостей, клонирование
репозитория, сборка, миграции и перезапуск сервиса через
systemd.
Что оказалось неочевидным
- Хендлеры в Ansible выполняются один раз в конце — если не сделать
flush_handlers, миграции и рестарт могут поменяться местами. - Для секретов лучше сразу использовать
ansible-vault, а не хранить токены в открытом виде. - Идемпотентность важна: первый запуск может быть «зелёным», а второй — внезапно что-то менять.
Результат
Деплой теперь занимает 40 секунд и запускается одной командой. Руками на сервер я больше не хожу. Если интересно — могу выложить пример роли на GitHub.