Comandos ad-hoc

Automatización con Ansible. Una introducción.

Este es uno de los capítulos del tutorial Automatización con Ansible. Una introducción.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Por fin llegamos al capítulo de este tutorial de Ansible donde vas a poder realizar acciones. Con esto no quiero decir, que hasta el momento no hayas hecho nada. Nada mas lejos de la realidad, hasta el momento has aprendido los conceptos básicos de Ansible, has descubierto que es YAML y has creado tu inventario de Ansible, un paso fundamental para lo que vas a hacer en este nuevo capítulo del tutorial. Sin embargo, hasta este capítulo, no has hecho algo tangible, algo que tu puedas ver. Pues eso se ha terminado, porque en este capítulo, vas a poder realizar pequeñas acciones, o mejor dicho, acciones individuales, que te van a permitir ver todo el potencial de esta herramienta. Y es que en este capítulo del tutorial de Ansible vas a ver los comandos ad-hoc y el potencial que tienen.

No tenía claro si poner este capítulo antes del capítulo de los módulos de Ansible. Porque uno no es sin el otro, ni el otro sin el uno. Sin embargo, creo que esta manera, aunque es menos didáctica quizá, si que te va a permitir ver, lo que acabo de comentar, el potencial de Ansible.

Commandos ad-hoc

Comandos ad-hoc

Antes de introducirte directamente en esto de los comandos ad-hoc, tienes que conocer otro concepto que me dejé en el capítulo de el inventario de Ansible. Son los patrones.

Patrones

Ejecutar una tarea no solo implica conocer la tarea que quieres ejecutar, sino también sobre que máquinas la quieres ejecutar. Es necesario indicar a Ansible sobre que máquina o máquinas vas a ejecutar un playbook o un comando. Los patrones te permiten definir o seleccionar, mejor expresado, sobre que máquinas de tu inventario vas a trabajar.

Un patrón puede hacer referencia a una máquina concreta, a una IP, a un grupo, a un conjunto de grupos o incluso a todo tu inventario. La gran ventaja de los patrones es que son muy flexibles, ya que te permite utilizar tanto comodines como, mis amadas, expresiones regulares.

Para aclarar esto de los patrones, lo mejor es recurrir a un ejemplo. En este caso, el inventario, puede ser algo tan sencillo como este,

all:
  children:
    grupo1:
      hosts:
        host11
        host12
    grupo2:
      hosts:
        host21
        host22
    grupo12:
      hosts:
        host12
        host21

Ahora podrías utilizar algunos de los siguientes patrones,

  • all ó *para referirte a todas las máquinas de tu inventario
  • host11 para solo una máquina
  • host11:host12 ó host11,host12 para varias máquinas
  • grupo1 para un determinado grupo
  • grupo1:grupo2 para todas las máquinas de ambos grupos
  • grupo1:!grupo12 se refiere a todas las máquinas que estén en el grupo grupo1 y no estén en el grupo grupo12. En este ejemplo sería host11
  • grupo1:&grupo12 sería las máquinas que estén tanto en el grupo grupo1 como en el grupo grupo12, y que en este ejemplo sería host12

Por supuesto eso lo puedes complicar tanto como quieras, así podrías seleccionar algo como,

grupo1:grupo2:!grupo12

Esto sería todos los host del grupo grupo1 y del grupo grupo2 y que no esté en el grupo grupo12. El resultado sería host11 y host22.

¿Que son los comandos ad-hoc?

Un comando ad-hoc te permite ejecutar una tarea en un nodo o conjunto de hosts de tu inventario. La ventaja de estos comandos es que te facilitan el uso rápido de Ansible, pero como contrapartida, no son reutilizables. En el caso de que quieras hacer una tarea de forma repetitiva, lo más práctico es que te crees un playbook, cosa que te mostraré en un capítulo posterior.

Un comando ad-hoc de Ansible utiliza la herramienta /usr/bin/ansible para automatizar una única tarea en un único host o en un grupo de hosts, en el caso de que recurras a los patrones según lo que te he indicado en el apartado anterior.

Como te decía en la introducción, la razón para hablarte sobre estos comandos es doble, por un lado, porque te va a permitir jugar con Ansible desde ya. Algo que me imagino que estabas esperando desde el capítulo de introducción. Esto me va a permitir mostrarte el potencial de Ansible, y que veas porque me tiene tan enamorado.i

Por otro lado, un comando ad-hoc, también te permite realizar tareas simples, que tampoco tiene mucho sentido que tengan todo un playbook para ellas, o tareas que realizar de forma esporádica.

Como utilizar los comandos ad-hoc

Entre las diferentes herramientas que instalas con Ansible, como te indicaba en el apartado anterior, una de ellas es precisamente /usr/bin/ansible. El modo de uso es tan sencillo como,

ansible [patrón] -m [módulo] -a [opciones del módulo]

Respecto al concepto de módulo, esto es lo que trataba de comentarte en la introducción. Este concepto lo traté en el primer capítulo del tutorial, indicando que, se trata de una librería donde se encuentran las funcionalidades necesarias para desempeñarl determinadas tareas.

Para probar esto de los comandos ad-hoc de Ansible, porque se que estás tan impaciente tu como yo por hacerlo, puedes hacerlo con el módulo ping. Este módulo, como bien te imaginas sirve para hacer ping sobre una máquina o host de tu entorno. Así, en mi caso, el uso es es el siguiente, en el caso de querer hacer ping sobre todas las máquinas,

