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

  1. Configurar el proyecto Ansible Playbook
  2. Generar la estructura de directorios de los roles de Ansible Playbook
  3. Configurar hosts y site.yml
  4. Configurar los roles «comunes» – Configuración básica
  5. Configurar los roles «web» – Configuración de Nginx y PHP-FPM
  6. Configurar los roles «db» – Configuración de la base de datos MySQL
  7. 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.

Estructura del directorio

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.

Configurar hosts y site.yml

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».

  1. Cambiar el repositorio
  2. Actualizar el repositorio
  3. Actualizar los paquetes a la última versión
  4. 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.

Configurar roles comunes

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’:

  1. Instalar Nginx
  2. Instalar PHP-FPM
  3. Configurar php.ini
  4. Crear un host virtual
  5. 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.

Roles web Ansible

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’.

  1. instalar mysql
  2. Crear la base de datos MySQL
  3. Crear el usuario de MySQL
  4. 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.

Configurar los roles de la base de datos

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.

Ejecuta el libro de jugadas de Ansible

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.

Probando

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.

Prueba de la base de datos

Finalmente, el Playbook de Ansible para la instalación y configuración de LEMP Stack ha sido creado y probado con éxito.

Referencia

https://docs.ansible.com/ansible/latest/index.html

También te podría gustar...