Mi Blog

No te olvides seguirme en Facebook.

Tan solo tienes que hacer click en Me Gusta

 

 

x

Cómo desplegar Wordpress con Ansible

Cómo desplegar Wordpress con Ansible

(Tiempo estimado: 9 - 17 minutos)

Desplegar un servidor LAMP (o millones) es sumamente sencillo con Ansible. Ansible se ha convertido en una de las principales herramientas que usan los DevOPS para la administración de servidores con la que podemos realizar la orquestación de cualquier número de máquinas. Permite realizar el aprovisionamiento de servidores y su personalización, realizando cualquier tipo de tarea de instalación de software adicional que se necesite en las máquinas, la configuración de los servicios y el despliegue de aplicaciones.

Seguid leyendo y os enseñaré a desplegar un servidor LAMP con Wordpress con Ansible...

 

 

¿QUÉ ES ANSIBLE?

Ansible es una plataforma de software libre para configurar y administrar ordenadores. Combina instalación multi-nodo (es decir: permite desplegar configuraciones de servidores y servicios por lotes), ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como una herramienta de orquestación. Gestiona nodos a través de SSH y no requiere ningún software remoto adicional (excepto Python 2.4 o posterior​ para instalarlo). Dispone de módulos que trabajan sobre JSON y la salida estándar puede ser escrita en cualquier lenguaje. Nativamente utiliza YAML para describir configuraciones reusables de los sistemas.

Ventajas:

  • No necesita instalar agentes
  • Sólo se necesita tener instalado Python en los equipos administrados
  • Gran biblioteca pública de módulos para aumentar su funcionalidad

 

Web: https://www.ansible.com/

 

 

Desplegar Wordpress con Ansible es cosa de niños!

 

 

1.- ELEMENTOS NECESARIOS PARA ESTE TUTORIAL

 

 

2.- PASOS PREVIOS

Para entender como funciona Ansible, recomiendo revisar el siguiente tutorial donde muestro Cómo instalar y configurar Ansible en GNU/Linux. Es recomendable revisarlo ya que hay pasos que en este tutorial voy a pasar por alto.

 

 

3.- ESTRUCTURA DE DIRECTORIOS Y FICHEROS

Aunque la estructura de directorios en un entorno de producción debería ser mas completo y estructurado, en este ejemplo solamente quiero mostrar el uso de los Playbooks y como hacer un despliegue de forma casi automática de un servidor LAMP con Wordpress gracias a Ansible.

La estructura de ficheros y directorios a usar en ese tutorial será la siguiente:

ansible@debian:~/wordpress$ tree
.
├── create-lamp-playbook.yml
└── vars
└── default.yml

1 directory, 2 files

4.- CONFIGURACIÓN DE ANSIBLE

En este ejemplo, la configuración de Ansible es muy sencilla, ya que solamente tenemos un único equipo remoto con GNU/Linux Debian instalado. Añadiremos en /etc/ansible/hosts el nombre del grupo y los equipos que queremos manejar, en este caso solamente uno. Añadiremos las siguientes líneas:

[webserver]
192.168.1.47

 

 

5.- VARIABLES DEL PLAYBOOK

Crearemos el fichero vars/default.yml dentro del directorio raíz wordpress con las variables necesarias a utilizar posteriormente en el Playbook. Las variables, por supuesto, pueden ser editadas:

DOCUMENT_ROOT_DIR: "/var/www/html/"
MARIADB_ADMIN_USER: "root"
MARIADB_ADMIN_PASSWORD: "root"
MARIADB_HOST: "localhost"
MARIADB_DBNAME: "wp"
MARIADB_USERNAME: "wpuser"
MARIADB_USERPASSWD: "wppassword"

 

 

6.- CREACIÓN DEL PLAYBOOK

Crearemos el fichero Playbook que será como un script para Ansible en YAML, donde indicaremos paso a paso lo que queremos hacer en el equipo remoto. En este ejemplo crearemos el fichero create-lamp-playbook.yml e iremos añadiendo poco a poco el siguiente contenido. Existen muchas formas de hacerlo y aquí simplemente estamos viendo un poco la potencia de los Playbooks con Ansible y su uso básico.

