BK
июня 20, 2025
Обновлено июня 20, 2025

Как использовать Ansible для автоматической установки приложений и БД на VPS

Ansible

Ручная настройка серверов на VPS — это время, ошибки и несогласованность. Ansible — это инструмент автоматизации, который позволяет описывать конфигурацию серверов как код, обеспечивая идемпотентность и повторяемость. Это руководство поможет вам настроить VPS с Nginx, MySQL и PHP с помощью Ansible, минимизируя ручную работу и повышая надёжность.

Что такое Ansible?

Ansible — это простой, но мощный инструмент автоматизации с открытым исходным кодом (приобретен Red Hat).

Его ключевые особенности:

  • Агентлесс (Agentless):
    • Не требует установки специального ПО (агентов) на управляемые узлы (ваши VPS). Использует существующие протоколы (SSH для Linux/Unix, WinRM для Windows).
  • Push-модель:
    • Управление инициируется с "контрольной машины" (Ansible control node), которая по SSH подключается к целевым узлам и выполняет задачи.
  • Простота чтения и написания:
    • Конфигурации пишутся на YAML (простом языке разметки). Основные понятия:
      • Инвентори (Inventory):
        • Файл (или группа файлов), описывающий ваши серверы (хосты), их IP/имена, группы (например, `webservers`, `dbservers`).
      • Плейбуки (Playbooks):
        • Основные YAML-файлы, описывающие автоматизируемые процессы (plays) и задачи (tasks) для выполнения на хостах.
      • Задачи (Tasks):
        • Конкретные действия (модули Ansible), выполняемые на хостах (установить пакет, скопировать файл, перезапустить сервис).
      • Модули (Modules):
        • Готовые "кирпичики" функциональности (более 3000 встроенных!). Примеры: `apt`/`yum` (управление пакетами), `copy`/`template` (управление файлами), `service` (управление сервисами), `mysql_db` (управление БД MySQL).
      • Роли (Roles):
        • Способ структурировать и переиспользовать наборы задач, переменных, файлов и шаблонов для решения конкретной цели (например, роль `nginx` или `postgresql`).
      • Шаблоны (Templates):
        • Файлы (обычно на базе Jinja2), которые динамически генерируют конфиги на основе переменных (например, конфиг Nginx с доменом из переменной).
      • Переменные (Variables):
        • Способ параметризировать плейбуки и роли (версии ПО, пути, пароли, настройки).

Достоинства Ansible

  • Низкий порог входа:
    • Проще начать по сравнению с Chef/Puppet из-за YAML и отсутствия агентов.
  • Идемпотентность:
    • Встроена в большинство модулей. Повторный прогон плейбука безопасен.
  • Огромное сообщество и экосистема:
    • Богатая документация, тысячи модулей, тысячи готовых ролей на Ansible Galaxy.
  • Универсальность:
    • Управляет не только конфигурацией ОС, но и облаками (AWS, Azure, GCP), сетевым оборудованием, контейнерами (Kubernetes), приложениями.
  • Безопасность:
    • Отсутствие агентов минимизирует поверхность атаки. Интеграция с `ansible-vault` для шифрования секретов (паролей, ключей).
  • Легкость интеграции в CI/CD:
    • Плейбуки легко вызываются из Jenkins, GitLab CI и др.

Недостатки и ограничения

  • Производительность на очень больших флотах:
    • Push-модель через SSH может стать узким местом при управлении тысячами серверов одновременно (решается Tower/AWX, динамическим инвентори).
  • Ограниченная "интеллектуальность" на целевом узле:
    • Тяжелая логика обработки данных сложнее, чем в агентных системах (Chef/Puppet), хотя и возможна через `command`/`shell` или фильтры Jinja2.
  • Отладка сложных сценариев:
    • Отладка больших плейбуков или шаблонов Jinja2 может быть непростой.
  • Зависимость от SSH и Python:
    • Требует работающего SSH и Python (версии 2.7 или 3.5+) на целевых узлах (для большинства модулей).

