Files

18 KiB
Raw Permalink Blame History

📘 Ansible Web Server Automation - Полная Инструкция

🎯 Содержание

  1. Требования
  2. Установка Ansible
  3. Настройка SSH
  4. Клонирование проекта
  5. Настройка inventory
  6. Настройка переменных
  7. Тестирование подключения
  8. Запуск playbook
  9. Проверка результата
  10. Деплой приложения
  11. 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

  1. Создаёт директорию приложения
  2. Деплоит HTML файл
  3. Перезапускает Nginx
  4. Проверяет доступность

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

📞 Поддержка


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