Cómo automatizar implementaciones simultáneas de WordPress en múltiples servidores Linux usando Ansible - Parte 3


En los dos artículos anteriores de esta serie de Ansible, explicamos cómo instalar y configurar Ansible para ejecutar comandos y realizar tareas complejas en varios servidores remotos simultáneamente.

En el tutorial actual explicaremos cómo configurar WordPress en los mismos servidores remotos:

node1: 192.168.0.29
node2: 192.168.0.30

donde instalamos, habilitamos e iniciamos Apache (probablemente ya sepa por qué elegimos trabajar con un servidor web como ejemplo inicial en el último tutorial).

Le recomiendo que lea la Parte 1 y la Parte 2 antes de continuar para asegurarse de que está familiarizado con los conceptos asociados con Ansible.

Paso 1: Introducción de roles de Ansible

A medida que comience a agregar más y más tareas a las obras, sus Playbooks pueden volverse cada vez más difíciles de manejar. Por esa razón, el enfoque recomendado en esas situaciones (en realidad, en todos los casos) es usar una estructura de directorio que contenga las directivas para cada grupo de tareas en archivos distintos.

Este enfoque nos permite reutilizar estos archivos de configuración en proyectos separados más adelante. Cada uno de estos archivos define lo que en el ecosistema de Ansible se llama un rol.

En nuestro caso, crearemos dos roles. Uno de ellos (llamado wp-dependencies) se utilizará para instalar las dependencias de WordPress (PHP y MariaDB; no es necesario instalar Apache, ya que ya está instalado).

El otro rol (llamado wp-install-config) incluirá todas las tareas necesarias asociadas con la instalación y configuración de WordPress.

Paso 2: creación de roles de Ansible

Ansible viene con una utilidad llamada ansible-galaxy que nos ayudará a crear la estructura de directorios para nuestros roles. Haremos esto en/etc/ansible/playbooks (que creamos en la Parte 2) pero, en teoría, puede configurarlo en otro directorio si lo desea.

# cd /etc/ansible/playbooks
# ansible-galaxy init wp-dependencies
# ansible-galaxy init wp-install-config

A continuación, confirma los roles recién creados.

# ls -R /etc/ansible/playbooks

En la imagen de arriba podemos ver que ansible-galaxy creó dos directorios con el mismo nombre que nuestros roles, y otros subdirectorios (predeterminados, archivos, manejadores, meta, tareas, plantillas y vars) y un archivo README.md dentro de cada uno de ellos.

Además, se creó un archivo YAML llamado main.yml dentro de todos los directorios enumerados anteriormente, con la excepción de archivos y plantillas.

Comenzaremos por editar los siguientes archivos de configuración como se indica:

1. /etc/ansible/playbooks/wp-dependencies/tasks/main.yml. Tenga en cuenta que incluimos httpd en caso de que no haya seguido los tutoriales anteriores de esta serie.

---
# tasks file for wp-dependencies
- name: Update packages (this is equivalent to yum update -y)
  yum: name=* state=latest

- name: Install dependencies for WordPress
  yum: name={{ item }} state=present
  with_items:
        - httpd
        - mariadb-server 
        - mariadb
        - php 
        - php-mysql
        - MySQL-python

- name: Ensure MariaDB is running (and enable it at boot)
  service: name=mariadb state=started enabled=yes

- name: Copy ~/.my.cnf to nodes
  copy: src=/root/.my.cnf dest=/root/.my.cnf

- name: Create MariaDB database
  mysql_db: name={{ wp_mysql_db }} state=present

- name: Create MariaDB username and password
  mysql_user:
        login_user=root
        login_password=YourMariaDBRootPasswordHere
        name={{ wp_mysql_user }}
        password={{ wp_mysql_password }}
        priv=*.*:ALL

2. /etc/ansible/playbooks/wp-dependencies/defaults/main.yml

---
# defaults file for wp-dependencies
  wp_mysql_db: MyWP
  wp_mysql_user: wpUser
  wp_mysql_password: wpP4ss