Причины использовать Ansible для VPS

  • Быстрое и предсказуемое развертывание:
    • Установка LAMP/LEMP стека, Node.js, Docker, PostgreSQL, Redis и т.д. становится одношаговой операцией.
  • Согласованность среды:
    • Гарантия, что все серверы в группе (`production`, `staging`) идентично настроены.
  • Воспроизводимость:
    • Легко воссоздать сервер после сбоя или развернуть новый.
  • Контроль версий конфигурации:
    • Весь код настройки хранится в Git.
  • Упрощение сложных задач:
    • Автоматизация настройки брандмауэров, резервного копирования, мониторинга.
  • Освобождение времени администратора:
    • Фокус на улучшении инфраструктуры, а не на рутине.

Альтернативы Ansible

  • Chef:
    • Мощный, зрелый инструмент. Требует агента (Chef Client) и сервер (Chef Infra Server). Более сложный для старта, но очень гибкий. Хорош для очень сложных и динамичных сред.
  • Puppet:
    • Один из пионеров. Агентный (Puppet Agent), декларативный язык (DSL). Силен в поддержке долгосрочной консистентности огромных инфраструктур. Сложнее Ansible.
  • SaltStack (Salt Project):
    • Агентный (salt-minion) или агентлесс (salt-ssh). Очень быстрый, гибкий. Использует YAML и Jinja2 (как Ansible), но с другим подходом к состояниям. Может быть сложнее для базовых задач.
  • Terraform:
    • Не конкурирует напрямую! Terraform специализируется на оркестрации облачной инфраструктуры (создание VPS, сетей, балансировщиков). Ansible специализируется на конфигурации уже созданных серверов. Часто используются вместе: Terraform создает инфраструктуру -> Ansible ее настраивает.
  • Скрипты (Bash/Python):
    • Просто для одноразовых задач. Не обеспечивают идемпотентность, сложны для поддержки и масштабирования, нет структуры.

Настройка, развертывание и использование, пошаговый пример (установка Nginx + MySQL + PHP на Ubuntu VPS)

Настройка Контрольной Машины (Ansible Control Node)

ОС: Linux (Ubuntu/Debian/CentOS) или macOS. Windows требует WSL.

Установка Ansible:

# Ubuntu/Debian

sudo apt update && sudo apt install ansible -y

# CentOS/RHEL (EPEL)

sudo yum install epel-release -y

sudo yum install ansible -y

# Проверка

ansible --version

Настройка SSH-ключей: Генерация пары ключей на контрольной машине (`ssh-keygen`) и копирование публичного ключа на целевые VPS (`ssh-copy-id user@your_vps_ip`). Это позволит подключаться без пароля.

2. Создание инвентори (Inventory)

Создайте файл inventory.ini:

ini

[webservers]

web1.example.com ansible_host=192.168.1.100  # Замените на реальный IP/DNS вашего VPS

# web2 ansible_host=192.168.1.101  # Можно добавить несколько серверов

[databases]

db1.example.com ansible_host=192.168.1.100  # Для примера на том же сервере. Обычно раздельно.

[all:vars]

ansible_user=ubuntu  # Пользователь для подключения по SSH

ansible_python_interpreter=/usr/bin/python3  # Указать Python 3 на целевых узлах

Проверка Соединения

ansible all -i inventory.ini -m ping # Должен вернуть `pong` для каждого хоста

Создание плейбука

Создайте файл `setup_lamp.yml`:


---
- name: Install and Configure LAMP Stack on Web Servers
hosts: webservers  # Применяем только к группе webservers
become: yes        # Выполнять задачи с привилегиями root (sudo)

vars:  # Переменные для всего плейбука
mysql_root_password: "secure_root_pass"  # В РЕАЛЬНОСТИ ИСПОЛЬЗУЙТЕ ansible-vault!
mysql_db_name: "myapp"
mysql_db_user: "appuser"
mysql_db_password: "secure_user_pass"    # ТОЖЕ ШИФРУЙТЕ!
domain_name: "myapp.example.com"

