Цель работы: Автоматизировать развертывание веб-приложения "Todo app" и его базы данных MySQL на двух отдельных виртуальных машинах с использованием Ansible. Обеспечить безопасность хранения учетных данных и корректную настройку сети и файрвола.
Используемые инструменты:
- VirtualBox (или аналогичная система виртуализации)
- Ubuntu Server 20.04 LTS (для ВМ)
- Ansible
- Docker
- MySQL (в Docker-контейнере)
- Todo-app (образ
antonaleks/101-todo-appв Docker-контейнере) - Ansible Vault
Конфигурация виртуальных машин:
- Управляющий хост Ansible: Linux A (
192.168.1.4, пользовательsasha) - Хост приложения (Todo-app): Linux B (
192.168.1.6, пользовательsasha), далееclientв Ansible. - Хост базы данных (MySQL): Linux C (
192.168.1.5, пользовательsasha), далееserverв Ansible.
-
Создание структуры проекта: Проект Ansible был организован с использованием ролей (
mysql,todo) для лучшей структуризации задач. Создан файл инвентаря (inventory.ini), основной плейбук (playbook.yml) и файл для хранения зашифрованных учетных данных (vault.yml). -
Настройка инвентаря (
inventory.ini): Хосты были разделены на группы[app]и[db]с указанием IP-адресов и пользователей для подключения Ansible.# Содержимое inventory.ini [app] client ansible_host=192.168.1.6 ansible_user=sasha [db] server ansible_host=192.168.1.5 ansible_user=sasha
-
Использование Ansible Vault (
vault.yml): Для безопасного хранения паролей (для MySQL root и пользователя БД приложения) был создан и зашифрован файлvault.yml. Пароли в плейбуках и ролях были заменены на переменные из этого файла (например,{{ mysql_root_password }}). Файлvault.yml(зашифрованный) находится в корне проекта. -
Настройка целевых хостов (Linux B, Linux C):
- Настроен SSH-доступ по ключам с управляющего хоста (Linux A) на целевые хосты.
- Для пользователей
sasha(на Linux B) иsasha(на Linux C) настроен беспарольныйsudoдля выполнения задач Ansible с повышением прав (become: yes). - На целевые хосты установлен Python 3 и Python-библиотека
docker(pip3 install docker) для корректной работы модулей Ansibledocker_containerиdocker_image.
- Установка Docker: Устанавливается
docker.ioчерез модульapt. - Запуск контейнера MySQL:
- Используется образ
mysql:5.7. - Контейнер именуется
mysqlи настроен на автоматический перезапуск. - Учетные данные (
MYSQL_ROOT_PASSWORD) и имя базы (MYSQL_DATABASE: todos) передаются через переменные окружения (пароль изvault.yml). - Порт
3306контейнера пробрасывается на порт3306хоста. - Для персистентности данных используется именованный Docker-том
mysql_app_data, монтируемый в/var/lib/mysqlвнутри контейнера.
- Используется образ
Содержимое roles/mysql/tasks/main.yaml доступно в репозитории.
- Установка Docker: Устанавливается
docker.ioчерез модульapt. - Загрузка Docker-образа: Образ
antonaleks/101-todo-app:latestзагружается с Docker Hub. - Запуск контейнера Todo-app:
- Контейнер именуется
todoи настроен на автоматический перезапуск. - Порт
80контейнера (на котором слушает приложение) пробрасывается на порт3000хоста. - Переменные окружения для подключения к базе данных (
DB_HOST,DB_USER,DB_PASSWORD,DB_NAME) передаются в контейнер.DB_HOSTуказывает на IP-адрес хостаserver(192.168.1.5), аDB_PASSWORDберется изvault.yml.
- Контейнер именуется
Содержимое roles/todo/tasks/main.yaml доступно в репозитории.
-
Основной плейбук (
playbook.yml): Плейбук состоит из двух частей: первая применяет рольmysqlк хостам из группыdb, вторая применяет рольtodoк хостам из группыapp. Обе части используютbecome: yesи загружают переменные изvault.yml. -
Выполнение:
- После устранения проблем с пакетной системой (
apt) и нехваткой места на диске на целевых хостах, а также установки Python-библиотекиdocker, плейбук был успешно выполнен с управляющего хоста (Linux A). - Команда запуска:
ansible-playbook playbook.yml -i inventory.ini --ask-vault-pass.
- После устранения проблем с пакетной системой (
Скриншот успешного выполнения ansible-playbook (или вывода --check):

- Контейнер MySQL (на Linux C): Успешно запущен, порт
3306доступен для хоста приложения, данные персистентны. - Контейнер Todo-app (на Linux B): Успешно запущен, порт
3000доступен извне. - Веб-приложение: Приложение Todo-app доступно в браузере по адресу
http://192.168.1.6:3000. Функциональность создания, редактирования и удаления задач проверена и работает корректно, что подтверждает успешное подключение к базе данных MySQL.
Скриншот работающего Todo-приложения в браузере:

Скриншот docker ps на хосте client (Linux B):

Скриншот docker ps на хосте server (Linux C):

В ходе выполнения задания была успешно автоматизирована процедура развертывания двухкомпонентного приложения (веб-приложение и база данных) на отдельные виртуальные машины с использованием Ansible. Применены лучшие практики, такие как использование ролей для структурирования кода, Ansible Vault для защиты чувствительных данных и настройка файрвола для ограничения доступа. Задание выполнено в полном объеме.