💻 Тестовое для ТрейдСофт
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Dave S. f7b202ad7f feat: add readme 2 years ago
group_vars init 2 years ago
roles init 2 years ago
templates init 2 years ago
README.md feat: add readme 2 years ago
all.yml init 2 years ago
ansible.cfg init 2 years ago
containers.yml init 2 years ago
hosts init 2 years ago
hv.yml init 2 years ago

README.md

Тестовое для ТрейдСофт

Пререквизиты

  • ВМ или контейнер с Debian 11, который будет работать в качестве Docker-хоста (Docker ставить не нужно)
  • настроено SSH-подключение под учеткой root (для Ansible)
  • Python 3 (для Ansible)
  • две записи в файле hosts:
    1. apache1.local 10.90.0.2
    2. apache2.local 10.90.0.2

Настройки сети по умолчанию

  • "внешний" IP хостовой ВМ: 10.61.1.1/16
  • IP хостовой ВМ в бридже с контейнерами: 10.90.0.1/16
  • IP range для контейнеров: 10.90.0.0/16

Для изменения настроек требуется:

  1. переопределить IP ВМ/контейнеров в файле hosts
  2. указать настройки подсети Docker в виде параметров хоста hv:
docker_network_subnet: 10.90.0.0/16
docker_network_gateway: 10.90.0.1
docker_network_iprange: 10.90.0.0/16

Контейнеры будут находиться в одном бридже с хостовой ВМ.

Деплой

ansible-playbook -vv all.yml

Что сделано (группировка по контейнерам):

  • nginx
  • apache1
  • apache2
  • node_exporter
  • nginx_exporter
  • mysql_exporter
  • cadvisor
  • prometheus
  • grafana
  • fluentd
  • mysql

Исходные данные

Часть №1

Создать виртуальную машину на базе Linux Debian 11 (minimal)

Подготовить ansible playbook для настройки этой машины, который установит docker и развернет стек приложений, запущенных в разных docker-контейнерах:

  • nginx (нужен с поддержкой GeoIP модуля)
  • 2 apache с mod_php (или php-fpm)
  • node exporter
  • nginx exporter
  • mysql exporter
  • cadvisor
  • prometheus
  • grafana
  • fluentd
  • mysql

Nginx образ собрать с поддержкой модуля GeoIP. Для nginx создать кастомный формат логов, который будет содержать

  • timestamp
  • request_time
  • upstream_time
  • remote_addr
  • remote_use
  • time_local
  • request
  • status
  • body_bytes_sent
  • http_referer
  • http_user_agent
  • geoip_country_code

Ansible должен создать необходимую структуру папок (допустим в /opt или /srv), с необходимыми конфигами и логами. Сеть докера для всех контейнеров должна быть одна, т.е. все контейнеры должны видеть друг друга.

Сервисы должно быть в разных контейнерах. Контейнеры можно взять из docker hub, или создать свои (через Dockerfile).

Контейнеры должны быть в частной сети, каждому назначить отдельный IP. Nginx должен использоваться в качестве реверс прокси к apache.

Все конфиги храним в родительской системе, например: /srv/nginx/conf /srv/nginx/logs /srv/apache/conf /srv/apache/logs /srv/mysql/conf /srv/mysql/logs

папка для контента: /srv/www/html

Необходимо создать 2 доменных имени направленные на IP данной виртуальной машины.

Написать пару простых скриптов на php, по одному в каждый из apache или php-fpm. Создать виртуальные хосты в nginx, которые будут смотреть на разные apache (php-fpm). Скрипт должен имитировать нагрузку, можно через рандомный sleep в 1-4 секунды (так в логах nginx можно посмотреть upstream_time), выводить имя виртуального хоста, а также время работы. Скрипты расположить в папке для контента.

Логи apache и nginx также вывести наружу контейнеров.

Часть №2

Установить связку prometheus+grafana На виртуалку поставить node-exporter и настроить сбор метрик с нее, чтобы они отправлялись в prometheus и отображались в grafana

Метрики хоста (виртуальной машины), docker, nginx и mysql должны собираться через prometheus. В графане сделать настроить дашборды (можно взять готовые), которые выводят данные метрики. Grafana и prometheus должны проксироваться через nginx.

Fluentd настроить на сбор логов от nginx. в mysql создать базу с таблицей, куда эти логи будут выводиться, поля таблицы должны соответствовать формату логов nginx. Fluentd должен аггрегировать логи и отправлять в mysql. Также в grafana нужно создать отдельный дашборд, который будет выводить последние 100 записей из созданной таблицы и должен быть график количества запросов к nginx по виртуальным хостам.

Ожидаемое поведение после настройки всего: Допустим будет 2 виртуальных хоста first.tst и second.tst, каждый смотрит на свой бэкенд. По заходу на каждый из них будет выводиться имя виртуального хоста и время работы скрипта. Доменные имена для проверки можно поместить в hosts на компьютере, откуда будет идти проверка, скажем:

grafana.tst prometheus.tst first.tst second.tst

Они должны указывать на IP созданной виртуальной машины.

Ansible плейбук должен отработать, и ожидается что после настройки доменов в hosts можно будет зайти на соответствующие сайты, в grafana будет отображение метрик хоста, nginx, mysql, логи nginx и статистика запросов к нему по виртуальным хостам.