Guía Ansible: Crear un Playbook Ansible para la pila LEMP
Ansible es una sencilla herramienta de automatización que automatiza el despliegue de aplicaciones de software, el aprovisionamiento de la nube y la gestión de la configuración. Es una herramienta de orquestación de servidores que te ayuda a gestionar y controlar un gran número de nodos de servidor desde lugares únicos llamados «Máquinas de Control». Ansible fue creado por Michael DeHaan en 2012 y está escrito en Python y Powershell.
En este tutorial, vamos a mostrarte cómo crear un Playbook Ansible básico para aprovisionar la Pila LEMP en el Servidor Ubuntu 18.04. Aprenderás a crear un Playbook Ansible básico que puede ser escalado para otras aplicaciones de proyectos PHP como WordPress, Nextcloud, etc.
Requisito previo
- 2 Sistema operativo Ubuntu.
- 10.5.5.20 ansible
- Provisión 10.5.5.26
- Conocimiento del uso básico de Ansible
- Privilegios de root
Qué vamos a hacer
- Configurar el proyecto Ansible Playbook
- Generar la estructura de directorios de los roles de Ansible Playbook
- Configurar hosts y site.yml
- Configurar los roles «comunes» – Configuración básica
- Configurar los roles «web» – Configuración de Nginx y PHP-FPM
- Configurar los roles «db» – Configuración de la base de datos MySQL
- Prueba de
Paso 1 – Configurar el proyecto Ansible Playbook
Ansible Playbook es un conjunto de instrucciones que envías para que se ejecuten en un solo servidor o en un grupo de ellos. Representa el aprovisionamiento ansible, donde la automatización se define como tareas, y todos los trabajos como la instalación de paquetes, la edición de archivos, serán realizados por módulos ansible.
El Playbook de Ansible contiene una configuración básica, que incluye información sobre los hosts y los usuarios de los servidores de aprovisionamiento, una lista de tareas que se implementarán en los servidores de aprovisionamiento, configuraciones de plantillas y personalizadas, y un grupo de variables que forman parte de las plantillas y las tareas.
En primer lugar, crea el directorio del proyecto maestro en la máquina «ansible-control». En el directorio del proyecto maestro se almacenarán todos los directorios, archivos y configuraciones de nuestro playbook.
Crea el directorio del proyecto Ansible llamado ‘project-lemp’ y entra en él.
mkdir project-lemp/
cd project-lemp
Ahora crea un nuevo archivo de configuración ‘hosts’ y ‘site.yml’, y luego crea un nuevo directorio llamado ‘roles’.
touch hosts site.yml
mkdir -p roles/
Detalles sobre las configuraciones:
hosts – Es un archivo de inventario que contiene información sobre los servidores gestionados por ansible. Te permite crear un grupo de servidores que te facilita la gestión y el escalado del propio archivo de inventario. El archivo de inventario puede crearse con muchos formatos diferentes, incluidos los formatos INI y YAML.
site.yml – Es el archivo maestro del libro de jugadas que contiene el grupo de hosts que serán gestionados utilizando nuestros roles disponibles.
roles – es un grupo de playbooks de Ansible que se utilizarán para aprovisionar el servidor. Los roles de Ansible tienen sus propias estructuras de directorios, cada rol contendrá directorios como tareas, handlers, vars, etc.
Paso 2 – Generar roles Ansible para la estructura de directorios
En este paso, vamos a generar el directorio de roles ansible utilizando el comando ansible-galaxy. Generaremos dos de los roles llamados ‘común’ y ‘web’.
Dentro del directorio ‘project-lemp’, ve al directorio ‘roles’.
cd roles/
Genera el directorio y los archivos de la estructura de roles para los roles «común» y «web» ejecutando el siguiente comando ansible-galaxy.
ansible-galaxy init common
ansible-galaxy init web
ansible-galaxy init db
Después, comprueba todas las estructuras de directorios de roles ansible disponibles utilizando el siguiente comando.
tree .
Se te mostrará el resultado como se indica a continuación.
Paso 3 – Configurar hosts y site.yml
El archivo ‘hosts’ contendrá la lista y el grupo del servidor gestionado por Ansible. Para esta guía, crearemos un grupo llamado ‘lemp’ con el miembro llamado ‘server01’ y la dirección IP 10.5.5.26.
Edita el archivo ‘hosts’ con el editor vim.
vim hosts
Pega la configuración de abajo.
[lemp]
server01 ansible_host=10.5.5.26
Guarda y cierra.
A continuación, edita el archivo de configuración site.yml.
vim site.yml
Pega la configuración de abajo.
---
- hosts: lemp
remote_user: hakase
become: yes
roles:
- common
- web
- db
Guarda y cierra.
Paso 3 – Configurar los roles comunes
En este paso, vamos a configurar los roles comunes. Y para ello, necesitamos crear una lista de tareas que vamos a realizar.
A continuación la lista de tareas que vamos a hacer en los roles «comunes».
- Cambiar el repositorio
- Actualizar el repositorio
- Actualizar los paquetes a la última versión
- Configurar la zona horaria del servidor
Ahora ve al directorio ‘común’ y edita la configuración ‘tasks/main.yml’.
cd common/
vim tasks/main.yml
Crea una tarea para cambiar el repositorio, y utilizaremos el módulo ‘copy’ que copiará la base ‘sources.list’ en el directorio ‘files’ al host remoto ‘/etc/apt/’.
- name: Change repository Ubuntu 18.04Step 4 - Setup 'web' Roles
copy:
src: sources.list
dest: /etc/apt/
backup: yes
Crea una tarea para actualizar el repositorio y actualizar todos los paquetes a la última versión utilizando el módulo ‘apt’.
- name: Update repository and Upgrade packages
apt:
upgrade: dist
update_cache: yes
Ahora crea la tarea para configurar la zona horaria del sistema utilizando el módulo ansible timezone.
- name: Setup timezone to Asia/Jakarta
timezone:
name: Asia/Jakarta
state: latest
Guarda y cierra.
Después, crea una nueva configuración del repositorio ‘sources.list’ dentro del directorio ‘files’.
vim files/sources.list
Elige el repositorio más cercano a la ubicación de tu servidor, el mío es el siguiente.
deb http://buaya.klas.or.id/ubuntu/ bionic main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-updates main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic universe
deb http://buaya.klas.or.id/ubuntu/ bionic-updates universe
deb http://buaya.klas.or.id/ubuntu/ bionic multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-updates multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-backports main restricted universe multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-security main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-security universe
deb http://buaya.klas.or.id/ubuntu/ bionic-security multiverse
Guarda y cierra.
Por último, se ha completado la configuración de los roles ‘comunes’.
Paso 4 – Configurar los roles ‘web’
En este paso, vamos a configurar los roles ‘web’. Haremos algunas tareas, como instalar el servidor web Nginx, PHP-FPM con algunas extensiones básicas, y configurar el PHP-FPM con Nginx.
A continuación se detallan las tareas que realizaremos en los roles ‘web’:
- Instalar Nginx
- Instalar PHP-FPM
- Configurar php.ini
- Crear un host virtual
- Añadir el archivo phpinfo
Ve al directorio ‘web’ y edita el archivo ‘tasks/main.yml’.
cd web/
vim tasks/main.yml
Crea la primera tarea para la instalación de nginx utilizando el módulo apt.
- name: Install Nginx
apt:
name: nginx
state: latest
Ahora crea la tarea para la instalación de PHP-FPM con algunas extensiones básicas. Y para la instalación de múltiples paquetes, podemos utilizar el formato de ‘lista’ de python como el que se muestra a continuación.
- name: Instal PHP-FPM
apt:
name: ['php','php-fpm','php-common','php-cli','php-curl']
state: latest
A continuación, añadiremos nuevas líneas a la configuración de php.ini utilizando el módulo ‘blockinfile’. Y al final de la línea, notificaremos al ansible que reinicie el servicio php-fpm después de configurar el archivo php.ini.
- name: Configure php.ini
blockinfile:
dest: /etc/php/{{ php_version }}/fpm/php.ini
block: |
date.time = Asia/Jakarta
cgi-fix_pathinfo = 0
backup: yes
notify: restart php-fpm
Ahora copiaremos la configuración del host virtual nginx utilizando el módulo ‘template’. El módulo ‘template’ copiará la configuración del directorio ‘templates’ al servidor remoto. Vamos a copiar la plantilla del host virtual jinja2 ‘vhost.j2’ al directorio ‘/etc/nginx/sites-enabled/’, y por último notificaremos al ansible que reinicie el servicio nginx.
- name: Create Nginx virtual host
template:
src: vhost.j2
dest: /etc/nginx/sites-enabled/vhost-{{ domain_name }}
notify: restart nginx
Después, crearemos nuevas tareas para crear el directorio raíz de la web utilizando el módulo ‘file’ y copiaremos en él la plantilla index.php.
- name: Create web-root directory
file:
path: /var/www/{{ domain_name }}
state: directory
- name: Upload index.html and info.php files
template:
src: index.php.j2
dest: /var/www/{{ domain_name }}/index.php
Guarda y cierra.
Ahora vamos a configurar los manejadores para reiniciar el servicio nginx y php-fpm. Edita la configuración de ‘handlers/main.yml’ con el editor vim.
vim handlers/main.yml
Pega las configuraciones de abajo.
- name: restart nginx
service:
name: nginx
state: restarted
enabled: yes
- name: restart php-fpm
service:
name: php{{ php_version }}-fpm
state: restarted
enabled: yes
Guarda y cierra.
A continuación, editaremos la configuración ‘vars/main.yml’. En la parte superior de las configuraciones observarás las variables de configuración ‘{{ php_version }}’ y ‘{{ domain_name }}’. Estas variables representan nuestra configuración de entorno para la versión de php y el nombre de dominio que se utilizará. Las variables hacen que Ansible sea más reutilizable porque sólo tenemos que editar la configuración de variables ‘vars/main.yml’ y no editar la configuración base.
Edita la configuración de variables ‘vars/main.yml’ utilizando el editor vim.
vim vars/main.yml
Pega las configuraciones de abajo.
php_version: 7.2
domain_name: hakase-labs.io
Guarda y cierra.
Ahora crearemos las configuraciones de las plantillas jinja2 ‘index.php.j2’ y ‘vhost.j2’ en el directorio ‘templates/’.
vim templates/index.php.j2
Pega la configuración de abajo.
<html>
<body>
<h1><center>index.html for domain {{ domain_name }}</center></h1>
<p>
<p>
<?php
phpinfo();
?>
</body>
</html>
Guarda y cierra.
A continuación, crea la plantilla para la configuración del host virtual nginx ‘vhost.j2’.
vim templates/vhost.j2
Pega la configuración abajo.
server {
listen 80;
listen [::]:80;
root /var/www/{{ domain_name }};
index index.php index.html index.htm index.nginx-debian.html;
server_name {{ domain_name }};
location / {
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php{{ php_version }}-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Guarda y cierra la configuración, y habremos terminado la configuración de los roles web.
Paso 5 – Configurar los roles ‘db’
En este paso, vamos a configurar los roles ‘db’ para la instalación y configuración de la base de datos MySQL.
A continuación se detallan las tareas que haremos sobre los roles ‘db’.
- instalar mysql
- Crear la base de datos MySQL
- Crear el usuario de MySQL
- reiniciar mysql
Ve al directorio ‘db’ y edita la configuración ‘tasks/main.yml’.
cd db/
vim tasks/main.yml
Ahora instala los paquetes de MySQL utilizando el módulo ‘apt’ y el formato ‘list’ de python para la instalación de múltiples paquetes.
- name: Install MySQL
apt:
name: ['mysql-server','mysql-client','python-mysqldb']
state: latest
notify: restart mysql
A continuación, crea nuevas tareas para crear la base de datos MySQL y el usuario, y concede todos los privilegios del usuario a la base de datos.
- name: Create database
mysql_db:
name: '{{ db_name }}'
state: present
- name: Create user for the database
mysql_user:
name: '{{ db_user }}'
password: '{{ db_pass }}'
encrypted: yes
priv: '{{ db_name }}.*:ALL'
state: present
Guarda y cierra.
A continuación, edita la configuración de ‘handlers/main.yml’.
vim handlers/main.yml
Pega la configuración de la tarea para reiniciar el servicio MySQL.
- name: restart mysql
service:
name: mysql
state: restarted
enabled: yes
Guarda y cierra.
A continuación, edita la configuración de las variables vars/main.yml.
vim vars/main.yml
Pega estas variables para la configuración de la base de datos MySQL y del usuario de abajo.
db_name: hakase-db
db_user: hakase
db_pass: '*C960D382DB42E57D3BAC33891CF87900DCB1A869'
Guarda y cierra.
La variable ‘db_pass’ tiene la contraseña encriptada de MySQL, y puedes generar una contraseña encriptada de MySQL utilizando herramientas online.
Paso 6 – Ejecuta el Playbook de Ansible
Ve al directorio del proyecto Ansible.
cd project-lemp/
Ejecuta el comando ansible-playbook que aparece a continuación.
ansible-playbook -i hosts site.yml
Ahora el ansible ejecutará todos los roles que asignemos al host. Cuando se complete, se te mostrará el resultado que aparece a continuación.
Asegúrate de que no obtienes ningún error.
Paso 7 – Prueba
Abre tu navegador web y escribe el nombre del dominio en la barra de direcciones http://hakase-labs.io.
Y se te mostrará la página índice con phpinfo como se indica a continuación.
El PHP-FPM y Nginx están funcionando.
A continuación, vuelve al terminal del servidor y entra en el servidor MySQL utilizando el usuario y la contraseña que hemos creado en la variable de roles ‘mysql’.
mysql -u hakase -p
PASSWORD: hakasepass
Comprueba la lista de bases de datos que posee el usuario.
show databases;
Y entrarás en la shell de MySQL y te aparecerá la base de datos llamada ‘hakase-db’ en la lista.
Finalmente, el Playbook de Ansible para la instalación y configuración de LEMP Stack ha sido creado y probado con éxito.