Crear libro de jugadas de Ansible para LEMP Stack

Estructura de directorios

Ansible es una herramienta de automatización simple que automatiza la implementación de aplicaciones de software, el aprovisionamiento en la nube y la gestión de la configuración. Es una herramienta de orquestación de servidores que lo ayuda a administrar y controlar una gran cantidad de nodos de servidores 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, le mostraremos cómo crear un libro de jugadas básico de Ansible para aprovisionar la pila LEMP en el servidor Ubuntu 18.04. Aprenderá cómo crear Ansible Playbook básico que se puede escalar para otras aplicaciones de proyectos PHP como WordPress, Nextcloud, etc.

Requisito previo

  • 2 sistema operativo Ubuntu.
    • 10.5.5.20 ansible
    • 10.5.5.26 provisión
  • Conocimientos de uso básico de Ansible
  • Privilegios de raíz

Lo que haremos:

  1. Configurar el proyecto de libro de jugadas de Ansible
  2. Generar estructura de directorio de roles de Ansible Playbook
  3. Configurar hosts y site.yml
  4. Configurar roles ‘comunes’ – Configuración básica
  5. Configuración de roles ‘web’: configuración de Nginx y PHP-FPM
  6. Configuración de roles ‘db’: configuración de la base de datos MySQL
  7. Pruebas

Paso 1: configurar el proyecto Ansible Playbook

Ansible Playbook es un conjunto de instrucciones que envía para que se ejecuten en un solo servidor o en un grupo de hosts. Representa el aprovisionamiento de 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 de ansible.

Ansible Playbook contiene una configuración básica, incluidos los hosts y la información de usuario de los servidores de provisión, una lista de tareas que se implementará en los servidores de provisión, configuraciones personalizadas y de plantillas, y un grupo de variables que forman parte de plantillas y tareas.

En primer lugar, cree el directorio del proyecto maestro en la máquina ‘ansible-control’. El directorio del proyecto maestro almacenará todos nuestros directorios, archivos y configuraciones del libro de jugadas.

Cree el directorio del proyecto Ansible llamado ‘project-lemp’ y acceda a él.

mkdir project-lemp/
cd project-lemp

Ahora cree un nuevo archivo de configuración ‘hosts’ y ‘site.yml’, luego cree un nuevo directorio llamado ‘roles’.

touch hosts site.yml
mkdir -p roles/

Detalles sobre las configuraciones:

Hospedadores – Es un archivo de inventario que contiene información sobre los servidores administrados por ansible. Le permite crear un grupo de servidores que lo hacen más fácil de administrar y escalar el archivo de inventario en sí. El archivo de inventario se puede crear con muchos formatos diferentes, incluidos los formatos INI y YAML.

sitio.yml – El archivo maestro del libro de jugadas que contiene qué grupo de hosts se administrará con nuestros roles disponibles.

papeles – es un grupo de playbooks de Ansible que se usarán para aprovisionar el servidor. Los roles de ansible tienen sus propias estructuras de directorios, cada rol contendrá directorios como tareas, controladores, vars, etc.

Paso 2: generar funciones de Ansible para la estructura de directorios

En este paso, vamos a generar el directorio de funciones de ansible mediante el comando ansible-galaxy. Generaremos dos roles llamados roles ‘comunes’ y roles ‘web’.

Dentro del directorio ‘project-lemp’, vaya al directorio ‘roles’.

cd roles/

Genere el directorio de estructura de roles y los archivos para los roles ‘comunes’ y ‘web’ ejecutando el siguiente comando ansible-galaxy.

ansible-galaxy init common
ansible-galaxy init web
ansible-galaxy init db

Después de eso, verifique todas las estructuras de directorio de roles de ansible disponibles con el siguiente comando.

tree .

Se le mostrará el resultado de la siguiente manera.

Estructura de directorios

Paso 3: configurar hosts y site.yml