tasks:  # Список задач
# 1. Обновить индекс пакетов
- name: Update apt package index
ansible.builtin.apt:
update_cache: yes

# 2. Установить необходимые системные пакеты
- name: Install required system packages
ansible.builtin.apt:
name:
- curl
- software-properties-common
- unzip
- git
state: present

# 3. Установить и включить firewall (ufw), разрешить SSH и HTTP/HTTPS
- name: Install and configure UFW
ansible.builtin.apt:
name: ufw
state: present
notify: Reload UFW  # Уведомление хендлера

- name: Allow SSH through firewall
ansible.builtin.ufw:
rule: allow
port: '22'
proto: tcp

- name: Allow HTTP through firewall
ansible.builtin.ufw:
rule: allow
port: '80'
proto: tcp

- name: Allow HTTPS through firewall
ansible.builtin.ufw:
rule: allow
port: '443'
proto: tcp

# 4. Установить MySQL Server
- name: Install MySQL Server
ansible.builtin.apt:
name: mysql-server
state: present

- name: Ensure MySQL is running and enabled
ansible.builtin.service:
name: mysql
state: started
enabled: yes

# 5. Настроить MySQL (безопасная установка, создать БД и пользователя)
- name: Set MySQL root password (Idempotent)
ansible.builtin.mysql_user:
login_user: root
login_password: "" # Первоначальный пустой пароль
name: root
password: "{{ mysql_root_password }}"
host: localhost
check_implicit_admin: yes
state: present

- name: Remove anonymous MySQL users
ansible.builtin.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: ''
host_all: yes
state: absent

- name: Remove MySQL test database
ansible.builtin.mysql_db:
login_user: root
login_password: "{{ mysql_root_password }}"
name: test
state: absent

- name: Create application database
ansible.builtin.mysql_db:
login_user: root
login_password: "{{ mysql_root_password }}"
name: "{{ mysql_db_name }}"
state: present
encoding: utf8mb4
collation: utf8mb4_unicode_ci

- name: Create application database user with privileges
ansible.builtin.mysql_user:
login_user: root
login_password: "{{ mysql_root_password }}"
name: "{{ mysql_db_user }}"
password: "{{ mysql_db_password }}"
host: '%' # Или 'localhost' если приложение на том же сервере
priv: "{{ mysql_db_name }}.:ALL"
state: present

# 6. Установить PHP и необходимые модули
- name: Add ondrej/php PPA for newer PHP versions
ansible.builtin.apt_repository:
repo: "ppa:ondrej/php"
state: present

- name: Install PHP and common extensions
ansible.builtin.apt:
name:
- php8.1-fpm    # Укажите нужную версию (7.4, 8.0, 8.1, 8.2)
- php8.1-mysql
- php8.1-curl
- php8.1-gd
- php8.1-mbstring
- php8.1-xml
- php8.1-zip
state: present
update_cache: yes

- name: Ensure PHP-FPM is running and enabled
ansible.builtin.service:
name: php8.1-fpm
state: started
enabled: yes

# 7. Установить Nginx
- name: Install Nginx
ansible.builtin.apt:
name: nginx
state: present

- name: Ensure Nginx is running and enabled
ansible.builtin.service:
name: nginx
state: started
enabled: yes

# 8. Настроить виртуальный хост Nginx (используем шаблон Jinja2)
- name: Create Nginx config directory if needed
ansible.builtin.file:
path: /etc/nginx/sites-available
state: directory

- name: Deploy Nginx virtual host configuration from template
ansible.builtin.template:
src: templates/nginx_vhost.conf.j2  # Путь к шаблону на Control Node
dest: /etc/nginx/sites-available/{{ domain_name }}.conf
owner: root
group: root
mode: '0644'
notify: Reload Nginx  # Уведомление хендлера при изменении конфига

- name: Enable the site by creating symlink
ansible.builtin.file:
src: /etc/nginx/sites-available/{{ domain_name }}.conf
dest: /etc/nginx/sites-enabled/{{ domain_name }}.conf
state: link

