18 KiB
18 KiB
📘 Ansible Web Server Automation - Полная Инструкция
🎯 Содержание
- Требования
- Установка Ansible
- Настройка SSH
- Клонирование проекта
- Настройка inventory
- Настройка переменных
- Тестирование подключения
- Запуск playbook
- Проверка результата
- Деплой приложения
- 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
# Обновить систему
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
# Установить Homebrew (если нет)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Установить Ansible
brew install ansible
# Проверить
ansible --version
Windows WSL2
# Открыть Ubuntu в WSL2
wsl
# Следовать инструкциям для Ubuntu выше
sudo apt update
sudo apt install -y ansible
3. Настройка SSH
3.1 Генерация SSH ключа
На управляющей машине:
# Генерировать 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 Копирование ключа на сервер
# Скопировать ключ на целевой сервер
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 подключения
# Подключиться без пароля
ssh ubuntu@192.168.1.10
# Если успешно - можно продолжать!
exit
4. Клонирование проекта
# Клонировать репозиторий
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
# Открыть файл
vim inventory/production
5.2 Заменить на свои данные
# 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 Простой пример (один сервер)
[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 / локального тестирования
[webservers]
localhost ansible_connection=local
[all:vars]
ansible_user=vagrant
environment=development
6. Настройка переменных
6.1 Общие переменные
# Открыть файл
vim group_vars/all.yml
Настройте базовые параметры:
---
# Система
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 Переменные веб-сервера
# Открыть файл
vim group_vars/webservers.yml
Настройте параметры приложения:
---
# 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
ansible-inventory -i inventory/production --list
7.2 Ping тест
# Проверить подключение ко всем хостам
ansible -i inventory/production all -m ping
# Ожидаемый результат:
# web1 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
7.3 Проверить доступ sudo
ansible -i inventory/production all -m shell -a "whoami" --become
Должно показать: root
7.4 Собрать факты о системе
ansible -i inventory/production all -m setup
8. Запуск Playbook
8.1 Синтаксис проверка
# Проверить синтаксис playbook
ansible-playbook -i inventory/production playbooks/site.yml --syntax-check
# Должно показать:
# playbook: playbooks/site.yml
8.2 Dry Run (тест без изменений)
# Запустить в режиме проверки
ansible-playbook -i inventory/production playbooks/site.yml --check
# Покажет что будет изменено, но не применит изменения
8.3 Список задач
# Посмотреть все задачи
ansible-playbook -i inventory/production playbooks/site.yml --list-tasks
8.4 Полный запуск
# Запустить полную установку
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 Запуск конкретных тегов
# Только обновить пакеты
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 Ограничить выполнение на один хост
# Только для 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 Проверить веб-сервер
# С управляющей машины
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
curl http://192.168.1.10/health
# Должен вернуть: healthy
9.4 Проверить Nginx статус
# На сервере
ssh ubuntu@192.168.1.10
sudo systemctl status nginx
# Должно показать: active (running)
9.5 Проверить firewall
# На сервере
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 Проверить логи
# На сервере
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 Базовый деплой
# Задеплоить приложение
ansible-playbook -i inventory/production playbooks/deploy.yml
10.2 Деплой с версией
# Указать версию
ansible-playbook -i inventory/production playbooks/deploy.yml -e "app_version=v1.2.3"
10.3 Что делает deploy playbook
- ✅ Создаёт директорию приложения
- ✅ Деплоит HTML файл
- ✅ Перезапускает Nginx
- ✅ Проверяет доступность
10.4 Кастомизация HTML
Отредактируйте в playbook playbooks/deploy.yml:
- 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"}
Решение:
# Проверить 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"}
Решение:
# Запустить с запросом 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'
Решение:
# Установить 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)
Решение:
# Найти процесс на порту 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
Решение:
# Проверить 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
Решение:
# Проверить UFW
ssh ubuntu@192.168.1.10
sudo ufw status
# Добавить правило если нужно
sudo ufw allow 80/tcp
sudo ufw reload
Проблема 7: Slow playbook execution
Решение:
# Включить 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 команды
# Перезапустить 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 (для секретов)
# Создать зашифрованный файл
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