El archivo ‘hosts’ contendrá la lista y el grupo del servidor administrado 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.Advertisement

Edite el archivo ‘hosts’ usando el editor vim.

vim hosts

Pegue la configuración a continuación.

[lemp]
server01 ansible_host=10.5.5.26

Guardar y cerrar.

A continuación, edite el archivo de configuración site.yml.

vim site.yml

Pegue las configuraciones a continuación.

---
- hosts: lemp
remote_user: hakase
become: yes

roles:
- common
- web
- db

Guardar y cerrar.

Configurar hosts y site.yml

Paso 3: configuración de roles comunes

En este paso, vamos a configurar los roles comunes. Y para hacer eso, necesitamos crear una lista de tareas que vamos a hacer.

Debajo de la lista de tareas que vamos a hacer en los roles ‘comunes’.

  1. Cambiar repositorio
  2. Actualizar repositorio
  3. Actualizar paquetes a la última versión
  4. Configurar la zona horaria del servidor

Ahora vaya al directorio ‘común’ y edite la configuración ‘tasks/main.yml’.

cd common/
vim tasks/main.yml

Cree una tarea para cambiar el repositorio, y usaremos el módulo ‘copiar’ 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

Cree una tarea para actualizar el repositorio y actualice todos los paquetes a la última versión usando el módulo ‘apt’.

- name: Update repository and Upgrade packages
  apt:
    upgrade: dist
    update_cache: yes

Ahora cree la tarea para configurar la zona horaria del sistema usando el módulo de zona horaria ansible.

- name: Setup timezone to Asia/Jakarta
  timezone:
    name: Asia/Jakarta
    state: latest

Guardar y cerrar.

Configurar roles comunes

Después de eso, cree una nueva configuración de repositorio ‘sources.list’ dentro del directorio ‘files’.

vim files/sources.list

Elija el repositorio más cercano a la ubicación de su servidor, a continuación está el mío.

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

Guardar y cerrar.

por último, se ha completado la configuración de roles ‘comunes’.

Paso 4 – Configuración de roles ‘web’

En este paso, vamos a configurar los roles ‘web’. Hará algunas tareas, incluida la instalación del servidor web Nginx, PHP-FPM con algunas extensiones básicas y la configuración de 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. Agregar archivo phpinfo

Vaya al directorio ‘web’ y edite el archivo ‘tasks/main.yml’.

cd web/
vim tasks/main.yml

Cree la primera tarea para la instalación de nginx usando el módulo apt.

- name: Install Nginx
  apt:
    name: nginx
    state: latest

Ahora cree la tarea para instalar PHP-FPM con algunas extensiones básicas. Y para la instalación de múltiples paquetes, podemos usar el formato de ‘lista’ de python como 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, agregaremos nuevas líneas a la configuración de php.ini usando el módulo ‘blockinfile’. Y al final de la línea, le notificaremos a 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 usando el módulo ‘plantilla’. El módulo de plantilla copiará la configuración del directorio ‘plantillas’ al servidor remoto. Vamos a copiar la plantilla de host virtual jinja2 ‘vhost.j2’ en el directorio ‘/etc/nginx/sites-enabled/’ y, por último, notificaremos a 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 de eso, crearemos nuevas tareas para crear el directorio raíz web usando el módulo ‘archivo’ y copiaremos la plantilla index.php en él.

- 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

Guardar y cerrar.

Ahora vamos a configurar los controladores para reiniciar el servicio nginx y php-fpm. Edite la configuración ‘handlers/main.yml’ usando el editor vim.

controladores vim/main.yml

Pegue las configuraciones a continuación.

- name: restart nginx
  service:
    name: nginx
    state: restarted
    enabled: yes
- name: restart php-fpm
service:
name: php{{ php_version }}-fpm
state: restarted
enabled: yes

Guardar y cerrar.

Funciones web de Ansible

