Comandos específicos en Ansible

 En entradas anteriores se ha hablado de la herramienta de orquestación Ansible. Se trata de una plataforma de soporte lógico libre, creada por Michael DeHaan, para configurar y administrar ordenadores.
  Así, Ansible combina instalación multi-nodo (permite desplegar configuraciones de servidores y servicios por lotes), ejecuciones de tareas ad-hoc (solución específicamente elaborada para un problema o fin preciso, y no generalizable ni utilizable para otros propósitos) y administración de configuraciones. Además, esta herramienta de orquestación gestiona nodos a través de SSH y no requiere ningún soporte lógico 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, aunque nativamente utiliza YAML para describir configuraciones reutilizables de los sistemas.
   Ansible puede utilizarse con una interfaz gráfica gracias a Ansible Tower (interfaz de usuario basada en página de red para Ansible), pero si no se tiene acceso a dicha interfaz, lo habitual es emplear un intérprete de órdenes para realizar las funciones propias del programa.
  Dentro del intérprete de órdenes, en esta herramienta de orquestación se suelen utilizar comandos específicos, o comandos ad-hoc, que permiten ejecutar una única tarea en un grupo de servidores sin necesidad de crear un manual táctico completo. Los mencionados comandos son estupendos para realizar tareas sencillas (comprobar el estado de un servicio, ejecutar rápidamente un comando…), y se emplean sobre un listado de nodos (normalmente servidores) anotados en el fichero de inventario configurado en la ruta “/etc/ansible/hosts”. No obstante, para tareas más complejas como la instalación de soporte lógico, suele ser mejor utilizar un manual táctico.
  Un comando de Ansible de este tipo se ejecuta introduciendo una única línea de código que contiene la información relevante (nombre del módulo deseado, cualquier parámetro que se le deba suministrar, etc.).
  La sintaxis de un comando específico de Ansible es:
ansible <nombre de nodo o de grupo de nodos> -m <módulo> -a "<argumentos>"

  Teniendo en cuenta su tipo, estos comandos se emplean en tareas sencillas y puntuales que no requieren mucha complejidad. Por otra parte, son una excelente forma de probar nuevos módulos o comandos antes de añadirlos a un manual táctico, lo que puede ayudar al usuario a evitar errores y ahorrar tiempo a largo plazo.
  Dada su flexibilidad, es posible emplear los comandos ad-hoc para todo tipo de tareas (instalar paquetes, copiar archivos, ejecutar comandos en varios servidores a la vez, comprobar el estado de un servicio, ver los archivos de registro, realizar otras tareas de diagnóstico…).
 

LOS MÓDULOS

  Una parte de un comando específico de esta herramienta de orquestación está compuesta por un módulo.
  Los módulos se emplean para realizar cambios del sistema y tareas más complejas sin necesidad de establecer todos los parámetros. Se expresan como código, generalmente en python, y contienen metadatos que definen el momento y el lugar en los que se ejecuta una tarea de automatización y los usuarios que pueden hacerlo. Puede descargar miles de módulos de Ansible de distintos repositorios, como Ansible Automation Hub y Ansible Galaxy, aunque también es posible crear módulos personalizados y compartirlos con otros usuarios de la presente herramienta de orquestación de la empresa del usuario o de la extensa comunidad de Ansible.
  Un módulo de Ansible contiene tres archivos principales: el fichero de inventario (incluye la lista de nodos que deben ser gestionados), el archivo "Ansible.cfg" (contiene las opciones para el escalado de privilegios y la ubicación del archivo de inventario) y el fichero principal (manual táctico de Ansible que establece los módulos que se encargarán de llevar a cabo diversas tareas en un nodo que forme parte de un inventario de archivo en “hosts”).
  El usuario puede obtener un listado de todos los módulos disponibles en el sistema mediante los collection-docs (índice de documentos de colecciones de Ansible) o ejecutando el comando
