Cómo usar Ansible: Una guía de referencia

Introducción

Ansible es una herramienta moderna de gestión de configuraciones que facilita la tarea de configurar y mantener servidores remotos.

Esta guía en formato de hoja de trucos proporciona una referencia rápida a los comandos y prácticas comúnmente utilizados al trabajar con Ansible. Para obtener una visión general de Ansible y cómo instalarlo y configurarlo, consulte nuestra guía sobre Cómo Instalar y Configurar Ansible en Ubuntu 20.04.

Cómo Usar Esta Guía:

  • Esta guía está en formato de hoja de trucos con fragmentos de línea de comandos autocontenidos.
  • Salta a cualquier sección que sea relevante para la tarea que estás tratando de completar.
  • Cuando veas texto destacado en los comandos de esta guía, ten en cuenta que este texto debería referirse a los hosts, nombres de usuario y direcciones IP de tu propio inventario.

Glosario de Ansible

Los siguientes términos específicos de Ansible se utilizan ampliamente en esta guía:

  • Máquina de Control / Nodo: un sistema donde Ansible está instalado y configurado para conectarse y ejecutar comandos en nodos.
  • Nodo: un servidor controlado por Ansible.
  • Archivo de Inventario: un archivo que contiene información sobre los servidores que Ansible controla, típicamente ubicado en /etc/ansible/hosts.
  • Libro de Jugadas: un archivo que contiene una serie de tareas a ejecutar en un servidor remoto.
  • Rol: una colección de libros de jugadas y otros archivos que son relevantes para un objetivo como instalar un servidor web.
  • Jugada: una ejecución completa de Ansible. Una jugada puede tener varios libros de jugadas y roles, incluidos desde un solo libro de jugadas que actúa como punto de entrada.

Si deseas un ejemplo de estos comandos en práctica, consulta nuestra guía sobre Cómo Usar Ansible para Automatizar la Configuración Inicial del Servidor en Ubuntu 20.04. Necesitarás al menos un servidor remoto para usar como nodo.

Prueba de Conectividad a los Nodos

Para probar que Ansible puede conectarse y ejecutar comandos y libros de jugadas en tus nodos, puedes usar el siguiente comando:

  1. ansible all -m ping

El módulo ping probará si tienes credenciales válidas para conectarte a los nodos definidos en tu archivo de inventario, además de probar si Ansible puede ejecutar scripts de Python en el servidor remoto. Una respuesta de pong significa que Ansible está listo para ejecutar comandos y libros de jugadas en ese nodo.

Conectarse como un usuario diferente

Por defecto, Ansible intenta conectarse a los nodos como el usuario del sistema actual, utilizando su par de claves SSH correspondiente. Para conectarse como un usuario diferente, agregue el comando con la bandera -u seguida del nombre del usuario deseado:

  1. ansible all -m ping -u sammy

Lo mismo es válido para ansible-playbook:

  1. ansible-playbook myplaybook.yml -u sammy

Usar una clave SSH personalizada

Si está utilizando una clave SSH personalizada para conectarse a los servidores remotos, puede proporcionarla en el momento de la ejecución con la opción --private-key:

  1. ansible all -m ping --private-key=~/.ssh/custom_id

Esta opción también es válida para ansible-playbook:

  1. ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id

Usar autenticación basada en contraseña

Si necesita utilizar autenticación basada en contraseña para conectarse a los nodos, debe agregar la opción --ask-pass a su comando de Ansible.

Esto hará que Ansible le solicite la contraseña del usuario en el servidor remoto al que está intentando conectarse:

  1. ansible all -m ping --ask-pass

Esta opción también es válida para ansible-playbook:

  1. ansible-playbook myplaybook.yml --ask-pass

Proporcionando la Contraseña de sudo

Si el usuario remoto necesita proporcionar una contraseña para ejecutar comandos sudo, puede incluir la opción --ask-become-pass en su comando Ansible. Esto le pedirá que proporcione la contraseña de sudo del usuario remoto:

  1. ansible all -m ping --ask-become-pass

Esta opción también es válida para ansible-playbook:

  1. ansible-playbook myplaybook.yml --ask-become-pass

Usando un Archivo de Inventario Personalizado

El archivo de inventario predeterminado generalmente se encuentra en /etc/ansible/hosts, pero también puede usar la opción -i para señalar archivos de inventario personalizados al ejecutar comandos y playbooks de Ansible. Ansible también admite scripts de inventario para construir archivos de inventario dinámicos, para cuando su inventario fluctúa, con servidores que se crean y destruyen con frecuencia. Los archivos de inventario personalizados son útiles para configurar inventarios por proyecto que se pueden incluir en sistemas de control de versiones como Git:

  1. ansible all -m ping -i my_custom_inventory

La misma opción es válida para ansible-playbook:

  1. ansible-playbook myplaybook.yml -i my_custom_inventory

Ejecución de Comandos ad-hoc

Para ejecutar un comando en un nodo, utiliza la opción -a seguida del comando que deseas ejecutar, entre comillas.

Esto ejecutará uname -a en todos los nodos de tu inventario:

  1. ansible all -a "uname -a"

También es posible ejecutar módulos de Ansible con la opción -m. El siguiente comando instalaría el paquete vim en server1 de tu inventario:

  1. ansible server1 -m apt -a "name=vim"

Antes de realizar cambios en tus nodos, puedes realizar una prueba en seco para predecir cómo los servidores serían afectados por tu comando. Esto se puede hacer incluyendo la opción --check:

  1. ansible server1 -m apt -a "name=vim" --check

Ejecución de Playbooks

Para ejecutar un playbook y ejecutar todas las tareas definidas dentro de él, utiliza el comando ansible-playbook:

  1. ansible-playbook myplaybook.yml

Para sobrescribir la opción hosts por defecto en el playbook y limitar la ejecución a un cierto grupo o host, incluye la opción -l en tu comando:

  1. ansible-playbook -l server1 myplaybook.yml

Obteniendo información sobre una obra

La opción --list-tasks se utiliza para listar todas las tareas que se ejecutarían en una obra sin realizar ningún cambio en los servidores remotos:

  1. ansible-playbook myplaybook.yml --list-tasks

De manera similar, es posible listar todos los anfitriones que se verían afectados por una obra, sin ejecutar ninguna tarea en los servidores remotos:

  1. ansible-playbook myplaybook.yml --list-hosts

Puedes usar etiquetas para limitar la ejecución de una obra. Para listar todas las etiquetas disponibles en una obra, utiliza la opción --list-tags:

  1. ansible-playbook myplaybook.yml --list-tags

Controlando la Ejecución del Libro de Juego

Puedes usar la opción --start-at-task para definir un nuevo punto de entrada para tu libro de juego. Ansible entonces omitirá todo lo que esté antes de la tarea especificada, ejecutando el resto de la obra desde ese punto en adelante. Esta opción requiere un nombre de tarea válido como argumento:

  1. ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"

Para ejecutar solo tareas asociadas con etiquetas específicas, puedes usar la opción --tags. Por ejemplo, si deseas ejecutar solo tareas etiquetadas como nginx o mysql, puedes usar:

  1. ansible-playbook myplaybook.yml --tags=mysql,nginx

Si desea omitir todas las tareas que estén bajo etiquetas específicas, utilice --skip-tags. El siguiente comando ejecutaría miarchivo.yml, omitiendo todas las tareas etiquetadas como mysql:

  1. ansible-playbook myplaybook.yml --skip-tags=mysql

Uso de Ansible Vault para almacenar datos sensibles

Si sus playbooks de Ansible manejan datos sensibles como contraseñas, claves de API y credenciales, es importante mantener esos datos seguros mediante un mecanismo de cifrado. Ansible proporciona ansible-vault para cifrar archivos y variables.

Aunque es posible cifrar cualquier archivo de datos de Ansible así como archivos binarios, es más común utilizar ansible-vault para cifrar archivos de variables que contienen datos sensibles. Después de cifrar un archivo con esta herramienta, solo podrá ejecutar, editar o ver su contenido proporcionando la contraseña relevante definida cuando cifró el archivo por primera vez.

Creación de un nuevo archivo cifrado

Puede crear un nuevo archivo cifrado de Ansible con:

  1. ansible-vault create credentials.yml

Este comando realizará las siguientes acciones:

  • Primero, te pedirá que ingreses una nueva contraseña. Deberás proporcionar esta contraseña cada vez que accedas al contenido del archivo, ya sea para editarlo, verlo o simplemente ejecutar playbooks o comandos utilizando esos valores.
  • Después, abrirá tu editor de línea de comandos predeterminado para que puedas poblar el archivo con el contenido deseado.
  • Finalmente, cuando hayas terminado de editar, ansible-vault guardará el archivo como datos encriptados.

Cifrado de un Archivo de Ansible Existente

Para cifrar un archivo de Ansible existente, puedes utilizar la siguiente sintaxis:

  1. ansible-vault encrypt credentials.yml

Esto te pedirá una contraseña que necesitarás ingresar cada vez que accedas al archivo credentials.yml.

Visualización del Contenido de un Archivo Encriptado

Si deseas ver el contenido de un archivo que fue previamente encriptado con ansible-vault y no necesitas cambiar su contenido, puedes utilizar:

  1. ansible-vault view credentials.yml

Esto te pedirá que proporciones la contraseña que seleccionaste cuando encriptaste el archivo por primera vez con ansible-vault.

Edición de un archivo cifrado

Para editar el contenido de un archivo que fue previamente cifrado con Ansible Vault, ejecuta:

  1. ansible-vault edit credentials.yml

Esto te pedirá que proporciones la contraseña que elegiste al cifrar por primera vez el archivo credentials.yml con ansible-vault. Después de validar la contraseña, tu editor de línea de comandos predeterminado se abrirá con el contenido no cifrado del archivo, lo que te permitirá realizar tus cambios. Cuando hayas terminado, puedes guardar y cerrar el archivo como lo harías normalmente, y los contenidos actualizados se guardarán como datos cifrados.

Descifrado de archivos cifrados

Si deseas revertir permanentemente un archivo que fue previamente cifrado con ansible-vault a su versión no cifrada, puedes hacerlo con esta sintaxis:

  1. ansible-vault decrypt credentials.yml

Esto te pedirá que proporciones la misma contraseña utilizada al cifrar por primera vez el archivo credentials.yml con ansible-vault. Después de validar la contraseña, el contenido del archivo se guardará en el disco como datos no cifrados.

Usar Múltiples Contraseñas de Bóveda

Ansible admite múltiples contraseñas de bóveda agrupadas por diferentes identificadores de bóveda. Esto es útil si deseas tener contraseñas de bóveda dedicadas para diferentes entornos, como entornos de desarrollo, pruebas y producción.

Para crear un nuevo archivo encriptado usando un identificador de bóveda personalizado, incluye la opción --vault-id junto con una etiqueta y la ubicación donde ansible-vault puede encontrar la contraseña para esa bóveda. La etiqueta puede ser cualquier identificador y la ubicación puede ser prompt, lo que significa que el comando debe solicitarte que ingreses una contraseña, o una ruta válida a un archivo de contraseña.

  1. ansible-vault create --vault-id dev@prompt credentials_dev.yml

Esto creará un nuevo identificador de bóveda llamado dev que utiliza prompt como fuente de contraseña. Al combinar este método con archivos de variables de grupo, podrás tener bóvedas de ansible separadas para cada entorno de aplicación:

  1. ansible-vault create --vault-id prod@prompt credentials_prod.yml

Utilizamos dev y prod como identificadores de bóveda para demostrar cómo puedes crear bóvedas separadas por entorno, pero puedes crear tantas bóvedas como desees y puedes usar cualquier identificador de tu elección como identificador de bóveda.

Ahora, para ver, editar o desencriptar estos archivos, necesitarás proporcionar el mismo identificador de bóveda y fuente de contraseña junto con el comando ansible-vault:

  1. ansible-vault edit credentials_dev.yml --vault-id dev@prompt

Usando un Archivo de Contraseña

Si necesitas automatizar el proceso de aprovisionamiento de servidores con Ansible utilizando una herramienta de terceros, necesitarás proporcionar la contraseña del almacén sin que se te solicite. Puedes hacerlo utilizando un archivo de contraseña con ansible-vault.

A password file can be a plain text file or an executable script. If the file is an executable script, the output produced by this script will be used as the vault password. Otherwise, the raw contents of the file will be used as vault password.

Para utilizar un archivo de contraseña con ansible-vault, debes proporcionar la ruta a un archivo de contraseña al ejecutar cualquiera de los comandos del almacén:

  1. ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml

Ansible no hace distinción entre contenido que fue encriptado utilizando prompt o un archivo de contraseña como fuente de contraseña, siempre y cuando la contraseña de entrada sea la misma. En términos prácticos, esto significa que está bien encriptar un archivo usando prompt y luego usar un archivo de contraseña para almacenar la misma contraseña utilizada con el método prompt. Lo contrario también es cierto: puedes encriptar contenido utilizando un archivo de contraseña y luego usar el método prompt, proporcionando la misma contraseña cuando Ansible lo solicite.

Para obtener flexibilidad y seguridad extendidas, en lugar de tener tu contraseña del almacén almacenada en un archivo de texto plano, puedes utilizar un script de Python para obtener la contraseña de otras fuentes. El repositorio oficial de Ansible contiene algunos ejemplos de scripts de almacén que puedes utilizar como referencia al crear un script personalizado que se adapte a las necesidades particulares de tu proyecto.

Ejecutando un Playbook con Datos Encriptados a través de Ansible Vault

Cada vez que ejecutas un playbook que utiliza datos previamente encriptados mediante ansible-vault, necesitarás proporcionar la contraseña del vault al comando de tu playbook.

Si utilizaste las opciones predeterminadas y el origen de contraseña prompt al encriptar los datos utilizados en este playbook, puedes utilizar la opción --ask-vault-pass para que Ansible te solicite la contraseña:

  1. ansible-playbook myplaybook.yml --ask-vault-pass

Si utilizaste un archivo de contraseña en lugar de solicitar la contraseña, deberías usar la opción --vault-password-file en su lugar:

  1. ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py

Si estás utilizando datos encriptados bajo un ID de vault, necesitarás proporcionar el mismo ID de vault y origen de contraseña que utilizaste al encriptar los datos por primera vez:

  1. ansible-playbook myplaybook.yml --vault-id dev@prompt

Si estás utilizando un archivo de contraseña con tu ID de vault, deberías proporcionar la etiqueta seguida de la ruta completa al archivo de contraseña como origen de contraseña:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py

Si tu playbook utiliza varios vaults, deberías proporcionar un parámetro --vault-id para cada uno de ellos, sin un orden particular:

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt

Depuración

Si te encuentras con errores al ejecutar comandos y playbooks de Ansible, es una buena idea aumentar la verbosidad de la salida para obtener más información sobre el problema. Puedes hacerlo incluyendo la opción -v en el comando:

  1. ansible-playbook myplaybook.yml -v

Si necesitas más detalle, puedes usar -vvv y esto aumentará la verbosidad de la salida. Si no puedes conectar con los nodos remotos a través de Ansible, utiliza -vvvv para obtener información de depuración de la conexión:

  1. ansible-playbook myplaybook.yml -vvvv

Conclusión

Esta guía cubre algunos de los comandos de Ansible más comunes que puedes utilizar al aprovisionar servidores, como ejecutar comandos remotos en tus nodos y cómo ejecutar playbooks usando una variedad de configuraciones personalizadas.

Existen otras variaciones de comandos y banderas que puedes encontrar útiles para tu flujo de trabajo de Ansible. Para obtener una visión general de todas las opciones disponibles, puedes usar el comando help:

  1. ansible --help

Si deseas ver una visión más completa de Ansible y todos sus comandos y características disponibles, por favor consulta la documentación oficial de Ansible.

Si deseas ver otro ejemplo práctico de Ansible, revisa nuestra guía sobre Cómo Usar Ansible para Instalar y Configurar Docker en Ubuntu 20.04.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-ansible-cheat-sheet-guide