Автоматизация настройки сервера 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. Тестирование и мониторинг производительности
После завершения автоматизации проверьте:
- Ответ Nginx:
curl -I https://{{ ansible_fqdn }}– статус 200. - Время отклика WordPress через SEO‑проверку (PageSpeed Insights).
- Нагрузка:
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.