9.5 KiB
09. Управление конфигурацией (Ansible)
Обзор
Для автоматизации развёртывания и поддержки инфраструктуры используется Ansible. Управляющий хост — ansible (192.168.1.210). Все конфигурации хранятся в репозитории, секреты зашифрованы с помощью Ansible Vault.
Структура репозитория
ansible/
├── inventory/
│ └── hosts # файл инвентаря
├── group_vars/
│ ├── all.yml # общие переменные (несекретные)
│ └── vault.yml # зашифрованные секреты
├── roles/
│ ├── base_setup/ # базовая настройка всех хостов
│ ├── system_cleanup/ # удаление ненужных пакетов
│ ├── docker/ # установка Docker, настройка мониторинга
│ ├── npm/ # Nginx Proxy Manager
│ ├── heimdall/ # Heimdall дашборд
│ ├── mealie/ # Mealie
│ ├── bookstack/ # BookStack
│ ├── bitwarden/ # Bitwarden (Vaultwarden)
│ ├── ampache/ # Ampache
│ ├── audiobookshelf/ # Audiobookshelf
│ ├── calibre-web/ # Calibre-web
│ ├── jellyfin/ # Jellyfin
│ ├── flibusta/ # Flibusta
│ ├── immich/ # Immich
│ ├── mumble/ # Mumble
│ ├── teamspeak/ # TeamSpeak
│ ├── minecraft/ # Minecraft (закомментирована)
│ ├── meshcentral/ # MeshCentral
│ ├── grafana/ # Grafana
│ ├── loki/ # Loki
│ ├── gitlab/ # GitLab
│ ├── torrserver/ # TorrServer
│ ├── qbittorrent/ # qBittorrent
│ ├── promtail/ # Promtail (сбор логов)
│ ├── cadvisor/ # cAdvisor (закомментирована)
│ ├── proxmox_base_setup/ # настройка Proxmox хоста
│ └── proxmox_monitoring/ # настройка Proxmox VE Exporter
└── olimp-deploy.yml # основной playbook
Инвентарь (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 заданы публичные ключи. Необходимо убедиться, что на всех хостах нет лишних ключей, а вход по паролю отключён.
Связанные разделы: