Cómo ejecutar comandos en hosts de destino con el módulo de comandos de Ansible

AnsibleBeginner
Practicar Ahora

Introducción

Ansible es una poderosa herramienta de automatización de TI que simplifica la gestión de sistemas remotos. En este tutorial, exploraremos el módulo de comandos de Ansible, que te permite ejecutar comandos en hosts de destino. Aprenderás los fundamentos de la ejecución de comandos, así como técnicas avanzadas para mejorar tus flujos de trabajo de Ansible.

Entendiendo el Módulo de Comando de Ansible

Ansible es una potente herramienta de automatización de código abierto que te permite gestionar y configurar tu infraestructura en múltiples hosts. El módulo de comando de Ansible es uno de los módulos centrales en Ansible que te permite ejecutar comandos arbitrarios en hosts remotos.

El módulo de comando de Ansible proporciona una forma sencilla y directa de ejecutar comandos en hosts de destino. Te permite ejecutar comandos de shell, scripts o cualquier otro archivo ejecutable en el sistema remoto. Este módulo es especialmente útil cuando necesitas realizar tareas ad-hoc, solucionar problemas o ejecutar comandos personalizados en tu infraestructura.

Para usar el módulo de comando de Ansible, necesitas definir el parámetro command en tu playbook de Ansible o en un comando ad-hoc. El parámetro command especifica el comando que deseas ejecutar en el host remoto. Por ejemplo:

- name: Ejecutar un comando en un host remoto
  command: uptime
  register: uptime_result
  become: yes

En este ejemplo, el parámetro command está establecido en uptime, lo que ejecutará el comando uptime en el host remoto. El parámetro register se utiliza para capturar la salida del comando, y el parámetro become se establece en yes para ejecutar el comando con privilegios elevados (si es necesario).

El módulo de comando de Ansible también admite varias opciones, como:

  • creates: Especifica un archivo que debe existir antes de ejecutar el comando.
  • removes: Especifica un archivo que no debe existir antes de ejecutar el comando.
  • chdir: Cambia el directorio de trabajo actual a la ruta especificada antes de ejecutar el comando.
  • stdin: Pasa la cadena especificada al comando a través de la entrada estándar.
  • warn: Controla si mostrar una advertencia si el comando podría cambiar potencialmente un archivo importante.

Al comprender el módulo de comando de Ansible, puedes ejecutar comandos en tus hosts remotos de manera eficiente, automatizar tareas repetitivas y optimizar tus procesos de gestión de infraestructura.

Ejecución de Comandos en Hosts Remotos

Ejecución Básica de Comandos

Para ejecutar un comando en un host remoto utilizando el módulo de comando de Ansible, puedes usar la siguiente sintaxis básica:

- name: Ejecutar un comando en un host remoto
  command: <command>
  register: <variable_resultado>
  become: yes

En este ejemplo, <command> es el comando que deseas ejecutar en el host remoto, y <variable_resultado> es la variable que almacenará la salida del comando. El parámetro become se establece en yes para ejecutar el comando con privilegios elevados (si es necesario).

Por ejemplo, para comprobar el tiempo de actividad de un host remoto:

- name: Comprobar el tiempo de actividad del host remoto
  command: uptime
  register: uptime_result
  become: yes

La salida del comando uptime se almacenará en la variable uptime_result, que luego puedes utilizar en tu playbook o comando ad-hoc.

Manejo de Errores de Comando

De forma predeterminada, el módulo de comando de Ansible fallará si el comando ejecutado devuelve un código de salida distinto de cero. Puedes manejar errores de comando utilizando el parámetro ignore_errors:

- name: Ejecutar un comando en un host remoto
  command: <command>
  register: <variable_resultado>
  ignore_errors: yes

Esto permitirá que el playbook continúe ejecutándose incluso si el comando falla.

Captura de la Salida del Comando

Puedes capturar la salida de un comando utilizando el parámetro register, como se muestra en los ejemplos anteriores. La salida se almacenará en la variable especificada, que luego puedes utilizar en tu playbook o comando ad-hoc.

Por ejemplo, para capturar la salida del comando uptime e imprimirla:

- name: Comprobar el tiempo de actividad del host remoto
  command: uptime
  register: uptime_result
  become: yes

- name: Imprimir tiempo de actividad
  debug:
    msg: "{{ uptime_result.stdout }}"

Esto imprimirá la salida del comando uptime en la consola.

Al comprender los fundamentos de la ejecución de comandos en hosts remotos con el módulo de comando de Ansible, puedes automatizar eficazmente una amplia gama de tareas en tu infraestructura.

Técnicas Avanzadas de Ejecución de Comandos

Ejecución Condicional de Comandos

En ocasiones, es necesario ejecutar un comando solo si se cumple una determinada condición. Puedes utilizar la cláusula when para ejecutar comandos condicionalmente en tu playbook de Ansible:

- name: Ejecutar comando si se cumple la condición
  command: <command>
  when: <condición>
  register: <variable_resultado>
  become: yes

En este ejemplo, el comando <command> solo se ejecutará si la <condición> es verdadera.

Por ejemplo, para ejecutar el comando free solo si el sistema tiene menos del 20% de memoria libre:

- name: Comprobar memoria libre
  command: free -m
  register: memory_result
  become: yes

- name: Ejecutar comando si la memoria libre es inferior al 20%
  command: <command_to_execute>
  when: (memory_result.stdout_lines[1].split()[3]|int / memory_result.stdout_lines[1].split()[1]|int * 100) < 20
  register: <variable_resultado>
  become: yes

Iteración sobre Comandos

También puedes utilizar bucles para ejecutar múltiples comandos en una sola tarea. El módulo de comando de Ansible admite el parámetro loop para este propósito:

- name: Ejecutar múltiples comandos
  command: "{{ item }}"
  loop:
    - <command1>
    - <command2>
    - <command3>
  register: <variable_resultado>
  become: yes

En este ejemplo, los comandos especificados (<command1>, <command2> y <command3>) se ejecutarán uno a uno, y la salida se almacenará en la variable <variable_resultado>.

Manejo de Timeouts de Comandos

De forma predeterminada, Ansible esperará indefinidamente a que un comando se complete. Sin embargo, puedes establecer un tiempo límite para la ejecución del comando utilizando el parámetro timeout:

- name: Ejecutar comando con tiempo límite
  command: <command>
  timeout: 60
  register: <variable_resultado>
  become: yes

En este ejemplo, el comando se finalizará si tarda más de 60 segundos en completarse.

Dominando estas técnicas avanzadas de ejecución de comandos, puedes mejorar aún más las capacidades de automatización de Ansible y gestionar una amplia gama de escenarios en la administración de tu infraestructura.

Resumen

Este tutorial de Ansible ha proporcionado una guía completa sobre el uso del módulo de comandos para ejecutar comandos en hosts remotos. Al comprender los fundamentos y explorar las técnicas avanzadas, puedes aprovechar las capacidades de Ansible para optimizar tus operaciones de TI y mejorar la eficiencia en toda tu infraestructura.