Automatiza el despliegue de un servidor WordPress con Ansible (¡en minutos!)

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, instala nginx, 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

  1. Edita tu inventory para añadir tus servidores bajo el grupo [wordpress_servers].
  2. Ajusta variables sensibles (usuario/password)
  3. Ejecuta: ansible-playbook -i tu_inventario.ini playbook_wordpress.yml
  4. 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 que php-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ámetros login_user y login_password.

¿Quieres que automate la instalación de plugins, SSL o reglas de seguridad? ¡Dímelo en los comentarios y traigo el siguiente playbook!

Avatar

Por Mid