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

9.3 KiB
Raw Permalink Blame History

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)