Documentos de Académico
Documentos de Profesional
Documentos de Cultura
También puede usar una guía de Ansible para implementar su clave pública en
la cuenta remote_user en todos los hosts administrados con el módulo
authorized_key.
Formato Playbook.yml
Ejecución de guías
Verificación de la sintaxis
Ejecución de un simulacro
Puede usar la opción -C para realizar un simulacro de la ejecución de la guía de
reproducción. Esto hace que Ansible reporte los cambios que habrían ocurrido si se
hubiese ejecutado la guía, aunque no realiza ningún cambio real a los hosts
administrados.
Implementación de varias reproducciones
El siguiente ejemplo muestra una guía simple con dos reproducciones.
Usuarios remotos y aumento de privilegios en las reproducciones
La palabra clave booleana become se puede usar para habilitar o deshabilitar el aumento
de privilegios, independientemente de cómo se define en el archivo de configuración
Ansible. Puede seleccionar yes (sí) o true (verdadero) para habilitar el aumento de
privilegios, o no o false (falso) para deshabilitarlo.
la palabra clave become_user puede definir la cuenta del usuario que debe usarse para el
aumento de privilegios dentro del contexto de una reproducción específica.
Documentación de módulos
Mantenimiento de módulos
Ansible se proporciona con una gran cantidad de módulos que pueden usarse para
muchas tareas.
Ansible también busca módulos personalizados en el directorio ./library,
relacionados con la guía de reproducción que se está ejecutando actualmente.
Comentarios en YAML
Cadenas en YAML
Existen dos formas de escribir cadenas de líneas múltiples. Puede usar el carácter
de barra vertical (|) para denotar que deben preservarse los caracteres de nueva
línea dentro de una cadena.
También puede escribir cadenas de líneas múltiples usando el carácter mayor que
(>) para indicar que los caracteres de nueva línea se deben convertir a espacios y
que se deben quitar los espacios en blanco en las líneas.
Listas en YAML
Definición de variables
Puede establecer una variable que afecte a un grupo de hosts o solo a hosts
individuales. También puede establecer variables adicionales en la línea de
comandos ansible-playbook con la opción --extra-vars o -e y especificar esas
variables, que anulan todos los demás valores para ese nombre de variable.
• Variables de grupo definidas en el inventario.
• Agrupar variables definidas en archivos en un subdirectorio group_vars en el
mismo directorio
que el inventario o la guía de reproducción.
• Variables de host definidas en el inventario.
• Variables de host definidas en archivos en un subdirectorio host_vars en el
mismo directorio
que el inventario o la guía de reproducción.
• Datos del host, descubiertos en tiempo de ejecución.
• Reproducir variables en la guía de reproducción (vars y vars_files).
• Variables de tareas.
• Variables adicionales definidas en la línea de comandos.
Variables en guías
• Definición de la variable de grupo user para el grupo servers, que consta de dos
grupos de hosts, cada uno con dos servidores.
Uso de directorios para completar variables de host y de grupo
Para definir variables de grupo para el grupo servers, debería crear un archivo YAML
denominado group_vars/servers y, luego, el contenido de ese archivo establecería
variables para valores con la misma sintaxis que en una guía de reproducción:
• Si se debe definir un valor general para todos los servidores en los dos centros de
datos, se puede establecer una variable de grupo para el grupo de hosts datacenters:
• Si el valor a definir varía para cada centro de datos, establezca una variable de grupo
para cada grupo de hosts del centro de datos:
• Si el valor por definir varía para cada host en cada centro de datos, se deben definir las
variables en archivos de variables de host diferentes:
|. |
| |
\ /
| |
| |
\. / O
Captura de salida de comando con variables registradas
Puede usar la declaración register para capturar la salida de un comando. El resultado se guarda en una
variable temporal que puede utilizarse posteriormente en la guía con motivos de depuración u otros
motivos, como una configuración particular basada en el resultado de un comando.
Ejemplo:
Gestión de secretos
Creación de un archivo cifrado
Para crear un nuevo archivo cifrado, use el comando ansible-vault create filename.
El comando le solicitará la nueva contraseña de Vault y abrirá un archivo con el editor predeterminado, vi.
En lugar de ingresar la contraseña de Vault mediante el ingreso estándar, se puede usar un archivo de
contraseña de Vault para almacenar la contraseña. Este archivo se deberá proteger cuidadosamente
mediante permisos de archivo y por otros medios.
El código usado para proteger archivos es AES256 en las versiones recientes de Ansible, pero los
archivos cifrados con versiones anteriores aún pueden utilizar AES de 128 bits.
Edición de un archivo cifrado existente
O bien, puede usar la opción --vault-password-file para especificar un archivo que almacene la
contraseña de cifrado en texto sin formato. La contraseña debe ser una cadena
Para simplificar la administración, tiene sentido configurar su proyecto de Ansible, de modo que las
variables confidenciales y todas las demás variables se guarden en archivos separados.
Los archivos que contienen las variables confidenciales se pueden proteger con el comando ansible-vault.
Sin embargo, en lugar de usar archivos en group_vars o host_vars, puede usar directorios para cada
grupo de hosts o host administrado. Aquellos directorios pueden contener varios archivos de variables,
que son usados por el grupo de hosts o el host administrado.
Gestión de datos
Los datos de Ansible son variables detectadas automáticamente por Ansible en un host administrado. Los
datos contienen información específica del host que puede usarse como variables regulares en
reproducciones, condicionales, bucles o cualquier otra declaración que dependa de un valor recopilado
de un host administrado.
Algunos de los datos recopilados para un host administrado pueden incluir los siguientes:
• El nombre del host
• La versión del kernel
• Las interfaces de red
• Las direcciones IP
• La versión del sistema operativo
• Diferentes variables de entorno
• La cantidad de CPU
• La memoria disponible o libre
• El espacio de disco disponible
Esto se informa como la tarea Gathering Facts
Cuando un dato se usa en una guía, Ansible sustituye de manera dinámica el nombre de la variable para
el dato con el valor correspondiente:
Los datos personalizados pueden usarse de la misma manera que los datos predeterminados en las guías:
Uso de variables mágicas
A continuación, se detallan cuatro de las más útiles:
hostvars
Contiene las variables para hosts administrados y puede usarse para obtener los valores
para
las variables de otro host administrado. No incluye los datos del host administrado si no
se
recopilaron aún para ese host.
group_names
Enumera todos los grupos en los que se encuentra el host administrado actual.
groups
Enumera todos los grupos y hosts en el inventario.
inventory_hostname
Contiene el nombre de host para el host administrado actual, según se configuró en el
inventario. Este puede ser diferente del nombre de host informado por los datos por
diversos motivos.
capítulo 4 Implementación del control de
tareas
Escritura de bucles y tareas condicionales
El uso de bucles elimina la necesidad de los administradores de escribir varias tareas que usen el mismo
módulo.
Bucles simples
Un bucle simple itera una tarea sobre una lista de elementos. Se agrega la palabra clave loop a la tarea, y
esta toma como valor la lista de elementos sobre los cuales se debería iterar la tarea. La variable de bucle
item contiene el valor usado durante cada iteración.
|. |
El siguiente ejemplo es un poco más sofisticado y prueba si la variable my_service tiene un valor.
Realización de pruebas de varias condiciones
Combinación de bucles y tareas condicionales
Puede combinar los bucles y los condicionales.
El dato ansible_mounts es una lista de diccionarios, cada uno de los cuales representa información
acerca de un sistema de archivos instalado. El bucle realiza la iteración de cada diccionario en la lista, y la
declaración condicional no se cumple, a menos que se determine que un diccionario representa un
sistema de archivos montado en donde ambas condiciones son verdaderas.
Implementación de manejadores
Los módulos Ansible están diseñados para ser idempotentes. Esto implica que en una guía programada
adecuadamente, la guía y sus tareas se pueden ejecutar múltiples veces sin cambiar el host
administrado, a menos que necesiten realizar un cambio para llevar al host administrado asu estado
deseado.
Los manejadores son tareas que responden a una notificación desencadenada por otras tareas. Las
tareas solo notifican a sus manejadores cuando la tarea cambia algo en un host administrado.
Cada controlador (handler) se activa por su nombre después del bloque de tareas de la guía. Si ninguna
tarea notifica al manejador por nombre, no se ejecutará el manejador. Si una o más tareas notifican al
manejador, el manejador se ejecutará exactamente una vez después de que todas las demás tareas en la
reproducción se hayan completado. Debido a que los manejadores son tareas, los administradores
pueden usar los mismos módulos en manejadores que utilizarían para cualquier otra tarea. Generalmente,
los manejadores se utilizan para reiniciar los hosts y los servicios.
Descripción de los beneficios del uso de manejadores
• Los manejadores se ejecutan siempre en el orden especificado por la sección handlers de la
reproducción. No se ejecutan en el orden en que aparecen en la lista por la declaración notify en una
tarea ni en el orden en que las tareas los notifican.
• Los manejadores se ejecutan después de que se hayan completado todas las demás tareas en la
reproducción. Un manejador invocado por una tarea en la parte tasks de la guía no se ejecutará hasta que
se hayan procesado todas las tareas en tasks. (Hay algunas excepciones menores a esto).
• Los nombres de los manejadores se encuentran en un espacio de nombres por reproducción. Si
erróneamente se asigna a dos manejadores el mismo nombre, se ejecutará uno solo.
• Inclusive si más de una tarea notifica a un manejador, este se ejecuta una sola vez. Si ninguna tarea lo
notifica, no se ejecutará el manejador.
• Si una tarea que incluye una declaración notify no informa un resultado changed (por ejemplo, un
paquete ya se encuentra instalado y la tarea muestra ok), no se notificará al manejador. Se omitirá el
manejador, a menos que otra tarea lo notifique. Ansible notifica a los manejadores solo si la tarea muestra
el estado CHANGED.
Los manejadores están diseñados para realizar una acción adicional cuando una tarea realiza un cambio
en un host administrado. No deben usarse como sustituto de las tareas normales.
Gestión de errores de tareas en reproducciones
Ansible evalúa los códigos de retorno de cada tarea para determinar si una tarea se realizó
satisfactoriamente o con errores.
Fallas de tareas ignoradas
De forma predeterminada, si una tarea falla, se cancela la reproducción. Sin embargo, el comportamiento
puede anularse si se ignoran las tareas fallidas. Puede usar la palabra clave ignore_errors en una tarea
para lograr esto.
El módulo fail también se puede utilizar para forzar una falla de tarea.
Especificación cuando una tarea informa resultados "changed"
Cuando una tarea realiza un cambio a un host administrado, informa el estado changed y notifica a los
manejadores. Cuando una tarea no necesita realizar un cambio, informa ok y no notifica a los
manejadores.
La palabra clave changed_when puede usarse para contr
olar cuando una tarea informa que se ha modificado.
El siguiente ejemplo usa el módulo shell que informa changed (modificado) según la salida del módulo
recopilada por una variable registrada:
Para asegurarse de que existe una línea de texto específica en un archivo existente, use el módulo
lineinfile:
Al usar el módulo blockinfile, los marcadores de bloque comentados se insertan al principio y al final del
bloque para garantizar la idempotencia.
Eliminación de un archivo de los hosts administrados
Un ejemplo básico para eliminar un archivo de los hosts administrados es usar el módulo file con el
parámetro state: absent. El parámetro state es opcional para muchos módulos. Siempre debe aclarar si
desea state: present o state: absent por varias razones.
Introducción a Jinja2
Ansible usa el sistema de plantillas Jinja2 para los archivos de plantilla.
Uso de delimitadores
Las variables y expresiones lógicas se colocan entre etiquetas, o delimitadores. Por ejemplo, las plantillas
Jinja2 usan {% EXPR %} para expresiones o lógica (por ejemplo, bucles), mientras que {{ EXPR }} se usan
para obtener los resultados de una expresión o una variable al usuario final. La última etiqueta, cuando se
representa, se reemplaza con un valor o con valores y son visibles para el usuario final. Use la sintaxis {#
COMMENT# } para encerrar los comentarios que no deberían aparecer en el archivo final.
Para incluir la cadena ansible_managed dentro de una plantilla Jinja2, use la siguiente sintaxis:
Estructuras de control
Uso de bucles
Jinja2 usa la instrucción for para proporcionar la funcionalidad de bucles. En el siguiente ejemplo, la
variable user se reemplaza con todos los valores incluidos en la variable users, un valor por línea.
La variable loop.index se expande al número de índice en el que se encuentra actualmente el bucle. Tiene
un valor de 1 la primera vez que se ejecuta el bucle, y se va incrementando de a 1 en cada iteración.
Con la siguiente sentencia for, todos los hosts en el grupo myhosts del inventario se enumeran en el
archivo.
Para un ejemplo más práctico, puede usar esto para generar un archivo /etc/hosts
de datos de host de forma dinámica.
La siguiente plantilla templates/hosts.j2 de tres líneas crea el archivo de todos los hosts del grupo all. Se
repite en cada host del grupo para obtener tres datos para el archivo /etc/hosts.
Uso de condicionales
Jinja2 usa la instrucción if para proporcionar control condicional. Esto le permite
colocar una línea en un archivo implementado si se cumplen ciertas condiciones.
Filtros de variables
Jinja2 proporciona filtros que cambian el formato de salida de las expresiones de plantillas
Pruebas de variables
Las pruebas incorporadas de Ansible que se usan para probar los valores recibidos incluyen failed,
changed, succeeded y skipped.
capítulo 6 Administración de reproducciones
y guías complejas
Selección de hosts con patrones de hosts
Hosts administrados
Cuando se ejecuta la guía, la primera tarea Recopilación de datos debe ejecutarse en todos
los hosts administrados que coincidan con el patrón de host. Un error durante esta tarea
puede hacer que el host administrado se elimine de la reproducción.
Es posible apuntar a un alias en una dirección IP específica en su inventario si establece la
variable de host ansible_host.
Los patrones de host comodín coinciden con todos los nombres de inventario, hosts y
grupos de hosts. No distinguen entre nombres que son nombres de DNS, direcciones IP o
grupos, lo que puede generar ciertas coincidencias inesperadas.
Listas
Se puede hacer referencia a varias entradas en un inventario con listas lógicas. Una lista de
patrones de hosts separados por comas coincide con todos los hosts que coinciden con
cualquiera de esos patrones de hosts.
Si usted proporciona una lista de grupos separados por comas, se apuntará a todos estos
hosts en cualquiera de esos grupos
Si un elemento en una lista comienza con un carácter &, los hosts deben coincidir con ese
elemento para coincidir con el patrón de host. Funciona de manera similar que un AND
lógico.
Puede excluir hosts que coincidan con un patrón de una lista si usa el signo de exclamación
o carácter "bang" (!) delante del patrón de host. Esto funciona como un NOT lógico.
capítulo 7 Simplificación
Los roles Ansible tienen los siguientes beneficios:
de guías con roles
• Contenido del grupo de roles, lo que permite intercambiar el código fácilmente
con otros
• Los roles se pueden escribir para definir los elementos fundamentales de un tipo
de sistema: servidor web, servidor de base de datos, repositorio git u otro propósito
• Los roles hacen que los proyectos más grandes sean más manejables
• Los roles se pueden desarrollar en paralelo por diferentes administradores
la política tenga una regla para establecer el tipo de SELinux predeterminado para todos los
archivos de /srv/www en httpd_sys_content_t.
Creación de roles
Crear roles en Ansible no requiere herramientas de desarrollo especiales. Crear y usar un rol
es un proceso de tres pasos:
1. Cree la estructura del directorio de roles.
2. Defina el contenido de los roles.
3. Use el rol en una guía.
De manera predeterminada, Ansible busca roles en un subdirectorio llamado roles en el
directorio que contiene su guía de reproducción Ansible.
Si Ansible no puede encontrar el rol allí, buscará en los directorios especificados por lac
configuración de Ansible roles_path, en orden.
Cada rol tiene su propio directorio con una estructura de directorios estandarizada.
Creación de un esqueleto de roles
Puede crear todos los subdirectorios y archivos necesarios para un rol nuevo mediante
comandos estándares de Linux.
La herramienta de línea de comandos ansible-galaxy (que se analiza en más detalle más
adelante en este curso) se usa para administrar los roles de Ansible, incluida la creación de
nuevos roles. Puede ejecutar ansible-galaxy init para crear la estructura de directorios para
un nuevo rol. Especifique el nombre del rol como argumento del comando, lo que crea un
subdirectorio para el nuevo rol en el directorio de trabajo actual.
El archivo defaults/ main.yml de la estructura de directorio del rol es donde se configura este
valor.
De manera predeterminada, los roles se agregan solamente como una dependencia a una
guía solo una vez. Si otro rol también lo enumera como una dependencia, no se lo ejecutará
nuevamente. Este comportamiento se puede reemplazar estableciendo la variable
allow_duplicates como yes en el archivo meta/main.yml.
Uso del rol en una guía
Para acceder a un rol, menciónelo en la sección roles: de una reproducción. La siguiente
guía se refiere al rol motd.
En el siguiente ejemplo de salida, se muestra esto con el prefijo motd : en el nombre de la tarea:
La precedencia de variables puede causar confusión al trabajar con variables de rol en una
reproducción.
• Casi cualquier otra variable anulará las variables predeterminadas de un rol:
variables de inventario, vars de reproducción, parámetros de rol en línea, etc.
• Menos variables pueden anular las variables definidas en el directorio vars
de un rol. Los datos, las variables cargadas con include_vars, las variables
registradas y los parámetros de rol son algunas de las variables que pueden
hacer eso. Las variables de inventario y vars de reproducción no pueden
hacerlo. Esto es importante porque ayuda a evitar que la reproducción
modifique accidentalmente el funcionamiento interno del rol.
• No obstante, las variables declaradas en línea como parámetros de rol, como
en el último de los ejemplos anteriores, tienen precedencia muy alta. Pueden
anular las variables definidas en el directorio vars de un rol. Si un parámetro de
rol tiene el mismo nombre que una variable establecida en vars de la
reproducción, un vars de rol o una variable de inventario o guía de
reproducción, el parámetro de rol anulará a la otra variable.
El atributo src especifica la fuente del rol, en este caso, el rol geerlingguy.redis de Ansible
Galaxy.
Debe especificar la versión del rol en su archivo requirements.yml, en especial para las guías
de reproducción en producción.
Si no especifica una versión, obtendrá la última versión del rol. Si el autor en sentido
ascendente realiza cambios en el rol que son incompatibles con su guía, puede causar una
falla de automatización u otros problemas.
Para instalar los roles con un archivo de roles, use la opción -r REQUIREMENTS-FILE:
Puede alojar sus propios roles internos o propietarios en un repositorio privado de Git o en
un servidor web.
Para instalar los roles asociados con un proyecto de guía de reproducción,
Gestión de roles descargados
Los roles descargados e instalados se pueden utilizar en guías como cualquier otro rol.
Pueden mencionarse en la sección roles utilizando el nombre de rol de descarga. Si un rol no
está en el directorio roles del proyecto, el roles_path se verificará para ver si el rol está
instalado enuno de esos directorios; se usará la primera coincidencia.
Al rastrear la última versión de un rol en un proyecto, vuelva a instalar el rol periódicamente
para actualizarlo. Esto asegura que la copia local se mantenga actualizada con correcciones
de errores, parches y otras características.
Uso de colecciones
El siguiente comando ad hoc llama al módulo mail desde la colección community.general
También puede usar la opción --step para recorrer una guía de reproducción una tarea a la
vez.
Depuración
La salida dada por la ejecución de una guía de reproducción con el comando ansible-
playbook es un buen punto de partida para la solución de problemas relacionados con hosts
administrados por Ansible.
El comando ansible-playbook -v aporta información de depuración adicional, con hasta
cuatro niveles totales.
• El módulo stat recopila datos para un archivo muy similar al comando stat. Puede usarlo
para registrar una variable y luego hacer una prueba para determinar si el archivo existe, o
para obtener otra información sobre el archivo.
• El módulo assert es una alternativa al módulo fail. El módulo assert es compatible con la
opción that que toma una lista de condicionales. Si alguno de esos condicionales es falso, la
tarea falla. Puedes usar las opciones success_msg y fail_msg para personalizar el mensaje
que imprime si informa éxito o fracaso.