En la primera sección del Playbook le indicamos el grupo de hosts sobre el cual hará el despliegue de wordpress y las variables a utilizar en el resto del Playbook. También, con "become" le indicamos que en el equipo remoto se utilice el usuario root para ejecutar los comandos:

---
- hosts: webserver
become: yes
vars_files:
- vars/default.yml

 

 

En el siguiente paso, dentro de la sección tasks: , iremos indicando los pasos o tareas a ejecutar. La primera de ellas es instalar los paquetes necesarios para que Wordpress funcione:

 tasks:

# Install required packages for Wordpress
- name: Install required packages
apt:
name:
- apache2
- mariadb-server
- libapache2-mod-php
- php-mysql
state: latest

 

 

Ahora crearemos el directorio Document Root (por si no existe) y nos aseguramos que el propietario y el grupo del Document Root sea www-data y con los permisos correctos 0755:

# Create Document Root folder
- name: Create document root
file:
path: '{{ DOCUMENT_ROOT_DIR }}'
state: directory
owner: 'www-data'
group: 'www-data'
mode: 0755

 

 

Ahora descargaremos Wordpress de la página web oficial y lo descomprimiremos en el Document Root eliminando el primer nivel de directorios del fichero comprimido:

# Download WordPress and uncompress
- name: Download and unpack latest WordPress
unarchive:
src: https://wordpress.org/latest.tar.gz
dest: '{{ DOCUMENT_ROOT_DIR }}'
remote_src: yes
extra_opts: [--strip-components=1]

 

 

Ahora cambiaremos el propietario y el grupo de todos los ficheros bajo el Document Root. En GNU/Linux Debian el usuario de Apache es www-data y el grupo www-data:

# Set permissions for Document_Root
- name: Set ownership
file:
path: '{{ DOCUMENT_ROOT_DIR }}'
state: directory
recurse: yes
owner: 'www-data'
group: 'www-data'

 

 

Por defecto, Apache buscará en el directorio raíz por un fichero index.html, pero nosotros queremos que sea index.php. Para ello, si no queremos usar los templates de Ansible, podemos "buscar y reemplazar" dentro de la configuración de Apache:

# Configure Apache
- name: Configure Apache Configuration
replace:
dest='/etc/apache2/mods-available/dir.conf'
regexp='DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm'
replace='DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm'
 

 

 

Tras los cambios anteriores, reiniciamos Apache para que se apliquen los cambios de configuración:

# Restart Apache server service
- name: Restart service apache2
service:
name: apache2
state: restarted

 

 

Ahora crearemos la base de datos para Wordpress:

# Create MariaDB Database
- name: Creates database for WordPress
mysql_db:
name: '{{ MARIADB_DBNAME }}'
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
state: present

 

 

Para evitar problemas de permisos anteriores, eliminaremos los permisos del usuario asignado a la base de datos de Wordpress para dicha base de datos:

# Remove MariaDB grants for Wordpress user
- name: Remove grants for wordpress user
mysql_user:
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
name: '{{ MARIADB_USERNAME }}'
password: '{{ MARIADB_USERPASSWD }}'
priv: '{{ MARIADB_DBNAME }}.*:ALL'
state: absent

 

 

Y ahora crearemos los permisos para el usuario de la base de datos asignado a Wordpress:

# Create MariaDB User
- name: Create MariaDB user for WordPress
mysql_user:
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
name: '{{ MARIADB_USERNAME }}'
password: '{{ MARIADB_USERPASSWD }}'
priv: '{{ MARIADB_DBNAME }}.*:ALL'
state: present

 

 

A continuación el Playbook completo:

---
- hosts: webserver
become: yes
vars_files:
- vars/default.yml
tasks:

# Install required packages for Wordpress
- name: Install required packages
apt:
name:
- apache2
- mariadb-server
- libapache2-mod-php
- php-mysql
state: latest

