Ejecución de comandos en servidores remotos con el módulo Ansible Shell

Ansible es una herramienta de gestión de configuraciones ampliamente utilizada que simplifica la gestión de múltiples servidores. Optimiza tareas como la configuración de servidores y la instalación de aplicaciones mediante la automatización, lo que le permite gestionar numerosos servidores remotos y ejecutar tareas de forma secuencial desde un nodo central. Además, Ansible es popular por sus numerosos módulos y su capacidad para funcionar a la perfección a través de SSH sin necesidad de instalar software adicional en los servidores de destino.

En este tutorial, aprenderemos a ejecutar comandos en servidores remotos con el módulo Ansible Shell. Además, también exploraremos cómo ejecutar comandos ad hoc de Ansible y crear un libro de jugadas para ejecutar diferentes comandos de shell.

Requisitos previos

Debe cumplir los siguientes requisitos previos para utilizar el módulo Ansible Shell:

  1. En esta guía, utilizamos Ubuntu 22.04. Por lo tanto, Ansible debe estar instalado y configurado en su sistema Ubuntu.
  2. Debe configurar un host remoto en el que ejecutará los comandos utilizando el módulo de shell de Ansible.

¿Qué es el módulo de shell de Ansible?

El módulo de shell de Ansible permite a los usuarios ejecutar comandos en el shell de los sistemas de destino. Permite a los usuarios ejecutar comandos complejos con tuberías y redireccionamiento en destinos remotos que mantienen la originalidad de la ejecución del comando.

Al ejecutar comandos en el módulo de shell de Ansible, toma el nombre del comando, los parámetros o los argumentos separados por delimitadores de espacio en blanco y ejecuta estos comandos en los hosts remotos.

Diferencia: módulo de shell de Ansible frente al módulo de comando

Tanto el módulo de shell de Ansible como el módulo de comando son bastante similares y dan los mismos resultados. Sin embargo, existen algunas diferencias entre estos dos módulos que hemos enumerado a continuación:

  1. El módulo shell de Ansible admite todos los operadores especiales, variables de entorno, tuberías y redirecciones. Por el contrario, los módulos de comando no admiten los operadores (<, >, &,;, | |), las variables de entorno ni las tuberías.
  2. El módulo de comando no permite a los usuarios ejecutar comandos directamente en el shell. En este caso, el módulo shell de Ansible ofrece más flexibilidad que el módulo de comando. Con el módulo shell, puede ejecutar comandos directamente en el shell de los hosts de destino. Utiliza el shell «/bin/sh» de forma predeterminada para ejecutar comandos. También puede configurar otros shells para ejecutar comandos en hosts remotos.
  3. Los usuarios de Ansible prefieren utilizar módulos de comando en términos de seguridad al ejecutar comandos en sistemas de destino. Los comandos ejecutados por Ansible en el módulo de comando son más seguros y ofrecen opciones más predecibles que el módulo de shell de Ansible. Además, el módulo de comando no afecta al entorno de shell remoto del usuario.

Introducción a los comandos de shell de Ansible: ejecutar comandos ad hoc

Los comandos ad hoc son comandos de una sola línea que no se pueden reutilizar en el futuro. Sin embargo, puede utilizar los comandos de shell ad hoc de Ansible para ejecutar rápidamente tareas individuales. A continuación se muestra la sintaxis básica de los comandos ad hoc:

ansible [patrón] -m [módulo de Ansible] -a {comandos con opciones}

En la sintaxis anterior, el patrón representa el grupo de hosts al que pertenece el host de destino. La opción «-m» especifica el tipo de módulo y la opción «-a» toma los argumentos del comando.

Veamos un ejemplo para explicar la sintaxis del comando ad hoc de Ansible. En este ejemplo, intentaremos mostrar la fecha y la hora del host de destino. Aquí, solo nos hemos conectado a un host y hemos creado un usuario independiente, «ansible». Utilice el siguiente comando para mostrar la fecha y la hora del host remoto:

$ ansible 192.168.1.14 -u ansible -m shell -a «timedatectl»

El comando ad-hoc de Ansible anterior se conectará al host remoto en la dirección IP «192.168.1.14» utilizando el nombre de usuario «ansible» a través de SSH. A continuación, se ejecutará el comando «timedatectl» en el host remoto, que se utiliza para mostrar información sobre la configuración de fecha y hora del sistema.

$ ansible <dirección IP> -u ansible -m shell -a «timedatectl | grep Time»

Con el comando ad hoc de Ansible anterior, se ejecutará el comando «timedatectl» y, a continuación, utilizando el comando grep, se filtrarán y mostrarán las líneas que contengan «Time».

Del mismo modo, puede mostrar la información del sistema utilizando el comando «uptime» y la media de carga. Para ello, utilice el siguiente comando:

$ ansible <dirección IP> -u ansible -m shell -a «uptime»

Cuando ejecute el comando de shell de Ansible anterior, se ejecutará el comando uptime después de conectarse al host remoto.

$ ansible <dirección IP> -u ansible -m shell -a setup

El comando anterior sirve para recopilar datos e información del sistema sobre el host remoto utilizando Ansible.

