# Automated Monitoring Stack





### ☁️ Infrastructure-as-Code проект для автоматического развертывания кластера мониторинга с нуля. Позволяет за 5 минут поднять сервера в облаке и накатить на них метрики.
### Стек :hammer_and_wrench::
* :building_construction: __terraform Terraform v1.16.2 on linux_amd64 - для создания ВМ в облаке Yandex Cloud.__
* :rocket: __ansible [core 2.20.1] - для автоматической установки нужных компонентов и накатки конфигураций.__
* :whale: __docker - для изоляции сервисов и запуска на любых машинах.__
* :memo: __prometheus и node exporters - для опроса и получения метрик с целевых серверов.__
* :bar_chart: __grafana - для красивой визуализации данных.__
***
## Краткая архитектура 💡
* Главный сервер (general_server): настраивается вручную, вписывается первым под группой `servers` в inventory и настраивается в файле `general_server.yml`, который должен быть расположен в папке __host_vars__.
* Terraform идёт в облако Yandex Cloud и поднимает нужное количество серверов (настраивается в `variable.tf`). После развертывания серверов создает inventory-файл с настройками каждой машины в папке __host_vars__, чтобы запустить плейбук можно было без ручного ввода.
* Ansible получает готовую конфигурацию и идёт на `general_server`, чтобы поднять два контейнера: **Prometheus и Grafana**. Он динамически подставляет переменные из папки __group_vars__, чтобы контейнеры получили готовую конфигурацию. Затем он идёт на остальные сервера, ставит `node_exporter` с официального репозитория на GitHub, настраивает **systemd** службу и автозапуск.
## Безопасность 🔒:
* Пароли и логины хранятся в папке __group_vars__ в файле `vault.yml`, который, в свою очередь, зашифрован мастер-паролем хранилища **Ansible Vault**.
* Сразу настраивается **basic_auth** на всех сервисах: Grafana, Ansible, Node_Exporters.
* Стейт Terraform и ключи **игнорируются** Git.
* Подключение к серверам идёт строго по **SSH-ключам**.
***
## Быстрый старт 🚀:
### Вам понадобится:
* Аккаунт Yandex Cloud с ключами. Можно получить тут: Консоль Yandex Cloud. Поместите ключи в папку __terraform-infra__
* Операционная система Linux с установленной на ней terraform, ansible и git. Команда для установки (**работает на Ubuntu и Debian**): `sudo apt update && sudo apt install -y ansible terraform git`
### Конкретные действия для развёртывания:
* Клонируйте и перейдите в скачанный репозиторий командой: `git clone https://github.com/LeoR156/metrics-prometheus-grafana && cd metrics-prometheus-grafana/group_vars/all/`
* Откройте `vault.yml` и сотрите содержимое командой: `> vault.yml && nano vault.yml`.
* Напишите туда ваши реальные данные по шаблону c сохранением кавычек:
```yaml
grafana_admin_user: "ваш_логин_для_grafana"
grafana_admin_password: "ваш_пароль_для_grafana"
prom_admin_user: "ваш_логин_для_prometheus"
prom_admin_password: "ваш_пароль_для_prometheus"
exporter_user: "ваш_логин_для_exporters"
exporter_password: "ваш_пароль_для_exporters"
```
* Примените изменения: `Ctrl + X`, `Y` и `Enter`.
* Желательно применить шифрование командой: `ansible-vault encrypt vault.yml`. Придумайте и введите пароль.
⚠️ **Важно:** *Если шифруете, то запомните пароль, иначе для его просмотра нужно будет расшифровать файл командой `ansible-vault decrypt <путь_и_имя_файла>`*.
* Вернитесь на две папки выше командой `cd ../..` и перейдите в папку __host_vars__ командой `cd host_vars/`. Создайте файл `general_server.yml` и введите туда данные командой `nano general_server.yml` (**с сохранением кавычек**):
```yaml
ansible_host: "ваш_IP_главного_сервера"
ansible_user: "ваш_юзер"
ansible_ssh_private_key_file: "путь_до_ssh_ключа"
```
* Примените изменения: `Ctrl + X`, `Y` и `Enter`.
* Переместитесь в папку __terraform-infra__ командами: `cd .. && cd terraform-infra/`
⚠️ **Убедитесь, что файл с ключами Яндекса находится именно в этой папке!**
* Скачайте плагины провайдера командой `terraform init`. Дождитесь полной загрузки. По окончании убедитесь, что установка прошла корректно (сообщение `Terraform has been successfully initialized!`).
* Выполните `terraform plan` — предварительно ознакомиться с изменениями. Затем `terraform apply` — применить изменения (нужно ввести **yes**). Дождитесь, пока Terraform закончит свою работу.
* Вернитесь в корень проекта командой `cd ..` и запустите плейбук: `ansible-playbook -i terraform-infra/inventory.ini playbook.yml --ask-vault-pass` *(введите пароль, если задавали его ранее)*.
* Пару-тройку минут — и Ansible сделает свою работу!
### Подключение и первый дашборд:
* Зайдите на IP `general_server`, порт 3001. Шаблон: `http://:3001`
* Введите логин и пароль от **Grafana**, который вы задавали ранее в файле `vault.yml`.
* Зайдите на вкладку **Dashboards** слева экрана > нажмите **New** справа > нажмите **Import dashboard** > вставьте ID `1860` и нажмите **Load** > затем снова **Import**.
#### Готово! Метрики настроены.
***
# Планы дальнейшего развития проекта:
* Разбить таски по ролям Ansible.
* Добавить возможность получения SSL-сертификата ради безопасного HTTPS соединения.
* Прикрутить Alertmanager + Telegram Notifications.