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 sistemas operativos Ubuntu.
- 10.5.5.20 ansible
- Disposición 10.5.5.26
- Conocimiento del uso básico de Ansible
- Privilegios de raíz
Qué haremos:
- Configuración del proyecto Ansible Playbook
- Generar la estructura del directorio de roles de Ansible Playbook
- Configurar hosts y site.yml
- Configurar roles 'comunes' - Configuración básica
- Configuración de roles 'web':configuración de Nginx y PHP-FPM
- Configuración de roles 'db':configuración de la base de datos MySQL
- 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 y 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, plantillas y configuraciones personalizadas, 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'. En el directorio del proyecto principal se almacenarán 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:
anfitriones - 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 el grupo de hosts que se administrará con nuestros roles disponibles.
roles - 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 directorio
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 como se muestra a continuación.
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.
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.
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'.
- Cambiar repositorio
- Actualizar repositorio
- Actualizar 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
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.
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':
- Instalar Nginx
- Instalar PHP-FPM
- Configurar php.ini
- Crear un servidor virtual
- Añadir 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.
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:configuración de 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'.
- instalar mysql
- Crear base de datos MySQL
- Crear usuario MySQL
- 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.
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 usando herramientas en línea.
Paso 6:Ejecute el libro de jugadas de Ansible
Vaya al directorio del proyecto Ansible.
cd project-lemp/
Ejecute el siguiente comando ansible-playbook.
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.
Asegúrese de que no recibe 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.
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.
Finalmente, se creó y probó con éxito el libro de jugadas de Ansible para la instalación y configuración de LEMP Stack.