3. /etc/ansible/playbooks/wp-install-config/tasks/main.yml:

---
# tasks file for wp-install-config
- name: Create directory to download WordPress
  command: mkdir -p /opt/source/wordpress

- name: Download WordPress
  get_url: url=https://www.wordpress.org/latest.tar.gz dest=/opt/source/wordpress/wordpress.tar.gz validate_certs=no

- name: Extract WordPress
  command: "tar xzf /opt/source/wordpress/wordpress.tar.gz -C /var/www/html --strip-components 1"

- name: Send config file
  copy: src=/root/wp-config-sample.php dest=/var/www/html/wp-config.php mode=0644

4. wp-config-sample.php (proporcionado en este Pastebin) de la siguiente manera y guárdelo en su máquina controladora Ansible (como puede ver en la última directiva de copia anterior, lo descargué en el directorio de inicio del superusuario (/ root /wp-config-sample.php).

Importante: tenga en cuenta que el valor de las variables DB_NAME, DB_USER y DB_PASSWORD es el mismo que en /etc/ansible/playbooks/wp-dependencies/defaults/main.yml:

…
/** The name of the database for WordPress */
define('DB_NAME', 'MyWP');

/** MySQL database username */
define('DB_USER', 'wpUser');

/** MySQL database password */
define('DB_PASSWORD', 'wpP4ss');
…

5. Para nuevas instalaciones de servidor de base de datos donde la contraseña de root está vacía, como en este caso, desafortunadamente necesitamos configurar la contraseña para el usuario root individualmente en cada máquina a través de mysql_secure_installation.

Hasta donde yo sé, no hay una solución alternativa disponible que le permita configurar la contraseña de root a través de Ansible en el mismo paso en el que crea la cuenta de la base de datos administrativa para WordPress.

Asegúrese de usar la misma contraseña en todos los hosts, luego copie las credenciales en /root/.my.cnf (la ubicación real puede diferir en su caso, pero en todos los casos debe coincidir con el valor del parámetro src para la tarea Copie ~/.my.cnf a los nodos en /etc/ansible/playbooks/wp-dependencies/tasks/main.yml).

En ese archivo (ver arriba) asumimos que la contraseña de root es YourMariaDBRootPassword.

6. A continuación, nuestro libro de jugadas (/etc/ansible/playbooks/playbook.yml) se verá mucho más organizado y simple en comparación con el tutorial anterior:

# cat playbook.yml
- hosts: webservers
  roles:
        - wp-dependencies
        - wp-install-config

Finalmente, es hora de ejecutar estas tareas invocando nuestro libro de jugadas:

# ansible-playbook playbook.yml

Ahora, verifiquemos si podemos acceder a la página de administración de WordPress usando las direcciones IP de node1 192.168.0.29 y node2 192.168.0.30:

Puede ver los dos últimos pasos en el siguiente screencast:

Como puede ver, puede configurar múltiples instalaciones de WordPress con poco o ningún esfuerzo usando Ansible. Luego, puede utilizar la interfaz de usuario de administrador correspondiente para configurar cada sitio por separado.

Consideraciones finales

Si está utilizando otra distribución para implementar WordPress, el nombre de los paquetes puede variar, pero todo se reduce a instalar el servidor web Apache, el servidor de base de datos MariaDB y el módulo Python MySQL. Si ese es el caso, use el sistema de administración de software de su distribución para buscar el nombre exacto del paquete que necesita instalar.

Resumen

En esta serie, hemos explicado cómo usar Ansible para ejecutar comandos y ejecutar tareas complejas en varias máquinas Linux simultáneamente.

Uno de esos ejemplos es la configuración de WordPress, como hemos comentado en esta guía. Ya sea que sea un administrador de sistemas o un blogger, espero que los conceptos y ejemplos de este tutorial le hayan resultado útiles.

¡Mucha suerte y no dude en escribirnos si necesita ayuda o tiene algún comentario o sugerencia!