Автоматизация настройки сервера WordPress: Ansible и Bash‑скрипты за 5 шагов

Почему автоматизация важна для WordPress‑сайтов

Современные проекты требуют быстрого развёртывания, масштабируемости и надёжной защиты. Ручная настройка сервера занимает часы, а ошибки приводят к падениям и уязвимостям. Автоматизация с помощью Ansible и Bash‑скриптов позволяет:

  • Создавать идентичные среды за секунды;
  • Внедрять лучшие практики hardening без человеческого фактора;
  • Оптимизировать LEMP/LAMP‑стек под нагрузку WordPress.

В результате вы получаете сервер, готовый к работе с высокими скоростями и безопасностью, что особенно важно для сайтов с трафиком более 10 000 посетителей в сутки.

Шаг 1. Подготовка инвентаря и базовых переменных Ansible

Создайте файл inventory.ini с описанием ваших хостов. Для примера возьмём один VPS под управлением Ubuntu 22.04.

[wordpress]
wp01 ansible_host=192.0.2.10 ansible_user=root

[wordpress:vars]
ansible_python_interpreter=/usr/bin/python3
wp_user=www-data
wp_root=/var/www/html
php_version=8.2

Эти переменные будут использоваться в последующих ролях: пользователь, путь к корню сайта и версия PHP.

Шаг 2. Установка LEMP‑стека через Ansible‑роль

Создайте роль lemp со следующими задачами:

- name: Install Nginx and required packages
  apt:
    name:
      - nginx
      - php{{ php_version }}-fpm
      - php{{ php_version }}-mysql
      - php{{ php_version }}-curl
      - php{{ php_version }}-gd
      - php{{ php_version }}-xml
    state: present
    update_cache: yes

- name: Ensure PHP‑FPM pool is configured for WordPress
  lineinfile:
    path: /etc/php/{{ php_version }}/fpm/pool.d/www.conf
    regexp: '^;?pm.max_children'
    line: 'pm.max_children = 20'
    notify: Restart php-fpm

- name: Enable and start services
  systemd:
    name: "{{ item }}"
    enabled: yes
    state: started
  loop:
    - nginx
    - php{{ php_version }}-fpm

Эта роль устанавливает Nginx, PHP‑FPM и настраивает pm.max_children для высокой нагрузки. Подробнее о настройке PHP‑воркеров читайте в статье Как настроить PHP‑воркеры WordPress на VPS.

Шаг 3. Автоматическое развертывание WordPress через Bash‑скрипт

После установки стека необходимо загрузить ядро WordPress, создать базу данных и настроить файл wp-config.php. Bash‑скрипт, вызванный из Ansible, выглядит так:

#!/bin/bash
set -e

WP_ROOT="{{ wp_root }}"
DB_NAME="wp_db"
DB_USER="wp_user"
DB_PASS="$(openssl rand -base64 12)"

# 1. Скачиваем и распаковываем WordPress
wget https://wordpress.org/latest.tar.gz -O /tmp/wordpress.tar.gz
tar -xzf /tmp/wordpress.tar.gz -C /tmp
mv /tmp/wordpress/* $WP_ROOT
chown -R {{ wp_user }}:$WP_ROOT $WP_ROOT

# 2. Создаём базу данных и пользователя
mysql -e "CREATE DATABASE $DB_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
mysql -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';"
mysql -e "FLUSH PRIVILEGES;"

# 3. Генерируем wp-config.php
cp $WP_ROOT/wp-config-sample.php $WP_ROOT/wp-config.php
sed -i "s/database_name_here/$DB_NAME/" $WP_ROOT/wp-config.php
sed -i "s/username_here/$DB_USER/" $WP_ROOT/wp-config.php
sed -i "s/password_here/$DB_PASS/" $WP_ROOT/wp-config.php

# 4. Устанавливаем соли безопасности
curl -s https://api.wordpress.org/secret-key/1.1/salt/ >> $WP_ROOT/wp-config.php

echo "WordPress установлен. Доступ: http://$(hostname -I | awk '{print $1}')"

Скрипт генерирует случайный пароль, сразу же применяет соли и задаёт права доступа. После выполнения вы получаете готовый сайт без ручного ввода.

Шаг 4. Hardening сервера: firewall, Fail2Ban и SSL

Безопасность – неотъемлемая часть оптимизации. Добавим несколько задач в роль hardening:

- name: Install UFW and Fail2Ban
  apt:
    name:
      - ufw
      - fail2ban
    state: present

- name: Allow HTTP/HTTPS and SSH
  ufw:
    rule: allow
    port: "{{ item }}"
    proto: tcp
  loop:
    - 22
    - 80
    - 443

- name: Enable UFW
  ufw:
    state: enabled
    policy: deny

- name: Install Certbot for Let's Encrypt
  apt:
    name: certbot
    state: present

- name: Obtain SSL certificate
  command: >
    certbot --nginx -d {{ ansible_fqdn }} --non-interactive --agree-tos --email admin@{{ ansible_fqdn }}
  when: ansible_fqdn is defined

Эти правила блокируют всё, кроме необходимых портов, и автоматически получают бесплатный сертификат. Для более глубокого сравнения плагинов безопасности читайте Сравнение плагинов безопасности WordPress 2026.

Шаг 5. Тестирование и мониторинг производительности

После завершения автоматизации проверьте:

  1. Ответ Nginx: curl -I https://{{ ansible_fqdn }} – статус 200.
  2. Время отклика WordPress через SEO‑проверку (PageSpeed Insights).
  3. Нагрузка: ab -n 1000 -c 50 https://{{ ansible_fqdn }}/.

Если среднее время ответа превышает 200 мс, увеличьте pm.max_children или добавьте кеширование (FastCGI Cache в Nginx). Для мониторинга используйте htop, netdata или интеграцию с Grafana.

Полный плейбук Ansible

Соберите всё в один плейбук wordpress.yml и запустите:

- hosts: wordpress
  become: true
  vars_files:
    - vars/main.yml
  roles:
    - lemp
    - hardening
  tasks:
    - name: Deploy WordPress via Bash script
      script: files/deploy_wordpress.sh

Запуск команды ansible-playbook -i inventory.ini wordpress.yml полностью подготовит сервер, установит WordPress и защитит его.

Заключение

Автоматизация настройки сервера WordPress с помощью Ansible и Bash‑скриптов сокращает время развертывания с часов до минут, минимизирует человеческие ошибки и гарантирует одинаково быстрый и безопасный сайт на любой инфраструктуре. Используйте готовые роли, адаптируйте переменные под свои нужды и получайте стабильную производительность в 2026‑м году.

Дополнительные ресурсы

❓ Часто задаваемые вопросы

Как проверить, что PHP‑FPM использует нужное количество воркеров?

Выполните systemctl status php{{ php_version }}-fpm и посмотрите параметр pm.max_children в выводе. При необходимости измените его в pool‑конфиге и перезапустите сервис.

Можно ли использовать Ansible без root‑доступа?

Да, настройте sudo‑привилегии для пользователя Ansible и укажите become: true в плейбуке. При этом сервер должен разрешать sudo без пароля для нужных команд.

Как автоматизировать обновление WordPress после деплоя?

Добавьте задачу в Ansible, которая периодически запускает wp core update через WP‑CLI. Можно также включить проверку наличия новых версий через cron.

Что делать, если сертификат Let’s Encrypt не обновляется автоматически?

Проверьте, что cron‑задача /etc/cron.d/certbot существует, и выполните тестовый запуск certbot renew --dry-run. При ошибках исправьте конфигурацию Nginx или права доступа к директории /etc/letsencrypt.