9.3 KiB
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)