¿Cómo se utiliza el módulo de shell de Ansible?

Antes de ejecutar los comandos de shell de Ansible, es esencial que conozca los parámetros básicos de shell que deberá pasar mientras utiliza el módulo de shell de Ansible:

chdir: cambia el directorio actual antes de ejecutar el comando.

cmd: una cadena que contiene el comando que se va a ejecutar, junto con los argumentos asociados.

executable: requiere una ruta absoluta para cambiar el shell que está utilizando el usuario.

removes: toma el nombre del archivo y se utiliza para excluir pasos cuando un archivo no existe.

stdin: permite al usuario establecer el «stdin» de un comando en un valor específico.

warn: toma (por defecto) sí o no, habilitando o deshabilitando las advertencias de tareas.

Una vez aclarado esto, veamos algunos ejemplos de cómo utilizar el shell de Ansible.

Ejecutar comandos con el módulo Shell de Ansible

La verdadera potencia de Ansible reside en el uso de playbooks, que permiten realizar tareas avanzadas en los hosts de destino. Además de utilizar comandos ad hoc, también puede utilizar el módulo Shell de Ansible dentro de los playbooks para definir tareas para hosts remotos.

Ejecutar un solo comando con el módulo shell de Ansible

También puede ejecutar un solo comando con el módulo shell de Ansible. Para ello, cree un playbook y pegue las siguientes líneas de código en este archivo:

- nombre: Ejemplo del módulo shell
 hosts: servidores_base_de_datos
 tareas:
 - nombre: Comprobar la información del sistema
 shell:
 «df -h»
 registrar: «os_info»



- debug:
 msg: «{{“os_info”.stdout_lines}}»
 

Ahora, guarda los cambios en este archivo y sal de él con «Ctrl+X». A continuación, ejecuta este playbook con el siguiente comando:

$ ansible-playbook --ask-become-pass -i hosts environment_var.yml

Después de ejecutar el comando anterior, verá la siguiente información en la ventana de la terminal:

Ansible ejecuta varios comandos con el módulo Shell

Puede ejecutar varias tareas secuencialmente utilizando Ansible. Para crear un playbook de Ansible, cree un archivo vacío en su editor de código fuente. En esta guía, utilizamos el editor nano para crear un playbook.

$ sudo nano testplaybook.yml

El libro de jugadas de Ansible anterior realiza diferentes tareas, como crear un usuario, actualizar la caché de paquetes e instalar o actualizar el paquete Nginx en el host de destino remoto especificado. Utiliza variables para que el libro de jugadas sea más flexible y reutilizable.

Guarde el archivo anterior con «Ctrl+O» y salga de este archivo con «Ctrl+x».

Aquí estamos utilizando el archivo de inventario personalizado «hosts». Para ejecutar este playbook, utilice el siguiente comando:

$ ansible-playbook --ask-become-pass -i hosts testplaybook.yml

En el comando anterior, «--ask-become-pass» le pedirá que introduzca la contraseña de root y, a continuación, mostrará el siguiente resultado en la pantalla:

Instalar un paquete con el módulo Ansible Shell

También puede instalar un paquete en el host remoto de destino. Considere el siguiente playbook para instalar los paquetes «apache2» en el host de destino utilizando Ansible:

hosts: database_servers
become: yes
tasks:
name:
apt:
 update_cache: yes
name: install apache2 package
apt:
 name: apache2
 

Después de ejecutar el playbook anterior, observará que apache2 está instalado en los servidores remotos.

Evitar la inyección de comandos Shell

Como hemos comentado anteriormente, el módulo de comandos de Ansible se considera una opción más segura para ejecutar comandos en sistemas remotos. Sin embargo, tiene ciertas limitaciones en cuanto a funcionalidad.

Para utilizar el módulo shell de forma segura, puede emplear una técnica denominada «filtrado de comillas» para evitar que los nombres de las variables puedan ser objeto de una inyección de comandos. El siguiente ejemplo muestra este proceso de inyección de comandos para garantizar la seguridad de los comandos shell.

- nombre: Crear una tabla en la base de datos { nombre de la base de datos }
`shell`: `mysql -u root -psecret -e «CREATE TABLE { quote| nombre de la tabla | quote } (id INT, name VARCHAR(255));»`
convertir: sí
- nombre: Ejemplo de filtro de comillas de Ansible
hosts: servidores de bases de datos
vars:

- nombre de la base de datos: mydb
 - nombre de la tabla: my table
 

El playbook de Ansible anterior crea una tabla MySQL con un nombre único en una base de datos especificada, utilizando el filtro de comillas para proteger contra posibles problemas con caracteres especiales en el nombre de la tabla.

Conclusión

El módulo de shell de Ansible es una herramienta flexible y robusta que mejora el control del usuario y simplifica las configuraciones de servidores remotos. En este artículo, hemos explorado cómo utilizar el módulo de shell de Ansible, sus parámetros y los argumentos necesarios. Esperamos que con estos conocimientos pueda utilizar eficazmente el módulo de shell de Ansible en su sistema Linux.

Blog