ansible-doc -l en un símbolo del sistema. Algunos de estos son:
  •    Módulo APT: Se encarga de administrar paquetes apt, como para los entornos de los sistemas operativos Debian y Ubuntu. Para este módulo, es necesario que el nodo cumpla con los requisitos de python-apt (python 2), python3-apt (phyton 3) y una aptitude antes de 2.4. Existe otro con la misma función, mas utilizando DNF, el gestor de paquetes de soporte lógico predeterminado de Fedora.
  •   Módulo de grupo: Encargado de administrar la presencia de un grupo en un nodo y requiere de la ejecución de los parámetros “groupadd”, “groupdel” y “groupmod”. Respecto a su estatus, se garantiza que este módulo tiene cambios de interfaz que serán compatibles con versiones anteriores.
  •   Módulo stat: Su objetivo es la recuperación de archivos similares al comando "stat» en Linux o Unix. Para el público de Windows, debe ser reemplazado por el módulo “win_stat”.
  •   Módulo de comando: Ejecuta los comandos en los elementos objetivo. Se incluye con Ansible Core y forma parte de todas las instalaciones de esta herramienta de orquestación.
  •   Módulo de shell: Se encarga de tomar el nombre del comando seguido de un listado de argumentos delimitados por espacios. Dentro de sus requerimientos se encuentra un comando libre o un parámetro cmd. Es similar al módulo de comando, pero lo ejecuta a través de un intérprete de comandos (/bin/sh) en el nodo remoto. Para usuarios de Windows, se debe usar el módulo “win_shell”.
  •   Módulo file: Establece y elimina atributos de archivos, enlaces simbólicos o directorios. Otros módulos también admiten las opciones de este módulo. Se reemplaza con el “win_file” en usuarios de Windows.
  •   Módulo virt: Administra las máquinas virtuales que sean compatibles con el soporte lógico libvirt. Requiere de Python mayor o igual a 2.6 y del paquete “libvirt-python”.
  •   Módulo cron: Se emplea para gestionar las tareas programadas mediante Cron.
  •   Módulo vultr_user: Permite crear, actualizar y eliminar usuarios en el servidor de Vultr.
  •   Módulo setup: Obtiene información del nodo, como puede ser la versión del sistema operativo, las direcciones IP entre otra gran cantidad de información útil.
  •   Módulo service: Permite iniciar, detener y volver a cargar los paquetes que se encuentren instalados en el sistema.
  •   Módulo copy: Se encarga de copiar un archivo desde el equipo hacia una ubicación en la máquina remota.
  •   Módulo de servicio: Gestiona los servicios en los nodos remotos. Algunas de las acciones que llevan a cabo incluyen iniciar, detener y reiniciar servicios, entre otras. Se incluye con Ansible Core y forma parte de todas las instalaciones de la presente herramienta de orquestación.
  •   Módulo fetch: Descarga ficheros de un nodo externo al nodo de Ansible.
  •   Módulo ping: Comprueba la conectividad con el nodo afectado enviando un “ping”.

