Docs/docs/09-ansible.md
2026-03-20 16:20:55 +05:00

253 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)