243 lines
9.5 KiB
Markdown
243 lines
9.5 KiB
Markdown
# 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` заданы публичные ключи. Необходимо убедиться, что на всех хостах нет лишних ключей, а вход по паролю отключён.
|
||
|
||
---
|
||
|
||
**Связанные разделы:**
|
||
- [Виртуальные машины и LXC](03-vms-lxcs.md)
|
||
- [Сеть и доступ](04-network.md)
|
||
- [Мониторинг и логирование](08-monitoring.md)
|
||
- [Безопасность](10-security.md) |