Тестовое задание на позицию DevOps Junior
- Введение
- Содержание
- Цель
- Структура
- Схема HLD
- Требования
- Примечания
- Особенности
- Запуск
- Документация
- Запуск и инициализация базы данных
- Проверка качества кода
- Участие
- Лицензия
Разработать Ansible плейбук для автоматического развертывания докеризированного веб-приложения, состоящего из Nginx, PHP и MySQL, на удалённом сервере с использованием docker-compose.yml.
Плейбук должен решать следующие задачи:
- Дистрибуция необходимых файлов:
- Копировать все необходимые файлы приложения на удалённый сервер
- Генерация конфигурационного файла для Nginx:
- Создавать конфигурационный файл для Nginx
- При необходимости перезапускать Nginx для применения изменений
Результатом выполнения ТЗ является:
- Ansible playbook (вместе с ролями и/или файлом с зависимостями, необходимыми шаблонами)
- docker-compose.yml
- Dockerfile
├── README.md
├── ansible.cfg
├── inventories
│ └── inventory.ini
├── playbooks
│ └── playbook.yml
└── roles
├── docker_compose
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ │ ├── Dockerfile
│ │ ├── docker-compose.yml
│ │ ├── init.sql
│ │ └── .env
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ │ └── main.yaml
│ ├── src
│ │ └── index.php
│ └── tasks
│ └── main.yaml
├── nginx
│ ├── defaults
│ │ └── main.yml
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ └── templates
│ └── nginx.conf.j2
└── preconfig
├── handlers
│ └── main.yaml
├── meta
│ └── main.yaml
└── tasks
└── main.yaml
- Ansible >= 2.12
- Docker Engine >= 20
- Python >= 3
- Роли под Linux/Debian
- При первом запуске плейбука может потребоваться установка необходимых пакетов на сервере, что займет некоторое время
- Для обеспечения безопасности сервисы разделены на 2 изолированные сети:
- frontend-net (Nginx + PHP)
- backend-net (PHP + MySQL)
- Все хэндлеры собраны в корне для удобства
- Имена задач имеют префикс с именем роли для удобства чтения
-
Отредактируйте файл
ansible/inventory.ini, указав IP-адрес вашего удалённого сервера, имя пользователя и порт -
Убедитесь, что запущена ВМ c проброшенными портами для подключения по ssh
-
Убедитесь, что ssh-доступ под ansible_user настроен корректно
-
Создайте файл
roles/docker_compose/files/.envи укажите там ваши секреты -
Запустите Ansible плейбук с помощью команды:
ansible-playbook -i inventories/inventory.ini playbooks/playbook.yml -Kи введите пароль (-Kзапрашивает парольsudo) -
После завершения плейбука, приложение будет доступно на порту
8080, для проверки используйтеcurl http://localhost:8080на ВМШаблон для создания .env файла
MYSQL_ROOT_PASSWORD= MYSQL_DATABASE=Пример вывода curl
~$ curl http://localhost:8080 <p>Сегодня 01-10-2024 02:17:20</p> <h1>Тут может быть ваша реклама</h1>
Для сборки документации использован сервис mkdocs
Вы можете собрать статические файлы c mkdocs build, документация соберётся в папке site
Посмотреть документацию можно командой mkdocs serve и открыть страничку в браузере
Роль docker_compose в том числе инициализирует базу данных, проверить её состояние можно на удалённом сервере.
Проверка существования базы данных и таблицы
Когда контейнеры запустились можно вручную проверить так, выполнив команды на удалённом сервере:
docker exec -it db mysql -u root -p # и ввести пароль
SHOW TABLES;
DESCRIBE app_table;Пример вывода
user@ubuntu-server:~/php_app$ docker exec -it db mysql -u root -p
mysql> SHOW TABLES;
+--------------------+
| Tables_in_database |
+--------------------+
| app_table |
+--------------------+
1 row in set (0.00 sec)
mysql> DESCRIBE app_table;
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| content | text | NO | | NULL | |
| status | text | NO | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)- ansible-lint: проверяет код на соответствие лучшим практикам Ansible
- yamllint: проверяет синтаксис и стиль YAML-файлов
- pre-commit: автоматически запускает линтеры перед каждым коммитом
Для начала работы с pre-commit, убедитесь, что у вас установлен Python и pip, а также инициализирован git.
Затем выполните следующие команды в корне вашего проекта:
- Установите
pre-commit - Проверьте наличие файла
.pre-commit-config.yamlв корне проекта - Инициализируйте
pre-commitкомандойpre-commit install
Теперь каждый раз, когда вы попытаетесь сделать коммит, pre-commit автоматически запустит указанные хуки, проверяя ваш код на наличие ошибок и несоответствий стилю, в соответствии с правилами, прописанными в .pre-commit-config.yaml
ansible-lint — это утилита, которая помогает поддерживать код Ansible чистым и последовательным, проверяя его на соответствие стандартам и лучшим практикам.
Чтобы использовать ansible-lint в вашем проекте, выполните следующие шаги:
- Установите
ansible-lint - Запустите
ansible-lintдля проверки ваших playbook и ролейansible-lint roles/
Если вы хотите изменить правила линтинга, отрегулируйте файл .ansible-lint в корне вашего проекта. Этот файл позволяет настроить критерии, которые ansible-lint будет использовать для проверки вашего кода.
Файл .ansible-lint-ignore используется для указания исключений из правил линтинга. Вы можете добавить пути к файлам или шаблонам, которые должны быть проигнорированы ansible-lint.
Использование ansible-lint поможет вам поддерживать высокое качество кода в вашем проекте Ansible, обеспечивая соблюдение стандартов и лучших практик.
Если вы обнаружили какие-либо проблемы или у вас есть предложения по улучшению, пожалуйста, создайте новый issue или отправьте pull request.
Этот проект лицензирован MIT License.


