Dominando los Comandos Ad-Hoc Esenciales para Tareas Rápidas de Ansible

Usa comandos ad-hoc de Ansible para verificaciones rápidas, correcciones puntuales, cambios de archivos y recopilación de hechos sin escribir un playbook.

Dominando Comandos Ad-Hoc Esenciales para Tareas Rápidas con Ansible

Los comandos ad-hoc de Ansible te permiten ejecutar una tarea rápida en un host o en un grupo completo. Son útiles cuando necesitas probar acceso, verificar espacio en disco, copiar un archivo, reiniciar un servicio o inspeccionar hechos sin escribir primero un playbook.

No reemplazan a los playbooks. Úsalos para trabajo inmediato, luego mueve tareas repetidas o riesgosas a automatización controlada por versiones.

Estructura Básica del Comando

Un comando ad-hoc sigue esta forma:

ansible <patrón> -m <nombre_módulo> -a "<argumentos_módulo>" [opciones]

El patrón de host selecciona los objetivos del inventario. El módulo decide qué hace Ansible. Los argumentos pasan valores específicos del módulo.

Las opciones comunes incluyen:

  • -i <inventario> o --inventory <inventario>: usa un archivo de inventario o fuente de inventario específica.
  • -u <usuario> o --user <usuario>: conéctate como un usuario remoto específico.
  • -b o --become: usa escalada de privilegios, generalmente sudo.
  • -k o --ask-pass: solicita la contraseña SSH.
  • -K o --ask-become-pass: solicita la contraseña de sudo.
  • --limit <subconjunto>: reduce aún más los hosts seleccionados.

Si no pasas -i, Ansible usa su inventario configurado. En muchos sistemas es /etc/ansible/hosts, pero tu ansible.cfg puede cambiarlo.

Probar Acceso con ping

El módulo ping no envía paquetes ICMP echo. Se conecta a través del transporte normal de Ansible, ejecuta un pequeño módulo en el objetivo y espera pong de vuelta.

ansible all -m ping

Para un grupo:

ansible webservers -m ping

Un resultado exitoso se ve así:

web01.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Si esto falla, arregla el inventario, DNS, claves SSH, usuario remoto, configuración de sudo o disponibilidad de Python antes de solucionar problemas de tareas de nivel superior.

Ejecutar Comandos Simples con command

El módulo command ejecuta un programa directamente en el host remoto. No invoca un shell, por lo que las tuberías, redirecciones, expansión de globs y expansión de $VARIABLE no funcionan como lo harían en tu terminal.

Verificar tiempo de actividad:

ansible webservers -m command -a "uptime"

Verificar uso de disco:

ansible all -m command -a "df -h"

Listar un directorio protegido con sudo:

ansible dbservers -m command -a "ls -l /var/log" --become

Usa command primero cuando no necesites características del shell. Es más fácil de razonar y evita la interpretación accidental del shell.

Usa shell Solo Cuando Necesites Características del Shell

El módulo shell ejecuta el comando a través de un shell en el host remoto. Úsalo para tuberías, redirecciones, expansión de variables y condicionales del shell.

Encontrar los directorios de registro más grandes:

ansible databases -m shell -a "du -sh /var/log/* | sort -rh | head -n 5"

Verificar una variable de entorno remota:

ansible all -m shell -a "printf '%s\n' \"$PATH\""

Ten cuidado con la entrada dinámica. Si se insertan valores proporcionados por el usuario en un comando de shell sin comillas ni validación, puedes crear un error de inyección de comandos.

Para ediciones de archivos, prefiere un módulo diseñado para ese propósito en lugar de redirección de shell. Por ejemplo, agrega una línea gestionada con lineinfile:

ansible webservers -m lineinfile -a "path=/etc/app/app.conf line='feature_enabled=true' create=yes" --become

Eso es más seguro y repetible que agregar con echo ... >> archivo.

Copiar Archivos con copy

El módulo copy transfiere archivos desde tu nodo de control a los hosts gestionados.

ansible webservers -m copy -a "src=./myscript.sh dest=/tmp/myscript.sh mode=0755"

Copiar un archivo de configuración que requiere propiedad de root:

ansible all -m copy -a "src=./app.conf dest=/etc/app/app.conf owner=root group=root mode=0644" --become

Si el destino ya tiene el mismo contenido y metadatos, Ansible informa que no hay cambios.

Gestionar Rutas con file

Usa el módulo file para crear directorios, eliminar rutas, establecer propiedad, establecer permisos o crear enlaces simbólicos.

Crear un directorio:

ansible appservers -m file -a "path=/opt/my_app state=directory mode=0755 owner=app group=app" --become

Eliminar un archivo antiguo:

ansible host1 -m file -a "path=/tmp/old_file.txt state=absent"

Crear un enlace simbólico:

ansible appservers -m file -a "src=/opt/my_app/releases/current dest=/opt/my_app/current state=link"

Recopilar Hechos con setup

El módulo setup recopila hechos sobre un host, incluyendo SO, red, CPU, memoria y detalles del dispositivo.

Recopilar todos los hechos de un host:

ansible webserver1 -m setup

Filtrar hechos cuando solo necesitas una pequeña parte:

ansible all -m setup -a "filter=ansible_distribution*"

La salida puede ser grande, por lo que filtrar mantiene la solución de problemas legible.

Elegir entre Comandos Ad-Hoc o Playbooks

Usa comandos ad-hoc para verificaciones rápidas y tareas puntuales:

  • Probar conectividad con ping.
  • Verificar estado con command.
  • Copiar un archivo conocido con copy.
  • Crear o eliminar una ruta con file.
  • Recopilar hechos durante la solución de problemas.

Usa playbooks cuando la tarea sea repetida, de múltiples pasos, revisada por compañeros de equipo o lo suficientemente riesgosa como para querer control de versiones y estructura predecible.

Verificaciones de Seguridad Antes de Ejecutar

Verifica el patrón de host antes de ejecutar algo destructivo:

ansible webservers --list-hosts

Usa --limit cuando quieras un radio de explosión más pequeño:

ansible all --limit web01.example.com -m ping

Recuerda que command y shell no son automáticamente idempotentes. Un comando como useradd deploy puede fallar en la segunda ejecución a menos que lo escribas de manera defensiva. Módulos como user, file, copy y lineinfile generalmente te dan un comportamiento repetible más seguro.

Conclusión

Los comandos ad-hoc de Ansible son mejores para operaciones rápidas y específicas. Comienza con ping, usa command para verificaciones simples, reserva shell para sintaxis de shell real y prefiere módulos como copy, file, lineinfile y setup cuando se ajusten al trabajo.