# Create Document Root folder
- name: Create document root
file:
path: '{{ DOCUMENT_ROOT_DIR }}'
state: directory
owner: 'www-data'
group: 'www-data'
mode: 0755

# Download WordPress and uncompress
- name: Download and unpack latest WordPress
unarchive:
src: https://wordpress.org/latest.tar.gz
dest: '{{ DOCUMENT_ROOT_DIR }}'
remote_src: yes
extra_opts: [--strip-components=1]

# Set permissions for Document_Root
- name: Set ownership
file:
path: '{{ DOCUMENT_ROOT_DIR }}'
state: directory
recurse: yes
owner: 'www-data'
group: 'www-data'

# Configure Apache
- name: Configure Apache Configuration
replace:
dest='/etc/apache2/mods-available/dir.conf'
regexp='DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm'
replace='DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm'

# Restart Apache server service
- name: Restart service apache2
service:
name: apache2
state: restarted

# Create MariaDB Database
- name: Creates database for WordPress
mysql_db:
name: '{{ MARIADB_DBNAME }}'
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
state: present

# Remove MariaDB grants for Wordpress user
- name: Remove grants for wordpress user
mysql_user:
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
name: '{{ MARIADB_USERNAME }}'
password: '{{ MARIADB_USERPASSWD }}'
priv: '{{ MARIADB_DBNAME }}.*:ALL'
state: absent

# Create MariaDB User
- name: Create MariaDB user for WordPress
mysql_user:
login_user: '{{ MARIADB_ADMIN_USER }}'
login_password: '{{ MARIADB_ADMIN_PASSWORD }}'
name: '{{ MARIADB_USERNAME }}'
password: '{{ MARIADB_USERPASSWD }}'
priv: '{{ MARIADB_DBNAME }}.*:ALL'
state: present
...

 

 

7.- EJECUTAR EL PLAYBOOK

Ahora es momento de probar el Playbook y ver si todo funciona como queremos. Para ejecutarlo, es tan sencillo como ejecutar el siguiente comando: 

ansible@debian:~/wordpress$ ansible-playbook create-lamp-playbook.yml

 

 

A continuación, veremos como se van ejecutando poco a poco cada uno de los pasos. Al final, se mostrará un mensaje con los fallos y los pasos correctos:

PLAY [webserver] ******************************

TASK [Gathering Facts] ************************
ok: [192.168.1.47]

TASK [Install required packages] **************
changed: [192.168.1.47]

TASK [Create document root] *******************
changed: [192.168.1.47]

TASK [Download and unpack latest WordPress] ***
changed: [192.168.1.47]

TASK [Set ownership] **************************
changed: [192.168.1.47]

TASK [Configure Apache Configuration] *********
changed: [192.168.1.47]

TASK [Restart service apache2] ****************
changed: [192.168.1.47]

TASK [Creates database for WordPress] *********
ok: [192.168.1.47]

TASK [Remove grants for Wordpress user] *******
ok: [192.168.1.47]

TASK [Create MariaDB user for WordPress] ********
changed: [192.168.1.47]

PLAY RECAP ************************************
192.168.1.47 : ok=10 changed=7 unreachable=0 failed=0

 

 

8.- ACCEDER A WORDPRESS

Por último, accederemos a la IP del servidor remoto a través de un navegador web y comprobaremos que Wordpress ha sido instalado y desplegado de forma correcta. Solamente nos queda comenzar la instalación utilizando los parámetros de configuracion del fichero vars/default.yml y tendremos Wordpress instalado de forma rápida y sencilla: 

Desplegar Wordpress con AnsibleAsistente de instalación Wordpress

 

 

En la siguiente imagen vemos como la instalación de Wordpress se ha realizado de forma correcta:

Desplegar Wordpress con AnsibleWordpress instalado

 

 

ENJOY!


Raúl Prieto Fernández

Sitio Web: raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

No tienes permisos para escribir comentarios. Debes autenticarte con Facebook, Linkedin, Twitter o Google.