Pet-проект. VirtualBox, Ansible, Swarm
Вот и первый пост с вменяемым результатом.
Неделя началась с идеи пет-проекта для портфолио, который покажет освоенные технологии в DevOps.
## Идея
DevOps и IaC богаты инструментами для автоматизации и масштабирования - начал с малого:
1) Поднять N debian серверов через VirtualBox и ускорить процесс. 2) Поделить 3 сервера на 2 воркера и 1 мастер. 3) Через Ansible настроить сервера и разделить на группы. 4) Ручной деплой nginx через балансировщик, показывающий ip сервера. 5) Подтянуть приложение с 3 сервисами: приложение, БД и кеш.
Список пока заканчивается - не хочу перегружать себя кучей инструментов аля "Здесь нужен кубер, да побольше!" - потом.
Сейчас минимально рабочий проект, который будет радовать глаз и тешить эго, что не отстаю от вайбкодерского кластера. Вайбкод крут, но тему знать надо. Лучше сломать прод из-за своей неопытности, чем не досмотреть за ИИ-агентом:
- по шапке дали? - дали - понял, в чем дело и как избежать? - хезе, это ИИ напартачил, сменю ему режим доверенности.
Но не об этом.
## Ход работы
### Установка debian на VM
При запуске VirtualBox сразу ясно - без debian образа не обойтись) Скипая установку, я понял: Это. Очень. Долго. И боже упаси перепутать Enter и Space при выборе между GNOME и SSH-сервером - дальше принудительно завершишь машину и начнешь заново - не вайб 🤙
Как ускорить и избежать ошибок? - автоматизировать. Проект начался там, где не планировал - на установке образов, но этого требовала ситуация и моя хроническая лень.
После 5 минут гуглежа узнал: preseed.cfg - текстовый файл, автоматизирующий установку ОС, заранее давая ответы установщику.
Побежал искать шаблоны - не нашёл. Придётся вайбкодить. Запрашиваю у бесплатного deepseek баш скрипт и шаблон "preseed.template.cfg". Скрипт запрашивает креды root и нового пользователя, создаёт конфиг и открывает веб-сервер через модуль "http.server" у питона. Копирую строку -> вставляю в скрипт установки и вуаля! - пошло-поехало.
### Установка и внедрение Ansible
Ansible — инструмент для автоматизации рутины при управлении серверами, настройке инфраструктуры и развёртывании приложений. Позволяет единообразно настраивать множество машин одновременно, избегая ручных команд.
Для одновременной настройки серверов взял проверенный инструмент - Ansible. Опыт был, но подзабылось. Попросил ИИ нагенерировать шпаргалку по командам и архитектуре.
Начал с базы - архитектура проекта, папки, "ansible.cfg", "inventory" (данные серверов и группы).
Дальше по плану: 1) Плейбук "01-update.yml" - "apt update && apt upgrade -y". 2) Плейбук "02-common.yml" и роль common - базовые пакеты. 3) Плейбук "03-docker.yml" и роль docker - GPG ключ, репозиторий, установка. 4) Плейбук "04-swarm.yml" и роль swarm - установка swarm, токен для воркеров, соединение.
Подводные камни: - Deprecation warning - не крит, но неприятно. - Не учел пару пакетов для питона. - Ansible в WSL2 не мог достучаться до серверов в гипервизоре.
С первыми двумя ясно, с третьим пришлось повозиться. VirtualBox дает обширные настройки адаптеров. Посчитав себя гением сетей, выбрал NAT для всех машин. Статический ip, перенаправление портов — дело не трудное, но порты нужно слушать на хосте так, чтобы видела WSL - тут-то проблема. Перематывая час проб и ошибок, принял волевое решение - перейти на Bridge. Да, сдался, и да выглядит не красиво. Но работает как часы - WSL видит машины под 192.168.0.X, Ansible - пинг-понг-ОК, даже в клиентах роутера появились 3 машины, что открывает дорогу в интернет - пригодится. И статические ip выставить проще.
## Заключение
Что имеем: - Автогенерация "preseed.cfg" для установки Debian. - 3 debian сервера: 1 мастер, 2 рабочих. - 4 плейбука и 3 роли - руками ничего не делаем. - 3 одинаково подготовленных сервера с одинаковым набором пакетов. - Docker Swarm установлен, 2 воркера слушают мастера.
Дальше в планах разобраться с самим Docker Swarm - установка и использование разные вещи. Накачу тестовый сервис с балансировщиком и буду любоваться.
Параллельно изучается Python - судя по обучалке, я на последнем модуле. Прогресс идёт - понимание растёт.