401 lines
14 KiB
Markdown
401 lines
14 KiB
Markdown
# Ansible Playbook для развертывания инфраструктуры Olimp
|
||
|
||
Данный проект содержит Ansible playbook для автоматизированного развертывания и настройки серверной инфраструктуры, включая базовую настройку контейнеров, установку Docker и развертывание различных сервисов.
|
||
|
||
## 🏗️ Структура проекта
|
||
```mermaid
|
||
flowchart TD
|
||
subgraph Gitea["🗄️ Gitea (192.168.1.214:3001)"]
|
||
G[Репозиторий: zailon/olimp]
|
||
end
|
||
|
||
subgraph AnsibleHost["🖥️ Ansible Host (192.168.1.210)"]
|
||
direction TB
|
||
A[/opt/servers/Olimp/]
|
||
|
||
A --> P[olimp-deploy.yml]
|
||
A --> I[inventories/hosts]
|
||
A --> V[group_vars/all.yml]
|
||
A --> R[roles/]
|
||
|
||
R --> R1[base_setup/]
|
||
R --> R2[docker/]
|
||
R --> R3[npm/]
|
||
R --> R4[heimdall/]
|
||
R --> R5[mealie/]
|
||
R --> R6[bookstack/]
|
||
|
||
A --> M[README.md]
|
||
end
|
||
|
||
subgraph Targets["🎯 Целевые хосты"]
|
||
T1[gateway:201]
|
||
T2[media:203]
|
||
T3[photo:204]
|
||
T4[talk:206]
|
||
T5[Прочие LXC/VM]
|
||
end
|
||
|
||
G -->|git pull via SSH<br/>port 2221| AnsibleHost
|
||
P -->|ansible-playbook -i inventories/hosts| Targets
|
||
|
||
R1 --> T1 & T2 & T3 & T4 & T5
|
||
R2 --> T1 & T2 & T3 & T4 & T5
|
||
R3 --> T1
|
||
R4 --> T1
|
||
R5 --> T3
|
||
R6 --> T4
|
||
|
||
classDef gitea fill:#e1f5fe,stroke:#01579b,stroke-width:2px
|
||
classDef ansible fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
|
||
classDef target fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
|
||
|
||
class G gitea
|
||
class A,P,I,V,R,R1,R2,R3,R4,R5,R6,M ansible
|
||
class T1,T2,T3,T4,T5 target
|
||
```
|
||
|
||
## 🎯 Инвентаризация
|
||
|
||
Файл `inventories/hosts`:
|
||
```ini
|
||
[infra]
|
||
gateway ansible_host=192.168.1.221 int_ip=192.168.1.221
|
||
data ansible_host=192.168.1.222 int_ip=192.168.1.222
|
||
```
|
||
📋 Предварительные требования
|
||
Целевые хосты должны быть доступны по SSH
|
||
|
||
Ansible установлен на управляющей машине
|
||
|
||
Python установлен на целевых хостах
|
||
|
||
Права sudo для пользователя, выполняющего развертывание
|
||
|
||
📦 Установка зависимостей
|
||
```bash
|
||
# Установка необходимых коллекций Ansible
|
||
ansible-galaxy collection install community.docker
|
||
```
|
||
🚀 Основной плейбук: olimp-deploy.yml
|
||
```yaml
|
||
---
|
||
- hosts: all
|
||
roles:
|
||
- { role: base_setup, tags: deploy_base }
|
||
|
||
- hosts: gateway
|
||
roles:
|
||
- { role: docker, tags: deploy_docker }
|
||
- { role: npm, tags: deploy_npm }
|
||
- { role: heimdall, tags: deploy_heimdall }
|
||
|
||
- hosts: data
|
||
roles:
|
||
- { role: docker, tags: deploy_docker }
|
||
- { role: mealie, tags: deploy_mealie }
|
||
- { role: bookstack, tags: deploy_bookstack }
|
||
```
|
||
🎮 Запуск плейбука
|
||
Полное развертывание
|
||
```bash
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml
|
||
```
|
||
Выборочное развертывание по тегам
|
||
```bash
|
||
# Базовая настройка всех хостов
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_base
|
||
|
||
# Установка Docker на конкретный хост
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_docker --limit data
|
||
|
||
# Установка конкретного сервиса
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie --limit data
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_bookstack --limit data
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_npm --limit gateway
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_heimdall --limit gateway
|
||
```
|
||
🔧 Детальное описание ролей
|
||
Роль: base_setup
|
||
Тег: deploy_base
|
||
|
||
Назначение: Базовая настройка всех хостов инфраструктуры.
|
||
|
||
Задачи:
|
||
|
||
Update and upgrade apt packages - обновление пакетов и кэша apt
|
||
|
||
Install base packages - установка базовых пакетов из переменной base_packages
|
||
|
||
Configure timezone - настройка часового пояса из переменной timezone
|
||
|
||
Configure locale - настройка локали из переменной system_locale
|
||
|
||
Set default locale - установка системной локали
|
||
|
||
Install Python requests library - установка библиотеки Python3 requests для работы модулей Ansible
|
||
|
||
Источник переменных: group_vars/all.yml
|
||
|
||
Роль: docker
|
||
Тег: deploy_docker
|
||
|
||
Назначение: Установка Docker и Docker Compose на целевые хосты.
|
||
|
||
Задачи:
|
||
|
||
Install Docker dependencies - установка зависимостей Docker
|
||
|
||
Add Docker GPG key - добавление GPG ключа Docker
|
||
|
||
Add Docker repository - добавление официального репозитория Docker
|
||
|
||
Install Docker - установка Docker CE и компонентов
|
||
|
||
Install Docker Compose - установка Docker Compose Plugin
|
||
|
||
Start and enable Docker service - запуск и включение службы Docker
|
||
|
||
Verify Docker installation - проверка установки Docker и Docker Compose
|
||
|
||
Особенности: Использует официальные репозитории Docker для установки последних версий.
|
||
|
||
Роль: npm (Nginx Proxy Manager)
|
||
Тег: deploy_npm
|
||
|
||
Назначение: Установка Nginx Proxy Manager на хост gateway.
|
||
|
||
Задачи:
|
||
|
||
Create directories for NPM - создание директорий для данных NPM
|
||
|
||
Deploy NPM docker-compose.yml - развертывание docker-compose файла из шаблона
|
||
|
||
Start NPM container - запуск контейнера NPM
|
||
|
||
Check NPM container status - проверка статуса контейнера
|
||
|
||
Порты: 80, 443, 81
|
||
Web-интерфейс: http://gateway_ip:81
|
||
|
||
Источник переменных: group_vars/all.yml - npm_base_dir, npm_data_dir, npm_letsencrypt_dir
|
||
|
||
Роль: heimdall
|
||
Тег: deploy_heimdall
|
||
|
||
Назначение: Установка Heimdall - дашборда для быстрого доступа к приложениям.
|
||
|
||
Задачи:
|
||
|
||
Create directories for Heimdall - создание директорий для данных Heimdall
|
||
|
||
Deploy Heimdall docker-compose.yml - развертывание docker-compose файла
|
||
|
||
Start Heimdall container - запуск контейнера Heimdall
|
||
|
||
Check Heimdall container status - проверка статуса контейнера
|
||
|
||
Порт: 45131
|
||
Web-интерфейс: http://gateway_ip:45131
|
||
|
||
Источник переменных: group_vars/all.yml - heimdall_base_dir, heimdall_config_dir, heimdall_port
|
||
|
||
Роль: mealie
|
||
Тег: deploy_mealie
|
||
|
||
Назначение: Установка Mealie - менеджера рецептов на хост data.
|
||
|
||
Задачи:
|
||
|
||
Create Mealie directory structure - создание директорий в /mnt/mealie
|
||
|
||
Set proper ownership for Mealie data directory - установка прав владельца для директории данных
|
||
|
||
Deploy Mealie docker-compose.yml - развертывание docker-compose файла
|
||
|
||
Pull Mealie Docker image - загрузка образа Mealie
|
||
|
||
Start Mealie container - запуск контейнера Mealie
|
||
|
||
Check Mealie container status - проверка статуса контейнера
|
||
|
||
Порт: 45132
|
||
Web-интерфейс: http://data_ip:45132
|
||
Использует: SQLite базу данных по умолчанию
|
||
|
||
Источник переменных: group_vars/all.yml - mealie_base_dir, mealie_data_dir, mealie_port
|
||
|
||
Роль: bookstack
|
||
Тег: deploy_bookstack
|
||
|
||
Назначение: Установка Bookstack - системы для ведения документации на хост data.
|
||
|
||
Задачи:
|
||
|
||
Create Bookstack directory structure - создание директорий в /mnt/bookstack
|
||
|
||
Deploy Bookstack docker-compose.yml - развертывание docker-compose файла
|
||
|
||
Start Bookstack services - запуск контейнеров Bookstack и MariaDB
|
||
|
||
Check Bookstack container status - проверка статуса контейнеров
|
||
|
||
Порт: 45131
|
||
Web-интерфейс: http://data_ip:45131
|
||
Использует: MariaDB базу данных
|
||
|
||
Особенности: Сохраняет существующие данные из /mnt/bookstack
|
||
|
||
Источник переменных: group_vars/all.yml - bookstack_base_dir, bookstack_config_dir, bookstack_uploads_dir, bookstack_db_dir, bookstack_port
|
||
|
||
⚙️ Переменные конфигурации
|
||
Файл group_vars/all.yml содержит все общие переменные:
|
||
|
||
```yaml
|
||
# Общие настройки для всех хостов
|
||
timezone: Asia/Yekaterinburg
|
||
system_locale: ru_RU.UTF-8
|
||
|
||
# Базовые пакеты для установки на всех хостах
|
||
base_packages:
|
||
- curl
|
||
- wget
|
||
- gnupg
|
||
- ca-certificates
|
||
- software-properties-common
|
||
- tree
|
||
- htop
|
||
- nano
|
||
- git
|
||
- apt-transport-https
|
||
- net-tools
|
||
- dnsutils
|
||
- iputils-ping
|
||
- traceroute
|
||
|
||
# Настройки Docker сервисов
|
||
|
||
# NPM (Nginx Proxy Manager)
|
||
npm_base_dir: "/opt/npm"
|
||
npm_data_dir: "/opt/npm/data"
|
||
npm_letsencrypt_dir: "/opt/npm/letsencrypt"
|
||
|
||
# Heimdall
|
||
heimdall_base_dir: "/opt/heimdall"
|
||
heimdall_config_dir: "/opt/heimdall/config"
|
||
heimdall_port: "45131"
|
||
|
||
# Mealie
|
||
mealie_base_dir: "/mnt/mealie"
|
||
mealie_data_dir: "/mnt/mealie/data"
|
||
mealie_port: "45132"
|
||
|
||
# Bookstack
|
||
bookstack_base_dir: "/mnt/bookstack"
|
||
bookstack_config_dir: "/mnt/bookstack/config"
|
||
bookstack_uploads_dir: "/mnt/bookstack/uploads"
|
||
bookstack_db_dir: "/mnt/bookstack/db"
|
||
bookstack_port: "45131"
|
||
bookstack_db_password: "secure_password_123"
|
||
bookstack_db_root_password: "secure_root_password_123"
|
||
```
|
||
🏛️ Архитектура решения
|
||
Хост Gateway (192.168.1.221)
|
||
Nginx Proxy Manager - порты 80, 443, 81
|
||
|
||
Обратный прокси для управления доменами и SSL
|
||
|
||
Heimdall - порт 45131
|
||
|
||
Дашборд для быстрого доступа ко всем сервисам
|
||
|
||
Хост Data (192.168.1.222)
|
||
Mealie - порт 45132
|
||
|
||
Менеджер рецептов с возможностью импорта и организации
|
||
|
||
Bookstack - порт 45131
|
||
|
||
Система документации с поддержкой книг, глав и страниц
|
||
|
||
📊 Мониторинг и логи
|
||
Проверка статуса сервисов
|
||
```bash
|
||
# На хосте gateway
|
||
docker ps --filter name=npm --filter name=heimdall
|
||
|
||
# На хосте data
|
||
docker ps --filter name=mealie --filter name=bookstack
|
||
```
|
||
Просмотр логов
|
||
```bash
|
||
# Просмотр логов конкретного сервиса
|
||
docker logs mealie -f --tail 50
|
||
docker logs bookstack-mnemo -f --tail 50
|
||
|
||
# Просмотр логов через docker compose
|
||
cd /mnt/mealie && docker compose logs
|
||
cd /mnt/bookstack && docker compose logs
|
||
```
|
||
💾 Резервное копирование
|
||
Данные всех сервисов сохраняются в смонтированных директориях:
|
||
|
||
Mealie: /mnt/mealie/data
|
||
|
||
Bookstack: /mnt/bookstack/config, /mnt/bookstack/uploads, /mnt/bookstack/db
|
||
|
||
Для резервного копирования достаточно архивировать эти директории.
|
||
|
||
```bash
|
||
# Пример резервного копирования
|
||
tar -czf mealie_backup_$(date +%Y%m%d).tar.gz /mnt/mealie/data
|
||
tar -czf bookstack_backup_$(date +%Y%m%d).tar.gz /mnt/bookstack
|
||
```
|
||
🔄 Обновление сервисов
|
||
```bash
|
||
# Обновление всех сервисов на хосте
|
||
cd /path/to/service
|
||
docker compose pull
|
||
docker compose up -d
|
||
|
||
# Или через Ansible
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie,deploy_bookstack --limit data
|
||
```
|
||
🛠️ Устранение неисправностей
|
||
Проверка подключения
|
||
```bash
|
||
ansible -i inventories/hosts all -m ping
|
||
Проверка синтаксиса плейбука
|
||
bash
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --syntax-check
|
||
Запуск в режиме отладки
|
||
bash
|
||
ansible-playbook -i inventories/hosts olimp-deploy.yml --tags deploy_mealie -vvv
|
||
Проверка переменных
|
||
bash
|
||
ansible -i inventories/hosts all -m debug -a "var=hostvars[inventory_hostname]"
|
||
```
|
||
🔒 Безопасность
|
||
Все пароли и чувствительные данные должны храниться в зашифрованном виде с помощью Ansible Vault
|
||
|
||
Регулярно обновляйте образы контейнеров для получения исправлений безопасности
|
||
|
||
Настройте брандмауэр для ограничения доступа к портам
|
||
|
||
```bash
|
||
# Использование Ansible Vault для шифрования секретов
|
||
ansible-vault encrypt group_vars/secrets.yml
|
||
```
|
||
🚀 Дополнительные возможности
|
||
Проект может быть расширен добавлением новых ролей для:
|
||
|
||
Мониторинга (Prometheus, Grafana)
|
||
|
||
Резервного копирования
|
||
|
||
Централизованного логирования
|
||
|
||
Автоматического обновления контейнеров
|
||
|
||
📝 Лицензия
|
||
[Указать лицензию проекта] |