- name: Remove default Nginx site
ansible.builtin.file:
path: /etc/nginx/sites-enabled/default
state: absent
notify: Reload Nginx

# 9. Развернуть код приложения (пример)
- name: Create web root directory
ansible.builtin.file:
path: /var/www/{{ domain_name }}
state: directory
owner: "{{ ansible_user }}"
group: www-data
mode: '0775'

- name: Clone Git repository (example)
ansible.builtin.git:
repo: "https://github.com/yourusername/yourrepo.git"
dest: /var/www/{{ domain_name }}
version: "main"  # ветка или тег
clone: yes
update: yes
when: false  # Раскомментируйте и настройте по необходимости

handlers:  # Обработчики, вызываемые уведомлениями (notify)
- name: Reload UFW
ansible.builtin.service:
name: ufw
state: reloaded

- name: Reload Nginx
ansible.builtin.service:
name: nginx
state: reloaded  # Graceful reload без разрыва соединений

Создание Шаблона Nginx (`templates/nginx_vhost.conf.j2`)


server {
listen 80;
listen [::]:80;

server_name {{ domain_name }};
root /var/www/{{ domain_name }}/public; # Путь к публичной папке приложения
index index.php index.html index.htm;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Убедитесь, что версия PHP совпадает!
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}

# Дополнительные настройки (логи, gzip и т.д.)
access_log /var/log/nginx/{{ domain_name }}-access.log;
error_log /var/log/nginx/{{ domain_name }}-error.log;
}

Запуск Плейбука

ansible-playbook -i inventory.ini setup_lamp.yml

Ansible подключится к VPS из группы `webservers`.

Последовательно выполнит все задачи.

Выведет подробный отчет (OK, CHANGED, FAILED) по каждой задаче на каждом хосте.

Использование и Дальнейшие Шаги

  • Тестирование:
    • Откройте в браузере IP-адрес вашего VPS или настройте DNS для domain_name. Должна появиться стандартная страница Nginx или ваше приложение.
  • Повторное применение:
    • Запустите плейбук снова (ansible-playbook ...). Большинство задач должны вернуть ok (идемпотентность), изменятся только те, чье состояние не соответствует описанию.
  • Управление секретами:
    • Замените пароли в открытом виде! Используйте `ansible-vault`:
ansible-vault encrypt_string 'secure_root_pass' --name 'mysql_root_password'
  • Скопируйте зашифрованный вывод в файл vars/vault.yml и включите его в плейбук с помощью vars_files и флага --ask-vault-pass при запуске.
  • Структурирование:
    • Разбейте большой плейбук на Роли (например, common, mysql, php, nginx, app). Используйте ansible-galaxy init role_name для создания структуры роли.
  • Ansible Galaxy:
    • Найдите и используйте готовые роли для распространенного ПО (напр., geerlingguy.mysql, geerlingguy.nginx). Установка: ansible-galaxy install role_name.
  • Динамический инвентори:
    • Используйте скрипты (Python, Bash) или плагины облачных провайдеров для автоматического получения списка хостов из облака (AWS, DigitalOcean и т.д.).
  • Тестирование плейбуков:
    • Используйте Molecule и Testinfra для написания тестов на ваши роли.

Ansible — это мощный, доступный и элегантный инструмент, который превращает рутину управления VPS в предсказуемый, версионируемый и масштабируемый процесс. Позволяя описывать инфраструктуру как код, он обеспечивает согласованность, повторяемость и надежность ваших серверов. Начните с автоматизации простых задач, освойте основные концепции (инвентори, плейбуки, задачи, шаблоны, переменные, роли) и постепенно переходите к управлению всей вашей инфраструктурой с его помощью. Инвестиция времени в изучение Ansible окупится многократно за счет сэкономленных часов ручной работы и предотвращенных инцидентов.

Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
050000 г. Алматы пр. Сейфуллина, д. 502
+7 (777) 555-36-66
ООО «ИТГЛОБАЛКОМ ЛАБС»

Вам также может быть интересно...