COMANDOS RELEVANTES

  Entre los comandos específicos de esta herramienta de orquestación más empleados desde un intérprete de comandos, además del mencionado más arriba, se encuentran:
  •   ansible (pulsar tecla de tabulación 2 veces): Muestra una lista de los comandos básicos de Ansible.
  •    ansible all -m ping: Confirma la conectividad con el nodo [o los nodos (todos ellos, si se usa “all” como nombre de nodo)] enviando un “ping”. Si se añade el parámetro "--ask-pass" al final del comando, se pedirá que se introduzca la contraseña SSH (debe estar instalado el paquete sshpass en el nodo donde se encuentre esta herramiente de orquestación).
  •    ansible all -a "df -h" -f 1: Revisa el espacio en disco de todos los nodos de uno en uno. El parámetro "-f <nº>" define en cuántos nodos se ejecutará al mismo tiempo.
  •    ansible <nombre de nodo o de grupo de nodos> -m shell -a 'fdisk -l' -u <nombre de usuario> --become -K: Da información sobre las particiones existentes en el nodo indicado. El parámetro "--become" otorga los privilegios de administrador y el parámetro "-K" solicita la contraseña.
  •   ansible <nombre de nodo o de grupo de nodos> -a "/sbin/reboot" -f 1: Reiniciar el sistema del nodo, o grupo de nodos, indicado de uno en uno.
  •   ansible <nombre de nodo o de grupo de nodos> -u root -m apt -a "name=<nombre del paquete> state=<estado del paquete>": Permite instalar aplicaciones en los nodos. El parámetro “name” sirve para indicar qué paquete se desea instalar (mediante su nombre en el repositorio, generalmente). El parámetro “state” sirve para indicar el estado deseado del paquete: instalado (“present”), la última versión (latest”), con todas sus dependencias (“build-dep”), intentando corregir un sistema con dependencias rotas (“fixed”), o ausente (“absent”).
  •   ansible <nombre de nodo o de grupo de nodos> -m apt -a 'name=<nombre del paquete> state=absent purge=yes' : Elimina el paquete y purga toda la configuración relacionada con el mismo (se usa el valor “absent” del parámetro “state” y el parámetro “purge” con el valor “yes”). Funciona mejor si se le añade el parámetro “--become” al final.
  •   ansible <nombre de nodo o de grupo de nodos> -m copy -a "src=<ruta de origen> dest=<ruta de destino>": Copia ficheros y directorios en los servidores. El valor del parámetro “src”es la ruta donde se encuentra el archivo a copiar, incluyendo éste; lo mismo sucede con el valor del parámetro “dest”.
  •   ansible <nombre de nodo o de grupo de nodos> -m fetch -a "src=<ruta de origen> dest=<ruta de destino>": Copia ficheros y directorios de los nodos externos al nodo de ejecución de la presente herramienta de orquestación. Los valores de los parámetros “src” y “dest” funcionan igual que en el comando anterior.
  •   ansible <nombre de nodo o de grupo de nodos> -m file -a "dest=<ruta de destino> mode=<nº de permisos> state=<estado del fichero>": Permite crear/borrar masivamente directorios, ficheros o enlaces simbólicos. El parámetro “mode” se utiliza para establecer y/o modificar los permisos del objetivo final (directorio o archivo) poniendo como valor la combinación numérica octal que se necesite (generalmente “755” para directorios y “644” para archivos). Por su parte, el valor del parámetro “state” permite crear un directorio (“directory”), un fichero (“touch”), o un enlace simbólico (“link”), o bien borrar un fichero (“absent”). En el caso de crear un enlace simbólico, el valor del parámetro “dest” sólo incluye directorios (en el resto de los casos se trata de la ruta completa incluyendo el fichero).
  •   ansible <nombre de nodo o de grupo de nodos> -u root -m group -a "name=<nombre del grupo> state=<estado>": Permite crear/borrar grupos de usuarios en los nodos. El valor “root” del parámetro “-u” permite utilizar privilegios de superusuario. El parámetro “name” es para nombrar el grupo. El parámetro “state” indica si el grupo debe estar presente (“present”) o no (“absent”) en el nodo remoto.
  •   ansible <nombre de nodo o de grupo de nodos> -m service -a 'name=<nombre del servicio> state=<estado> enabled=yes' --become: Inicia un servicio y lo añade al tiempo de arranque. El parámetro “state” debe tener el valor “started”, pero tiene otros valores útiles para otras acciones como “restarted” para reiniciar el servicio y “stopped” para detenerlo.
  •   ansible <nombre de nodo o de grupo de nodos> -m setup: Extrae toda la información de un nodo (o grupo de nodos, para lo que será mejor utilizar el parámetro "-f <nº>").
  •   ansible <nombre de nodo o de grupo de nodos> -m shell -a 'free -m' --become: Comprueba el uso de la memoria RAM en los nodos indicados.
  •   ansible <nombre de nodo o de grupo de nodos> -m shell -a 'mpstat -P ALL' --become: Comprueba el uso de la CPU en el nodo (o nodos) indicado (tiene que estar instalado el paquete “sysstat” en el nodo del Ansible para que funcione).
  •   ansible <nombre de nodo o de grupo de nodos> -m shell -a 'uptime' --become: Comprueba el tiempo de actividad del nodo (o nodos).
  •   ansible <nombre de nodo o de grupo de nodos> -m stat -a "path=<ruta>": Se utiliza para ver las estadísticas de ciertas rutas dentro de los servidores. El parámetro “path” sirve para indicar la ruta de la que se quieren obtener los datos.
  •   ansible <nombre de nodo o de grupo de nodos> -u root -m user -a "name=<nombre de usuario> group=<nombre del grupo> create_home=true": Permite crear usuarios en los servidores. El parámetro “name” permite dar un nombre al usuario a crear, puede ser un nombre per se o un identificador del mismo. El parámetro “group” indica el grupo principal al que pertenecerá dicho usuario al ser cerrado. El parámetro “create_home” permite crear un directorio de inicio para el usuario cuando se cree la cuenta o si el directorio de inicio no existe (“true”) o no (“false”).
  •   ansible-galaxy collection list: Muestra las colecciones existentes en un nodo.
  •   ansible-playbook <nombre del manual táctico>: Ejecuta un manual táctico. Se puede utilizar el parámetro “-l” para filtrar el nodo (o lista de nodos) al que afectará el manual táctico.
Ejemplos de uso de comandos específicos.


SALIDA DE LOS COMANDOS

  La sintaxis de la salida de los comandos en Ansible siempre es de estilo JSON. Si aparece en color verde significa que todo ha ido bien y si es de color rojo es que algo no ha ido bien. Por un lado se suele encontrar el nombre del nodo al que se ha preguntado y luego hay un "SUCCESS" (la operación ha sido un éxito), o un "FAILED!" y el texto en rojo (la operación ha fallado).
  Después habría dos parámetros, el primero, "changed" (si el comando ejecutado ha realizado algún cambio en el servidor), "false" (no se ha realizado cambio alguno); el segundo será el comando que se ha enviado y la respuesta del servidor.
Ejemplos de salidas de comandos fallidos.

  Aguardo que la presente entrada haya sido interesante para el lector. De ser así, espero que éste la comente y/o la comparta, por favor.

No hay comentarios:

Publicar un comentario

Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.