# 09. Управление конфигурацией (Ansible) ## Обзор Для автоматизации развёртывания и поддержки инфраструктуры используется **Ansible**. Управляющий хост — `ansible` (192.168.1.210). Все конфигурации хранятся в репозитории, секреты зашифрованы с помощью Ansible Vault. ## Структура репозитория ``` ## Структура репозитория Реальный вид каталога Ansible на хосте `ansible`: ``` /opt/servers/Olimp/ ├── arhive_roles # устаревшие/экспериментальные роли │   ├── dashy │   ├── [delete]pve_monitoring │   └── matrix ├── group_vars │   └── all.yml # общие переменные (несекретные) ├── inventories │   └── hosts # файл инвентаря ├── olimp-deploy.yml # основной playbook ├── README.md # описание проекта ├── roles # актуальные роли │   ├── ampache │   ├── audiobookshelf │   ├── base_setup │   ├── bitwarden │   ├── bookstack │   ├── cadvisor │   ├── calibre-web │   ├── docker │   ├── flibusta │   ├── gitlab │   ├── grafana │   ├── heimdall │   ├── immich │   ├── jellyfin │   ├── loki │   ├── mealie │   ├── meshcentral │   ├── minecraft │   ├── mumble │   ├── npm │   ├── promtail │   ├── proxmox_base_setup │   ├── proxmox_monitoring │   ├── qbittorrent │   ├── system_cleanup │   ├── teamspeak │   └── torrserver └── vault.yml # зашифрованные секрет ``` **Примечание:** папка `arhive_roles` содержит роли, которые не используются в основном playbook, но сохранены для справки или возможного будущего использования. Основные роли находятся в `roles/`. Инвентарь расположен в `inventories/hosts` (вместо стандартного `inventory/hosts`). ## Инвентарь (`inventory/hosts`) Хосты сгруппированы по ролям: ``` [infra] proxmox ansible_host=192.168.1.200 int_ip=192.168.1.200 gateway ansible_host=192.168.1.201 int_ip=192.168.1.201 data ansible_host=192.168.1.202 int_ip=192.168.1.202 media ansible_host=192.168.1.203 int_ip=192.168.1.203 photo ansible_host=192.168.1.204 int_ip=192.168.1.204 talk ansible_host=192.168.1.206 int_ip=192.168.1.206 games ansible_host=192.168.1.207 int_ip=192.168.1.207 manage ansible_host=192.168.1.208 int_ip=192.168.1.208 git ansible_host=192.168.1.209 int_ip=192.168.1.209 ansible ansible_host=192.168.1.210 int_ip=192.168.1.210 torrent ansible_host=192.168.1.211 int_ip=192.168.1.211 test ansible_host=192.168.1.212 int_ip=192.168.1.212 [pve-server] proxmox [gateway-server] gateway [data-server] data [media-server] media [photo-server] photo [talk-server] talk [games-server] games test [manage-server] manage [git-server] git [ansible-server] ansible [torrent-server] torrent ``` ## Playbook (`olimp-deploy.yml`) Основной playbook запускает роли для каждой группы хостов с тегами для выборочного применения. ``` - hosts: all:!pve-server roles: - {role: base_setup, tags: deploy_base} - {role: system_cleanup, tags: deploy_cleanup} - {role: promtail, tags: deploy_promtail} - hosts: pve-server roles: - { role: proxmox_base_setup, tags: deploy_proxmox_base } - { role: proxmox_monitoring, tags: deploy_proxmox_monitoring } - hosts: gateway-server roles: - { role: docker, tags: deploy_docker } - { role: npm, tags: deploy_npm } - { role: heimdall, tags: deploy_heimdall } - hosts: data-server roles: - { role: docker, tags: deploy_docker } - { role: mealie, tags: deploy_mealie } - { role: bookstack, tags: deploy_bookstack } - { role: bitwarden, tags: deploy_bitwarden } # ... остальные группы аналогично ``` ## Переменные ### Общие переменные (`group_vars/all.yml`) Содержат несекретные настройки: - временная зона, локали - список IP-адресов всех серверов - порты для мониторинга - пути к каталогам для сервисов - публичные SSH-ключи - списки пакетов для установки Пример: ``` timezone: Asia/Yekaterinburg system_locale: ru_RU.UTF-8 server_ips: olimp: "192.168.1.200" gateway: "192.168.1.201" # ... остальные monitoring_ports: node_exporter: 9100 cadvisor: 8080 loki: 3100 promtail: 9080 base_packages: - curl - wget - htop - git # ... ``` ### Секреты (`group_vars/vault.yml`) Все пароли, токены и другие чувствительные данные хранятся в зашифрованном файле `vault.yml`. Шифрование выполняется командой: ``` ansible-vault encrypt group_vars/vault.yml ``` Пример содержимого (незашифрованный вид): ``` vault_bitwarden_admin_token: "super_secret_token" vault_bitwarden_smtp_password: "smtp_password" vault_mealie_db_password: "mealie_db_pass" vault_immich_db_password: "immich_db_pass" vault_mumble_server_password: "mumble_pass" vault_mumble_superuser_password: "mumble_super_pass" vault_matrix_postgres_password: "matrix_db_pass" vault_matrix_synapse_secret: "synapse_secret" vault_matrix_macaroon_secret: "macaroon_secret" vault_matrix_form_secret: "form_secret" vault_samba_password_qb: "qb_samba_pass" grafana_admin_password: "strong_grafana_pass" # ... и другие ``` ## Запуск плейбуков Для применения конфигурации используется команда: ``` ansible-playbook -i inventory/hosts olimp-deploy.yml --ask-vault-pass ``` Для запуска только определённых тегов: ``` ansible-playbook -i inventory/hosts olimp-deploy.yml --tags deploy_docker --ask-vault-pass ``` ## Пример роли (docker) Роль `docker` выполняет установку Docker и настройку мониторинга. Ключевые задачи: - Установка зависимостей (`apt-transport-https`, `ca-certificates`, `curl`, `gnupg`, `lsb-release`) - Добавление GPG-ключа Docker и репозитория - Установка `docker-ce`, `docker-ce-cli`, `containerd.io`, `docker-compose-plugin` - Запуск и включение службы Docker - Развёртывание скрипта `docker_metrics.sh` для сбора метрик в Node Exporter - Создание systemd-таймера для регулярного сбора метрик - Обновление `runc` до версии 1.2.4 (если требуется) ## Проблемы и рекомендации ### 🔴 Хранение паролей в открытом виде в `all.yml` На момент аудита некоторые пароли (например, `grafana_admin_password`) находились в `all.yml` в открытом виде. **Немедленно перенести их в `vault.yml` и зашифровать.** ### 🟡 Использование тегов и ролей Некоторые роли закомментированы (например, `cadvisor`, `minecraft`). Если они не используются, следует удалить их из плейбука, чтобы избежать путаницы. ### 🟢 Версионирование и резервное копирование Рекомендуется хранить репозиторий Ansible в Git (локальном или на GitLab) и регулярно делать резервные копии `vault.yml` с паролем. ### 🟠 Управление SSH-ключами В `all.yml` заданы публичные ключи. Необходимо убедиться, что на всех хостах нет лишних ключей, а вход по паролю отключён. --- **Связанные разделы:** - [Виртуальные машины и LXC](03-vms-lxcs.md) - [Сеть и доступ](04-network.md) - [Мониторинг и логирование](08-monitoring.md) - [Безопасность](10-security.md)