Automatiza el despliegue de un servidor WordPress con Ansible (¡en minutos!)
¿Te imaginas subir un playbook de Ansible y tener en minutos una web WordPress completamente instalada y lista,
con base de datos, PHP y servidor web? Hoy traigo un playbook avanzado, ideal para quienes buscan
automatizar la creación de entornos de producción o pruebas para proyectos WordPress.
Perfecto para equipos DevOps o para quienes experimentan con nuevos sitios.
Importante:
Este playbook despliega WordPress sobre Ubuntu Server, instalanginx
,MariaDB
,PHP-FPM
y configura todo de manera automática,
¡incluyendo descargas, permisos y un primer usuario de WordPress!
¿Por qué es útil este playbook?
- Reduce a cero la intervención manual: Instala y configura todos los servicios que tu WordPress necesita.
- Reproducible, escalable y auditado: Usa el mismo playbook cada vez que quieras un entorno limpio.
- Cambia host, contraseñas y parámetros fácilmente.
El Playbook YAML completo
---
- name: Despliegue automatizado de WordPress con Nginx, PHP y MariaDB
hosts: wordpress_servers
become: yes
vars:
wp_db_name: wordpress
wp_db_user: wp_user
wp_db_password: ChangeMe123!
wp_db_host: localhost
wp_admin_user: admin
wp_admin_password: ChangeAdminPass123!
wp_admin_email: [email protected]
wp_site_url: http://{{ ansible_host }}
wp_site_title: "Mi Nuevo WordPress"
wp_path: /var/www/wordpress
php_packages:
- php-fpm
- php-mysql
- php-curl
- php-gd
- php-mbstring
- php-xml
- php-xmlrpc
- php-soap
- php-intl
- php-zip
tasks:
- name: Instalar paquetes necesarios
apt:
name: ['nginx', 'mariadb-server', 'curl', 'wget'] + "{{ php_packages }}"
state: present
update_cache: yes
- name: Iniciar y habilitar nginx y mariadb
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- nginx
- mariadb
- name: Crear base de datos MariaDB para WordPress
mysql_db:
name: "{{ wp_db_name }}"
state: present
- name: Crear usuario de base de datos y dar privilegios
mysql_user:
name: "{{ wp_db_user }}"
password: "{{ wp_db_password }}"
priv: "{{ wp_db_name }}.*:ALL"
state: present
- name: Descargar la última versión de WordPress
get_url:
url: https://wordpress.org/latest.tar.gz
dest: /tmp/wordpress.tar.gz
- name: Extraer WordPress en /var/www
unarchive:
src: /tmp/wordpress.tar.gz
dest: /var/www/
remote_src: yes
- name: Ajustar permisos de WordPress
file:
path: "{{ wp_path }}"
owner: www-data
group: www-data
state: directory
recurse: yes
- name: Copiar wp-config.php de ejemplo
copy:
src: "{{ wp_path }}/wp-config-sample.php"
dest: "{{ wp_path }}/wp-config.php"
remote_src: yes
force: true
- name: Configurar wp-config.php con datos de la base de datos
lineinfile:
path: "{{ wp_path }}/wp-config.php"
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: "define\\('DB_NAME',.*", line: "define('DB_NAME', '{{ wp_db_name }}');" }
- { regexp: "define\\('DB_USER',.*", line: "define('DB_USER', '{{ wp_db_user }}');" }
- { regexp: "define\\('DB_PASSWORD',.*", line: "define('DB_PASSWORD', '{{ wp_db_password }}');" }
- { regexp: "define\\('DB_HOST',.*", line: "define('DB_HOST', '{{ wp_db_host }}');" }
- name: Configurar virtualhost de nginx para WordPress
copy:
dest: /etc/nginx/sites-available/wordpress
content: |
server {
listen 80;
server_name _;
root {{ wp_path }};
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
notify: Reload nginx
- name: Habilitar sitio WordPress y deshabilitar default
file:
src: /etc/nginx/sites-available/wordpress
dest: /etc/nginx/sites-enabled/wordpress
state: link
force: yes
- name: Eliminar sitio default nginx si existe
file:
path: /etc/nginx/sites-enabled/default
state: absent
handlers:
- name: Reload nginx
service:
name: nginx
state: reloaded
Cómo usar el playbook
- Edita tu
inventory
para añadir tus servidores bajo el grupo[wordpress_servers]
. - Ajusta variables sensibles (usuario/password)
- Ejecuta:
ansible-playbook -i tu_inventario.ini playbook_wordpress.yml
- Entra en
http://IP_DEL_SERVIDOR
y termina wizard de WordPress (primer usuario/admin se crea automáticamente si se modifica el playbook, aquí dejamos paso manual para demostrar flexibilidad).
Consejos y troubleshooting
- ¿Usas una nube con IP dinámica? Reemplaza
server_name _;
por tu dominio. - ¿Instalación muy lenta? Ansible instala bastantes dependencias, ten paciencia la primera vez.
- Si nginx falla al iniciar, revisa el log
/var/log/nginx/error.log
y quephp-fpm
esté corriendo. - Puedes adaptar rápidamente el playbook a otros CMS (Drupal, Joomla) cambiando los pasos de descarga/configuración.
- ¿MariaDB requiere contraseña de root? Añade al módulo
mysql_*
los parámetroslogin_user
ylogin_password
.