ANSIBLE

De La Wiki de KiVi
Ansible
Ansible
DefiniciónA gathering space to build automation skills and success
Enlaces
Webhttps://www.ansible.com/
Documentaciónhttps://docs.ansible.com/ansible

Introducción

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 re-usables de los sistemas.

En resumen, ansible se ejecuta desde un equipo y se conecta por SSH al resto de una serie de equipos definidos en un fichero de inventario y sin necesitar de tener ningún cliente previamente configurado. Con Ansible podremos instalar programas, guardar configuraciones de los equipos clientes.

Instalación

Siguiendo con la base de un servidor Fedora o similar basado en RHEL ejecutamos:

sudo dnf installl ansible -y

Configuraciones previas en los nodos gestionados

Los nodos gestionados son los equipos que recibirán las peticiones por ansible mediante SSH, un protocolo común en todos los equipos, y perfiles elevados con sudo o root.

Configuración SSH

Recordemos que SSH es un protocolo de comunicación seguro común en todas las distribuciones y que ya se explicó como instalar en equipos clientes y que ya viene integrado en todos los servidores.

En esta práctica sí que es importante que podamos acceder sin necesidad de llave, cosa que ya se explica en esta misma wiki.

Configuración sudoers

Un usuario sudoer es aquel que puede ejecutar comandos de root poniendo un "sudo" delante, por ejemplo, "dnf update" como tal no podríamos ejecutarlo sin ser root al no tener permisos, pero "sudo dnf update" permite elevar el usuario a ejecutar un comando como "su", de ahí "sudo" o "super user do".

Por defecto, el primer usuario de una instalación ya tiene estos permisos, pero para llevarlo a esta práctica, vamos a crear un usuario común y que tenga permisos de administración y, por seguridad, no habilitaremos el usuario "root".

Vamos a crear un usuario común llamado "suport" (en el caso de no haberlo creado durante la instalación y que será común en todos los nodos):

sudo useradd suport

I asignamos una contraseña:

sudo passwd suport

Ahora, le añadimos los grupos de administración:

sudo usermod -a -G adm,wheel suport

Y con esto, el usuario ya es administrador, ahora, por último, le permitiremos que el usuario pueda ejecutar comandos de "sudo" sin necesidad de volver a añadir la contraseña, considerando el riesgo de seguridad que conlleva, aunque es mejor que dar acceso libre al usuario root. Para eso editaremos el fichero de sudoers con:

sudo visudo

Esto abrirá el editor de sistema y añadiremos, al final, por ejemplo, la línea:

suport ALL=(ALL) NOPASSWD:ALL

Con esto le otorgamos acceso a TODOS los comandos y a ninguno pedirá contraseña. Ahora basta con cerrar sesión, iniciar de nuevo son "suport" y ejecutar cualquier comando con "sudo" y veremos que no pide la contraseña, por ejemplo:

sudo dnf update --refresh -y

Que permite la actualización del sistema.

El inventario

Primero vamos a generar un fichero donde tendremos un inventario de los equipos por nombre o IP a los que aplicaremos los comandos o módulos. Un ejemplo sería el fichero "maquinas" con un contenido similar:

[REHL]

rocky9

fedorawks

[Ubuntu]

lkservidor

lkedu22

IMPORTANTE - estos equipos han de responder a ping y acceso por SSH para poder acceder.

En este fichero estoy dando dos tipos de grupos, con dos equipos de distribución basados correspondientes.

NOTA - Si no tenemos acceso por nombre y si por IP podemos configurar el fichero "/etc/hosts" del equipo ansible con un añadido:

192.168.122.10  rocky9

192.168.122.11  fedorawks

192.168.122.12  lkedu22

192.168.122.240 lkservidor

De esta manera podremos "llamar" a los equipos por su nombre.

Comandos ad-hoc

Los comandos ad-hoc en Ansible son una forma rápida y sencilla de ejecutar una tarea única en uno o varios hosts de tu inventario. Imagina que necesitas instalar un paquete específico en todos tus servidores de producción. En lugar de crear un playbook completo, puedes utilizar un comando ad-hoc para realizar esta tarea de manera inmediata.

Ejemplo con una máquina

La primera prueba es un comando sobre una sola máquina:

ansible -i maquinas rocky9 -m ping -u suport

En este caso llamamos al inventario del ejemplo anterior "maquinas" y de este fichero al equipo "rocky9" del que cargamos el módulo "ping" y mediante el usuario "suport" El procedimiento es conectarse por SSH con usario "suport" (y así nos aseguramos la conexión) y éste realiza un ping devolviendo:

