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.-bo--become: usa escalada de privilegios, generalmente sudo.-ko--ask-pass: solicita la contraseña SSH.-Ko--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.