A continuación, editaremos la configuración de ‘vars/main.yml’. En la parte superior de las configuraciones, notará las configuraciones variables ‘{{ php_version }}’ y ‘{{ domain_name }}’. Esas variables representan la configuración de nuestro entorno para la versión de php y el nombre de dominio que se utilizará. La variable hace que ansible sea más reutilizable porque solo necesitamos editar la configuración de la variable ‘vars/main.yml’ y no editar la configuración base.

Edite la configuración de variables ‘vars/main.yml’ usando el editor vim.

vim vars/main.yml

Pegue las configuraciones a continuación.

php_version: 7.2
domain_name: hakase-labs.io

Guardar y cerrar.

Ahora crearemos las configuraciones de plantilla jinja2 ‘index.php.j2’ y ‘vhost.j2’ en el directorio ‘templates/’.

vim templates/index.php.j2

Pegue la configuración a continuación.

<html>
<body>
<h1><center>index.html for domain {{ domain_name }}</center></h1>

<p>
<p>

<?php
phpinfo();
?>

</body>
</html>

Guardar y cerrar.

Después de eso, cree la plantilla para la configuración de host virtual nginx ‘vhost.j2’.

vim templates/vhost.j2

Pegue las configuraciones a continuación.

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;
}

}

Guarde y cierre la configuración, y hemos terminado la configuración de 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 se realizarán en los roles ‘db’.

  1. instalar mysql
  2. Crear base de datos MySQL
  3. Crear usuario MySQL
  4. reiniciar mysql

Vaya al directorio ‘db’ y edite la configuración ‘tasks/main.yml’.

cd db/
vim tasks/main.yml

Ahora instale los paquetes MySQL usando 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

Luego cree nuevas tareas para crear la base de datos MySQL y el usuario, luego otorgue 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

Guardar y cerrar.

Configurar roles de base de datos

A continuación, edite la configuración ‘handlers/main.yml’.

vim handlers/main.yml

Pegue la configuración de la tarea para reiniciar el servicio MySQL.

- name: restart mysql
  service:
    name: mysql
    state: restarted
    enabled: yes

Guardar y cerrar.

Después de eso, edite la configuración de la variable vars ‘vars/main.yml’.

vim vars/main.yml

Pegue estas variables para la base de datos MySQL y la configuración de usuario a continuación.

db_name: hakase-db
db_user: hakase
db_pass: '*C960D382DB42E57D3BAC33891CF87900DCB1A869'

Guardar y cerrar.

La variable ‘db_pass’ tiene la contraseña cifrada de MySQL y puede generar una contraseña cifrada de MySQL utilizando herramientas en línea.

Paso 6: ejecute el libro de jugadas de Ansible

Vaya al directorio del proyecto Ansible.

cd project-lemp/

Ejecute el comando ansible-playbook a continuación.

ansible-playbook -i hosts site.yml

Ahora el ansible ejecutará todos los roles que le asignemos al host. Cuando esté completo, se le mostrará el resultado como se muestra a continuación.

Ejecute el libro de jugadas de Ansible

Asegúrate de no obtener ningún error.

Paso 7 – Prueba

Abra su navegador web y escriba el nombre de dominio en la barra de direcciones http://hakase-labs.io.

Y se le mostrará la página de índice con phpinfo como se muestra a continuación.

Pruebas

PHP-FPM y Nginx están funcionando.

A continuación, vuelva a la terminal del servidor e inicie sesión en el servidor MySQL con el usuario y la contraseña que hemos creado en la variable de roles ‘mysql’.

mysql -u hakase -p
PASSWORD: hakasepass

verifique la lista de bases de datos propiedad del usuario.

show databases;

Y se conectará al shell de MySQL y se le mostrará la base de datos llamada ‘hakase-db’ en la lista.

Prueba de base de datos

Finalmente, se creó y probó con éxito el libro de jugadas de Ansible para la instalación y configuración de LEMP Stack.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *