Ansible se usa ampliamente como motor de automatización para necesidades de TI, como administración de configuración, implementación en la nube y más. La automatización suena genial, pero ¿cómo logra Ansible esto? Utiliza “módulos” que se encargan de la automatización. Sin estos módulos, un usuario tendría que usar comandos ad hoc para realizar tareas.
Sin embargo, los comandos ad hoc no son reutilizables. Claro, le brindan una forma de realizar rápidamente tareas individuales, pero no se pueden reutilizar. Se podría dibujar una analogía donde el modo de libro de jugadas es como un script de shell mientras que los comandos individuales son de una sola línea.
Hablando del shell, Ansible también tiene un módulo de shell. Este módulo se utiliza para ejecutar comandos de shell en sistemas de destino. En esta guía, echaremos un vistazo al módulo de shell de Ansible y demostraremos cómo se puede usar con ejemplos.
Tabla de Contenidos
¿Qué es el módulo shell?
El módulo de shell de Ansible permite al usuario ejecutar comandos complejos con redirección, canalizaciones, etc. Toma un nombre de comando, sus argumentos delimitados por espacios y lo ejecuta en hosts remotos.
Puede sonar igual que el módulo de comandos de Ansible, pero la diferencia es que ejecuta los comandos en el host mediante un shell. El módulo de shell también tiene acceso a variables de entorno y operadores especiales como | < > & ; etc. Aún mejor, puede ejecutar scripts completos utilizando el módulo de shell. No obstante, es de conocimiento común entre los usuarios de Ansible que el módulo de comando es una opción más segura y predecible que el módulo de shell.
Finalmente, es importante recordar que este módulo solo funciona con sistemas Linux. Los usuarios de Windows pueden usar ansible.windows.win_shell en su lugar. Ahora entremos en los detalles del módulo de shell de Ansible.
Uso del módulo Ansible Shell
Antes de comenzar a ejecutar comandos y scripts, echemos un vistazo a los parámetros a los que necesita pasar valores cuando usa este módulo.
- chdir – Cambia el directorio actual antes de la ejecución.
- cmd: una cadena que contiene el comando que se ejecutará junto con sus argumentos.
- ejecutable: requiere una ruta absoluta para cambiar el shell que está utilizando.
- eliminado – Toma un nombre de archivo. 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.
- advertir: acepta sí (predeterminado) o no, habilita o deshabilita las advertencias de tareas.
Ahora pasemos a algunos ejemplos del uso del shell de Ansible.
Ejemplo 1: cambiar el directorio de trabajo
Si desea cambiar el directorio de trabajo antes de ejecutar un comando, haga lo siguiente.
– Apellido: Cambiar el directorio de trabajo a myDir
ansible.Builtin.Shell: miScript.sh >> miRegistro.txt
argumentos:
chdir: mi Dial/
Ahora que hemos creado un libro de jugadas, puede ejecutarlo desde la terminal de Linux ejecutando:
ansible-playbook testbook.yml
Ejemplo 2: salida del comando de extracción
Si desea capturar y almacenar el valor de retorno de un comando de shell, se puede usar la palabra clave de registro.
– Apellido: Cree un archivo .txt en $HOME
manga: eco «¡Sálvame!» > $INICIO/prueba.txt
registrarse: shell_output
– depuración: var=salida_shell
Ejemplo 3: Comprobación de la fecha
Comencemos por verificar la fecha en nuestro servidor remoto llamado prueba. Observe cómo la sintaxis del módulo de shell difiere aquí. Esta es solo otra forma de usar el módulo de shell de Ansible.
– Apellido: Comprobando la fecha
manga:
«Fecha»
registrarse: fechacmd
palabras clave: fechacmd
– depuración: mensaje =«{{datecmd.stdout}}»
Usamos el comando de fecha simple para verificar la fecha en un sistema remoto. Además, la salida del comando (la fecha en sí) se devuelve a un registro llamado datecmd. Finalmente, mostramos el contenido de la variable de registro datecmd imprimiendo su atributo stdout.
Ejemplo 4: ejecutar múltiples comandos
En este ejemplo, crearemos algunos archivos de texto en un directorio temporal.
– Apellido: Creación de varios archivos
ansible.Builtin.Shell: |
echo «Soy el archivo 1» > /tmp/myFile1.txt
echo «Soy el archivo 2″> /tmp/myFile2.txt
echo «Soy el archivo 3» > /tmp/myFile3.txt
Hacerse realidad
argumentos:
chdir: /var/registro
Aquí usamos código de shell para crear tres archivos, a saber, myFile1, miarchivo2, y miarchivo3. La línea «bewere:true» le permite convertirse en usuario del host remoto. Finalmente, pasamos un argumento chdir y cambiamos el directorio.
Ejemplo 5: Aplicación de redirección y canalización
Ahora veamos cómo funcionan las canalizaciones y la redirección en el módulo de shell de Ansible. Ejecutaremos un comando ls simple con algo de preprocesamiento awk. Además, usamos sed para eliminar líneas vacías. Al final redirigimos la salida a un archivo de texto.
– Apellido: Tome una lista del directorio y aliméntelo a un archivo
manga:
» ls -lrt /apps|awk ‘{print $9}’|sed ‘/^$/d’ > /tmp/myDir.txt «
registrarse: fuera de
palabras clave: fuera de
– Apellido: ver el archivo
manga: gato /tmp/dirlist.txt
registrarse: lista de visualización
– depuración: mensaje =«{{displaylist.stdout_lines}}»
Primero, ejecutamos el comando anterior y guardamos su resultado en myDir.txt. Después de eso, usamos otro comando cat para guardar el contenido del archivo en un registro. Finalmente, se muestra esta variable de registro.
¿Cómo prevenir la inyección de comandos?
Como se mencionó anteriormente, el módulo de comando se considera una forma segura de hacer las cosas. Sin embargo, tiene una funcionalidad algo limitada. Entonces, ¿cómo usar el módulo shell de forma segura?
Puede usar el filtro de comillas dobles para proteger los nombres de variables que pasa al módulo de shell de la inyección de comandos. A continuación se muestra un ejemplo de esta desinfección.
– Apellido: Creando un archivo .txt con el filtro de cotización
manga: eco «Estoy seguro» > $INICIO/{{ archivo seguro | cita }}.TXT
Es una buena práctica usar siempre el filtro de citas para sus variables. Esto disuade a los hackers de modificar el comando en tiempo de ejecución. Es muy similar a la inyección SQL, pero siempre que tome precauciones de seguridad, ¡no tiene que preocuparse!
Conclusión
El módulo Ansible Shell es un módulo versátil y potente que aumenta el control del usuario y simplifica enormemente la configuración remota. En este artículo, hemos visto lo que hace, qué parámetros tiene, qué argumentos toma y más. Con suerte, ahora está bien equipado para usar el módulo de shell de Ansible.