ansible all -i /datos/Sync/ansible/inv -m ping

En el ejemplo de inventario que he puesto anteriormente también podrías hacer ping a todos los hosts que cumplan con el patrón host1* de la siguiente forma,

ansible host1* -i inv -m ping

En el directorio inv es donde se encuentra mi inventario inventory.yml, pero como ya te indiqué en el capítulo anterior del tutorial, con indicar el directorio es suficiente. Ansible ya se encarga de sacar todos los hosts y prepararlo como necesite.

En este último ejemplo, en lugar de poner /datos/Sync/ansible/inv he indicado únicamente inv partiendo que me encuentro en el directorio /datos/Sync/ansible, que es mi directorio de operaciones.

Igual que hice ping a todas las máquinas, podía haber hecho a una en concreto, o a un grupo de ellas. Simplemente con sustituir por el nombre o alias de la máquina o del grupo, o utilizando un patrón, tal y como expliqué en un apartado anterior de este capítulo.

Algunos casos de uso interesantes

Tal y como he indicado anteriormente, uno de los usos mas habituales de los comandos ad-hoc de Ansible es para ejecutar acciones que no realizas de forma habitual.

Reiniciando un servidor

Una de estas acciones, es sin lugar a dudas reiniciar un equipo. Esto lo puedes realizar de forma sencilla utilizando el módulo reboot tal y como te indico en la siguiente instrucción,

ansible host11 -i inv -m reboot --become

Al ejecutar esto, recibirás una respuesta parecida a la que te muestro a continuación,

host11 | CHANGED => {
    "changed": true,
    "elapsed": 15,
    "rebooted": true
}

Si lo ejecutas sin el argumento --become no funcionará, devolviendo algo como lo que te muestro a continuación,

host11 | FAILED! => {
    "changed": false,
    "elapsed": 0,
    "msg": "Reboot command failed. Error was Failed to set wall message, ignoring: Interactive authentication required.\r\nFailed to call ScheduleShutdown in logind, proceeding with immediate shutdown: Interactive authentication required., Shared connection to 158.245.6.205 closed.",
    "rebooted": false,
    "start": "2020-06-18T05:27:57.287009"
}

Por supuesto también puedes ejecutar esta instrucción para todos los hosts que cumplan con el patrón host1*, por ejemplo, o también para el grupo1. Para esto tan solo tienes que reemplazar host11 por el valor correspondiente.

Una vez ejecutado la instrucción anterior, a lo mejor quieres comprobar que la máquina se ha reiniciado. Para esto puedes ejecutar la siguiente instrucción,

ansible host11 -i inv -m command -a 'uptime'

Esto te devolverá un resultado similar al que te muestro a continuación,

host11 | CHANGED | rc=0 >>
 07:36:07 up 7 min,  1 user,  load average: 0.00, 0.06, 0.05

Indicarte que el comando anterior lo puedes simplificar ejecutando simplemente,

ansible host11 -i inv -a 'uptime'

Esto es así porque el módulo por defecto para Ansible es command. Este módulo te permite ejecutar los mismos comandos que ejecutarías en la linea de comandos, como por ejemplo uptime.

Así, por curiosidad puedes ejecutar estos dos instrucciones en la línea de comandos, y obtendrás seguro el resultado esperado,

ansible host11 -i inv -a 'whoami'

En este caso el resultado será ansible. Sin embargo, si lo ejecutas con la opción become, tal y como has hecho anteriormente, el resultado será, otro. Es decir, si ejecutas,

ansible host11 -i inv -a 'whoami' --become

En este caso, el resultado será root

Conclusiones

Esto no es mas que el aperitivo de lo que está por llegar. Ya puedes ver las posibilidades de esta tecnología. No solo es la comodidad de realizar tareas sin tener que desplazarte a cada una de las máquinas que gestiones, también está la ventaja de que puedes hacerlo en varias máquinas a la vez, y como ya veremos en próximos capítulos, la de gestionar y controlar todas estas operaciones, utilizando para ello, el control de versiones.

Esto es un como el anuncio, una vez lo destapas, ya no hay forma de parar. Y vuelvo a insistir, no se trata de que tengas varias máquinas, sino de tener todos tus procesos automatizados bajo control, de forma que los puedas aplicar cuando quieras, o necesites.

En el próximo capítulo del tutorial, comentaré algunos comandos ad-hoc de Ansible mas, para que puedas seguir probando, o simplemente realizando las tareas mas habituales, de una forma alternativa, de una forma mas sencilla
Esto no es mas que el aperitivo de lo que está por llegar. Ya puedes ver las posibilidades de esta tecnología. No solo es la comodidad de realizar tareas sin tener que desplazarte a cada una de las máquinas que gestiones, también está la ventaja de que puedes hacerlo en varias máquinas a la vez, y como ya veremos en próximos capítulos, la de gestionar y controlar todas estas operaciones, utilizando para ello, el control de versiones.

Esto es un como el anuncio, una vez lo destapas, ya no hay forma de parar. Y vuelvo a insistir, no se trata de que tengas varias máquinas, sino de tener todos tus procesos automatizados bajo control, de forma que los puedas aplicar cuando quieras, o necesites.

En el próximo capítulo del tutorial, comentaré algunos comandos ad-hoc de Ansible mas, para que puedas seguir probando, o simplemente realizando las tareas mas habituales, de una forma alternativa, de una forma mas sencilla.


Más información,

Imagen de portada de Franz Harvin Aceituna en Unsplash

Deja una respuesta

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