rocky9 | SUCCESS => {

   "ansible_facts": {

       "discovered_interpreter_python": "/usr/bin/python"

   },

   "changed": false,

   "ping": "pong"

}

Conforme confirma que ha hecho el ping con un "SUCCESS" y no han habido cambios.

Ejemplo con varias máquinas

Podemos ejecutar el mismo comando para todas las máquinas del inventario:

ansible -i maquinas all -m ping -u suport

Donde se ejecutaría sobre todas las máquinas del inventario.

IMPORTANTE - el orden de las respuestas varía según la respuesta.


Ejemplo de comandos/shell

Los siguientes ejemplos son para lanzar comandos o script sobre equipos inventariados, por ejemplo

ansible -i maquinas rocky9 -m command -a "date" -u suport

En este caso lanzamos a un ordenador del inventario "maquinas" el módulo de comandos con el argumento "date" mediante el usuario "suport". El resultado sería:

rocky9 | CHANGED | rc=0 >> Wed Nov  6 12:41:36 CET 2024

CHANGED, que ha aplicado el comando, rc=0 indica que no han habido errores y por último, el dia y la hora.

ATENCIÓN - en el módulo de comando no podemos lanzar concatenaciones, por ejemplo si lanzamos:

ansible -i maquinas rocky9 -m command -a "ls -l / | grep p" -u suport

Devolverá el listado de la raíz del sistema y un error de desconocimiento de "grep" y "p", ya que las tuberías son comandos irreconocibles, otra cosa es utilizar el módulo shell:

ansible -i maquinas rocky9 -m shell -a "ls -l / | grep p" -u suport

Y ahora si que resolverá correctamente el resultado devolviendo todos los directorios que contenga el carácter "p".

Ejemplos de módulo setup

Con el siguiente módulo podemos obtener un inventario en versión "json" del equipos o los equipos del fichero de inventario, para eso, y siguiendo los ejemplos anteriores, ejecutamos:

ansible -i maquinas rocky9 -m setup -u suport

Entre tantos datos nos devuelve los datos de IP, CPU, versión del sistema.... Estos datos se presentan en variables "facts" o variables de hecho que se pueden utilizar más adelante.

Ejemplos de copia de ficheros

Con el siguiente ejemplo podemos copiar ficheros o directorios de nuestro equipo a todos los inventariados resolviendo la potencia de ansible. Este módulo resulta de "ansible.builtin.copy", de hecho, es uno de los módulos ya integrados en el sistema.

ansible -i maquinas rocky9 -m copy -a "src=/srv/datos/fstab dest=/tmp/fstab.rocky9 " -u suport

Con esto vamos a copiar el fichero fstab de directorio /srv/datos al directorio /tmp/ de la máquina roky9 bajo el nombre fstab.rocky9, demostrando que podemos cambiar el nombre del fichero destino una vez copiado.

Lo mismo pasaría copiando directorios, por ejemplo:

ansible -i maquinas rocky9 -m copy -a "src=/srv/datos/ dest=/tmp/ " -u suport

En este caso va a copiar todo el directorio /srv/datos a /tmp de rocky9 y, como el directorio datos no existe, el resultado va a quedar en /tmp/datos, ya que, además, la copia va a ser recursiva.

Por último, vamos a copiar un fichero y lo vamos a cambiar el nombre, además de cambiar las propiedades (podéis mirar la sección de Comandos básicos en linux):

ansible -i maquinas rocky9 -m copy -a "src=/srv/datos/fstab dest=/tmp/fstab.rocky9 mode=0775" -u suport

Ejemplo de trabajo con DNF o YUM y servicios

Existe el módulo de dnf como yum para poder instalar y ejecutar servicios, por ejemplo, queremos instalarle al servidor el paquete Apache para crear el servicio web, para eso podemos utilitzar:

ansible -i maquinas rocky9 -m dnf -a "name='httpd' state=present" -u suport -b

Con esto vamos a instalar el paquete httpd a la versión actualizada mediante el usuario suport y lo elevamos a "sudo" con -b. Con este comando se instalará el servicio, pero no estará activo, para eso tenemos que añadir el "servicio":

ansible -i maquinas rocky9 -m service -a "name='httpd' state=started" -u suport -b

Es decir, siguiendo con la instalación, vamos a darle un inicio al estado del servicio. NOTA - En caso de no haber configurado el destino para acceder sin contraseña, le podemos decir que pregunte por ella con:

ansible -i maquinas rocky9 -m dnf -a "name='httpd' state=present" -u suport -b --ask-become

De esta manera se conectará por SSH, como viene siendo habitual, y nos preguntará por la contraseña de "sudo".




Enlaces