Files
k3s-gitops/ansible/webserver-automation/ansible.md

781 lines
18 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.

# 📘 Ansible Web Server Automation - Полная Инструкция
## 🎯 Содержание
1. [Требования](#требования)
2. [Установка Ansible](#установка-ansible)
3. [Настройка SSH](#настройка-ssh)
4. [Клонирование проекта](#клонирование-проекта)
5. [Настройка inventory](#настройка-inventory)
6. [Настройка переменных](#настройка-переменных)
7. [Тестирование подключения](#тестирование-подключения)
8. [Запуск playbook](#запуск-playbook)
9. [Проверка результата](#проверка-результата)
10. [Деплой приложения](#деплой-приложения)
11. [Troubleshooting](#troubleshooting)
---
## 1. Требования
### Управляющая машина (ваш компьютер)
- Ubuntu 20.04+ / Debian 11+ / macOS / Windows WSL2
- Python 3.6+
- Git
- SSH client
### Целевые серверы
- Ubuntu 20.04 / 22.04 (рекомендуется)
- Debian 10 / 11
- Минимум 1GB RAM, 10GB диск
- SSH доступ
- Sudo права
---
## 2. Установка Ansible
### Ubuntu / Debian
```bash
# Обновить систему
sudo apt update
sudo apt upgrade -y
# Установить зависимости
sudo apt install -y software-properties-common
# Добавить PPA репозиторий Ansible (опционально, для последней версии)
sudo add-apt-repository --yes --update ppa:ansible/ansible
# Установить Ansible
sudo apt install -y ansible
# Проверить установку
ansible --version
```
Должно показать:
```
ansible [core 2.14.x]
python version = 3.x.x
jinja version = 3.x.x
```
### macOS
```bash
# Установить Homebrew (если нет)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Установить Ansible
brew install ansible
# Проверить
ansible --version
```
### Windows WSL2
```bash
# Открыть Ubuntu в WSL2
wsl
# Следовать инструкциям для Ubuntu выше
sudo apt update
sudo apt install -y ansible
```
---
## 3. Настройка SSH
### 3.1 Генерация SSH ключа
На управляющей машине:
```bash
# Генерировать SSH ключ (если нет)
ssh-keygen -t ed25519 -C "your_email@example.com"
# Или RSA (более совместимый)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# Нажать Enter для defaults
# Ключи сохранятся в ~/.ssh/id_ed25519 (или id_rsa)
```
### 3.2 Копирование ключа на сервер
```bash
# Скопировать ключ на целевой сервер
ssh-copy-id ubuntu@192.168.1.10
# Или вручную
cat ~/.ssh/id_ed25519.pub | ssh ubuntu@192.168.1.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
### 3.3 Тест SSH подключения
```bash
# Подключиться без пароля
ssh ubuntu@192.168.1.10
# Если успешно - можно продолжать!
exit
```
---
## 4. Клонирование проекта
```bash
# Клонировать репозиторий
git clone http://git.thedevops.dev/admin/k3s-gitops.git
# Перейти в директорию проекта
cd k3s-gitops/ansible/webserver-automation
# Проверить структуру
tree
```
Должна быть структура:
```
ansible/webserver-automation/
├── README.md
├── ansible.cfg
├── inventory/
│ └── production
├── group_vars/
│ ├── all.yml
│ └── webservers.yml
├── playbooks/
│ ├── site.yml
│ └── deploy.yml
└── roles/
├── common/
├── nginx/
└── firewall/
```
---
## 5. Настройка Inventory
### 5.1 Редактировать production inventory
```bash
# Открыть файл
vim inventory/production
```
### 5.2 Заменить на свои данные
```ini
# Production Inventory
# Замените IP адреса на свои!
[webservers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
[all:vars]
ansible_user=ubuntu # Ваш SSH пользователь
ansible_ssh_private_key_file=~/.ssh/id_rsa # Путь к SSH ключу
ansible_python_interpreter=/usr/bin/python3
environment=production
```
### 5.3 Простой пример (один сервер)
```ini
[webservers]
web1 ansible_host=192.168.1.10
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_ed25519
environment=production
```
### 5.4 Для Vagrant / локального тестирования
```ini
[webservers]
localhost ansible_connection=local
[all:vars]
ansible_user=vagrant
environment=development
```
---
## 6. Настройка переменных
### 6.1 Общие переменные
```bash
# Открыть файл
vim group_vars/all.yml
```
Настройте базовые параметры:
```yaml
---
# Система
timezone: "Europe/Vilnius" # Ваш timezone
# Пользователи
admin_users:
- name: admin
groups: sudo
shell: /bin/bash
- name: deploy
groups: www-data
shell: /bin/bash
# Пакеты
common_packages:
- curl
- wget
- git
- vim
- htop
- ufw
# SSH
ssh_port: 22
ssh_password_authentication: false
# Firewall
firewall_allowed_tcp_ports:
- 22 # SSH
- 80 # HTTP
- 443 # HTTPS
```
### 6.2 Переменные веб-сервера
```bash
# Открыть файл
vim group_vars/webservers.yml
```
Настройте параметры приложения:
```yaml
---
# Nginx
nginx_port: 80
nginx_ssl_port: 443
# Приложение
app_name: "myapp" # Имя вашего приложения
app_user: "webapp"
app_group: "www-data"
app_dir: "/var/www/{{ app_name }}"
# Домен
domain_name: "example.com" # Ваш домен
server_name: "{{ inventory_hostname }}"
# SSL (отключить если нет сертификата)
ssl_enabled: false
# Логи
access_log: "/var/log/nginx/{{ app_name }}_access.log"
error_log: "/var/log/nginx/{{ app_name }}_error.log"
# Performance
client_max_body_size: "100M"
gzip_enabled: true
```
---
## 7. Тестирование подключения
### 7.1 Проверить синтаксис inventory
```bash
ansible-inventory -i inventory/production --list
```
### 7.2 Ping тест
```bash
# Проверить подключение ко всем хостам
ansible -i inventory/production all -m ping
# Ожидаемый результат:
# web1 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
```
### 7.3 Проверить доступ sudo
```bash
ansible -i inventory/production all -m shell -a "whoami" --become
```
Должно показать: `root`
### 7.4 Собрать факты о системе
```bash
ansible -i inventory/production all -m setup
```
---
## 8. Запуск Playbook
### 8.1 Синтаксис проверка
```bash
# Проверить синтаксис playbook
ansible-playbook -i inventory/production playbooks/site.yml --syntax-check
# Должно показать:
# playbook: playbooks/site.yml
```
### 8.2 Dry Run (тест без изменений)
```bash
# Запустить в режиме проверки
ansible-playbook -i inventory/production playbooks/site.yml --check
# Покажет что будет изменено, но не применит изменения
```
### 8.3 Список задач
```bash
# Посмотреть все задачи
ansible-playbook -i inventory/production playbooks/site.yml --list-tasks
```
### 8.4 Полный запуск
```bash
# Запустить полную установку
ansible-playbook -i inventory/production playbooks/site.yml
# С verbose output (для отладки)
ansible-playbook -i inventory/production playbooks/site.yml -v
# Очень подробный вывод
ansible-playbook -i inventory/production playbooks/site.yml -vvv
```
### 8.5 Ход выполнения
Вы увидите примерно такой вывод:
```
PLAY [Setup all servers] *********************************************
TASK [Gathering Facts] ***********************************************
ok: [web1]
TASK [Display deployment information] ********************************
ok: [web1] => {
"msg": "Deploying to: web1\nEnvironment: production\n..."
}
PLAY [Configure common settings] *************************************
TASK [common : Update apt cache] *************************************
changed: [web1]
TASK [common : Install common packages] ******************************
changed: [web1]
...
PLAY RECAP ***********************************************************
web1 : ok=25 changed=15 unreachable=0 failed=0
```
### 8.6 Запуск конкретных тегов
```bash
# Только обновить пакеты
ansible-playbook -i inventory/production playbooks/site.yml --tags packages
# Только настроить firewall
ansible-playbook -i inventory/production playbooks/site.yml --tags firewall
# Только nginx
ansible-playbook -i inventory/production playbooks/site.yml --tags nginx
# Несколько тегов
ansible-playbook -i inventory/production playbooks/site.yml --tags "packages,nginx"
```
### 8.7 Ограничить выполнение на один хост
```bash
# Только для web1
ansible-playbook -i inventory/production playbooks/site.yml --limit web1
# Для нескольких хостов
ansible-playbook -i inventory/production playbooks/site.yml --limit "web1,web2"
```
---
## 9. Проверка результата
### 9.1 Проверить веб-сервер
```bash
# С управляющей машины
curl http://192.168.1.10
# Должен вернуть HTML страницу
```
### 9.2 Проверить в браузере
Открыть в браузере:
```
http://192.168.1.10
```
Вы должны увидеть красивую страницу с:
- 🚀 emoji
- Название приложения
- Environment: production
- Server: web1
- "Deployed with Ansible ✨"
### 9.3 Проверить health endpoint
```bash
curl http://192.168.1.10/health
# Должен вернуть: healthy
```
### 9.4 Проверить Nginx статус
```bash
# На сервере
ssh ubuntu@192.168.1.10
sudo systemctl status nginx
# Должно показать: active (running)
```
### 9.5 Проверить firewall
```bash
# На сервере
ssh ubuntu@192.168.1.10
sudo ufw status
# Должно показать:
# Status: active
# To Action From
# -- ------ ----
# 22/tcp ALLOW Anywhere
# 80/tcp ALLOW Anywhere
# 443/tcp ALLOW Anywhere
```
### 9.6 Проверить логи
```bash
# На сервере
ssh ubuntu@192.168.1.10
# Access logs
sudo tail -f /var/log/nginx/myapp_access.log
# Error logs
sudo tail -f /var/log/nginx/myapp_error.log
```
---
## 10. Деплой приложения
### 10.1 Базовый деплой
```bash
# Задеплоить приложение
ansible-playbook -i inventory/production playbooks/deploy.yml
```
### 10.2 Деплой с версией
```bash
# Указать версию
ansible-playbook -i inventory/production playbooks/deploy.yml -e "app_version=v1.2.3"
```
### 10.3 Что делает deploy playbook
1. ✅ Создаёт директорию приложения
2. ✅ Деплоит HTML файл
3. ✅ Перезапускает Nginx
4. ✅ Проверяет доступность
### 10.4 Кастомизация HTML
Отредактируйте в playbook `playbooks/deploy.yml`:
```yaml
- name: Deploy custom HTML
copy:
dest: "{{ app_dir }}/index.html"
content: |
<!DOCTYPE html>
<html>
<head>
<title>My Custom App</title>
</head>
<body>
<h1>Welcome to My App!</h1>
<p>Version: {{ app_version }}</p>
</body>
</html>
```
---
## 11. Troubleshooting
### Проблема 1: SSH connection failed
**Ошибка:**
```
fatal: [web1]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host"}
```
**Решение:**
```bash
# Проверить SSH подключение вручную
ssh ubuntu@192.168.1.10
# Проверить SSH ключ
ssh-add -l
# Добавить ключ если нужно
ssh-add ~/.ssh/id_rsa
# Проверить права на ключ
chmod 600 ~/.ssh/id_rsa
```
### Проблема 2: Permission denied (sudo)
**Ошибка:**
```
fatal: [web1]: FAILED! => {"msg": "Missing sudo password"}
```
**Решение:**
```bash
# Запустить с запросом sudo пароля
ansible-playbook -i inventory/production playbooks/site.yml --ask-become-pass
# Или добавить пользователя в sudoers без пароля
ssh ubuntu@192.168.1.10
sudo visudo
# Добавить строку:
ubuntu ALL=(ALL) NOPASSWD:ALL
```
### Проблема 3: Module not found
**Ошибка:**
```
ERROR! couldn't resolve module/action 'community.general.ufw'
```
**Решение:**
```bash
# Установить Ansible collections
ansible-galaxy collection install community.general
ansible-galaxy collection install ansible.posix
```
### Проблема 4: Port 80 already in use
**Ошибка:**
```
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
```
**Решение:**
```bash
# Найти процесс на порту 80
ssh ubuntu@192.168.1.10
sudo lsof -i :80
# Остановить Apache если запущен
sudo systemctl stop apache2
sudo systemctl disable apache2
# Перезапустить Nginx
sudo systemctl restart nginx
```
### Проблема 5: Syntax error in playbook
**Ошибка:**
```
ERROR! We were unable to read either as JSON nor YAML
```
**Решение:**
```bash
# Проверить YAML синтаксис
yamllint playbooks/site.yml
# Или онлайн: http://www.yamllint.com/
# Проверить отступы (должны быть пробелы, не табы!)
```
### Проблема 6: Firewall блокирует HTTP
**Ошибка:**
```
curl: (7) Failed to connect to 192.168.1.10 port 80: Connection refused
```
**Решение:**
```bash
# Проверить UFW
ssh ubuntu@192.168.1.10
sudo ufw status
# Добавить правило если нужно
sudo ufw allow 80/tcp
sudo ufw reload
```
### Проблема 7: Slow playbook execution
**Решение:**
```bash
# Включить pipelining в ansible.cfg
echo "pipelining = True" >> ansible.cfg
# Отключить gathering facts если не нужны
ansible-playbook playbooks/site.yml --skip-tags=facts
# Использовать Strategy plugin
# В playbook добавить:
strategy: free
```
---
## 📚 Дополнительные команды
### Полезные ad-hoc команды
```bash
# Перезапустить Nginx на всех серверах
ansible -i inventory/production webservers -m service -a "name=nginx state=restarted" --become
# Проверить uptime
ansible -i inventory/production all -m shell -a "uptime"
# Проверить disk space
ansible -i inventory/production all -m shell -a "df -h"
# Обновить пакеты
ansible -i inventory/production all -m apt -a "update_cache=yes upgrade=dist" --become
# Скопировать файл на все серверы
ansible -i inventory/production webservers -m copy -a "src=./file.txt dest=/tmp/file.txt"
# Получить информацию о процессе
ansible -i inventory/production webservers -m shell -a "ps aux | grep nginx"
```
### Ansible Vault (для секретов)
```bash
# Создать зашифрованный файл
ansible-vault create group_vars/production_secrets.yml
# Редактировать
ansible-vault edit group_vars/production_secrets.yml
# Запустить playbook с vault
ansible-playbook -i inventory/production playbooks/site.yml --ask-vault-pass
# Или с файлом пароля
echo "mypassword" > .vault_pass
ansible-playbook -i inventory/production playbooks/site.yml --vault-password-file .vault_pass
```
---
## 🎓 Следующие шаги
### 1. Добавить мониторинг
- Prometheus
- Grafana
- Node Exporter
### 2. Добавить SSL сертификаты
- Let's Encrypt
- Certbot automation
### 3. Добавить CI/CD
- Интеграция с Jenkins
- GitLab CI
- GitHub Actions
### 4. Масштабирование
- Добавить Load Balancer
- Настроить Database servers
- Redis/Memcached
---
## 📞 Поддержка
- **Документация:** http://git.thedevops.dev/admin/k3s-gitops/src/branch/main/ansible/webserver-automation
- **Issues:** http://git.thedevops.dev/admin/k3s-gitops/issues
- **Ansible Docs:** https://docs.ansible.com
---
## ✅ Checklist успешной установки
- [ ] Ansible установлен (`ansible --version`)
- [ ] SSH ключи настроены
- [ ] Проект склонирован
- [ ] Inventory настроен с реальными IP
- [ ] Variables настроены (timezone, domain, etc)
- [ ] SSH ping успешен (`ansible all -m ping`)
- [ ] Playbook запущен (`ansible-playbook playbooks/site.yml`)
- [ ] Сайт доступен (`curl http://SERVER_IP`)
- [ ] Firewall работает (`sudo ufw status`)
- [ ] Nginx работает (`systemctl status nginx`)
- [ ] Deploy работает (`ansible-playbook playbooks/deploy.yml`)
---
**Версия:** 1.0.0
**Дата:** 2026-01-06
**Статус:** ✅ Production Ready