ANSIBLE
Ansible | |
---|---|
Definición | A gathering space to build automation skills and success |
Enlaces | |
Web | https://www.ansible.com/ |
Documentación | https://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 respuesta varia 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 raiz del sistema y un error de desconcimiento de "grep" y "p" ya que las tuberias