Ansible
Si quieres mantener tus servidores en orden, ¡Ansible es la herramienta ideal! En esta guía práctica, aprenderás a utilizar Ansible para automatizar la configuración de servidores, la implementación de software y mucho más. Empieza por instalar Ansible y configurar tu proceso inicial de gestión de inventario. A continuación, sigue las instrucciones paso a paso para la orquestación del sistema, desde los conceptos básicos de los playbooks y las tareas hasta el uso de Ansible con Docker. Con consejos de expertos y mejores prácticas para realizar pruebas, depurar y mucho más, ¡esta es tu guía completa para automatizar con Ansible!
- Instalar y configurar Ansible en los nodos de control y los nodos de destino.
- Cree guías de juego utilizando YAML y aprenda a utilizar etiquetas, variables, bucles y mucho más.
- Trabajar con módulos, colecciones y roles
Aprenderás sobre:
- Conceptos básicos de Ansible:
Instale Ansible en sus nodos de control y de destino. Configure su proceso inicial de gestión de inventario y utilice comandos ad hoc y YAML para empezar a configurar y automatizar sus tareas.
- Guías, módulos y funciones:
Domine las implementaciones complejas almacenando tareas en guías y módulos estructurados y, a continuación, organizando las tareas en funciones automatizadas reutilizables. Practique con guías y archivos de configuración descargables.
- Temas avanzados:
Obtenga asesoramiento de expertos sobre temas más avanzados: comprensión de la gestión de configuraciones declarativas e imperativas, configuración de interfaces web, uso de Ansible en la nube y mucho más. Descubra recetas, instrucciones y mejores prácticas para completar sus habilidades con Ansible.
Aspectos Destacados:
- Configuración básica
- Gestión de inventario
- Comandos y patrones ad hoc
- YAML
- Libros de jugadas, tareas y jugadas
- Modularización
- Funciones
- Incluye
- Biblioteca de módulos
- Interfaces web
- Docker
- Colecciones y módulos personalizados
Ver Tabla de Contenidos Completa
- Prefacio
- Acerca de este libro
- Formato
- Versiones de Ansible
- Plataformas y distribuciones de Linux
- 1 Introducción e instalación
- 1.1 ¿Qué es Ansible?
- 1.1.1 Características básicas
- 1.1.2 Componentes principales
- 1.1.3 ¿Declarativo o imperativo?
- 1.2 ¿Qué no es Ansible?
- 1.3 Historia y versiones
- 1.3.1 Versiones
- 1.3.2 Versiones de Python compatibles
- 1.4 Configuración/Entorno de laboratorio
- 1.5 Instalación de Ansible en el host de control
- 1.6 Instalación mediante PIP (más virtualenv)
- 1.7 Autenticación y autorización en hosts de destino
- 1.8 Configuración de la autenticación con clave pública SSH
- 1.9 Una prueba ad hoc sin ninguna configuración
- 1.10 Otra nota sobre la migración desde versiones anteriores
- 2 Configuración básica y gestión inicial del inventario
- 2.1 Configuración de la estructura de directorios
- 2.2 Configuración básica (ansible.cfg)
- 2.3 Creación y gestión de un inventario estático
- 2.4 ¿Configuración frente a parámetros frente a…?
- 2.5 Alias de inventario y espacios de nombres
- 2.6 Más allá del ping
- 2.7 Un ejemplo algo más complejo
- 2.8 Inventarios alternativos o múltiples
- 3 Comandos y patrones ad hoc
- 3.1 Comandos ad hoc
- 3.1.1 El módulo «comando»
- 3.1.2 El módulo «shell»
- 3.2 Casos de uso más allá de «comando» y «shell»
- 3.3 Idempotencia
- 3.4 Funcionamiento interno
- 3.4.1 Ejecución paralela
- 3.4.2 Conexiones persistentes
- 3.4.3 ¿Qué sucede cuando se llama a un módulo?
- 3.5 La consola de Ansible
- 3.6 Patrones para abordar hosts
- 4 YAML: el lenguaje de configuración y serialización
- 4.1 Sintaxis y estructura
- 4.2 Edición de archivos YAML
- 4.2.1 vim
- 4.2.2 nano
- 4.2.3 Emacs
- 4.2.4 Notepad++
- 4.3 Comprobaciones sintácticas
- 4.4 Listas y mapas
- 4.5 Estructuras anidadas
- 4.6 Pasajes de texto y expresiones en bloque
- 4.6.1 Variaciones
- 4.6.2 Textos largos sin saltos de línea
- 4.7 La nada en YAML
- 4.8 Anclajes y referencias
- 5 Manuales y tareas: conceptos básicos
- 5.1 Hola, Ansible: el primer playbook
- 5.1.1 Rutas relativas en llamadas al playbook
- 5.1.2 Dirigirse a los hosts de destino reales
- 5.2 Formulación de tareas
- 5.3 Jugadas finales
- 5.4 El colon problemático
- 5.5 Manejo de errores y reintentos de archivos
- 5.6 Etiquetas
- 5.7 El comando «ansible-playbook»
- 5.8 Ejemplo de instalación de Apache
- 5.8.1 Paso a paso
- 5.8.2 El manual completo
- 5.8.3 «–start-at-task», «–check» y «–diff»
- 5.9 Controlador: ejecución de tareas solo en caso de cambios
- 5.9.1 Ejecución paso a paso
- 5.9.2 Controladores
- 5.9.3 El manual completo hasta este momento
- 6 Manuales y tareas: métodos avanzados
- 6.1 Variables
- 6.1.1 Jugar Vars
- 6.1.2 Variables adicionales
- 6.1.3 Precedencia
- 6.1.4 «set_fact»
- 6.1.5 «group_vars»
- 6.1.6 «host_vars»
- 6.1.7 «vars_files»: variables en cualquier archivo externo
- 6.1.8 Solicitud
- 6.1.9 Acceso a estructuras complejas
- 6.1.10 Pruebas «assert»
- 6.2 Variables registradas
- 6.3 Hechos y variables implícitas
- 6.3.1 Hechos
- 6.3.2 Almacenamiento en caché de datos
- 6.3.3 Variables implícitas
- 6.3.4 Ejemplo
- 6.3.5 Recopiladores de información externos: «facter» y «ohai»
- 6.3.6 ¿Aún no tienes suficientes datos? ¡Prueba con «/etc/ansible/facts.d»!
- 6.4 Ejecución condicional con «when»
- 6.5 Diferencias entre sistemas de manejo: ¿cuál es la situación actual?
- 6.5.1 El método torpe
- 6.5.2 El método sólido
- 6.5.3 El método complicado
- 6.5.4 El método modular
- 6.5.5 El manual completo hasta este momento
- 6.6 Jinja y plantillas
- 6.6.1 Definición: Plantillas y motores de plantillas
- 6.6.2 Una página de inicio individual para nuestros servidores Apache
- 6.6.3 Prueba rápida de plantillas Jinja
- 6.6.4 Sintaxis de Jinja: expresiones de salida, sentencias y comentarios
- 6.6.5 Filtro
- 6.6.6 Control de espacios en blanco
- 6.6.7 Macros
- 6.7 Pruebas variables
- 6.8 Complementos de búsqueda
- 6.9 Bucles
- 6.9.1 Los bucles «with_*» son búsquedas
- 6.9.2 Iteración sobre una lista con «with_items» o «with_list»
- 6.9.3 Iteración sobre un mapa con «with_dict»
- 6.9.4 Iteración sobre una secuencia generada con «with_sequence»
- 6.9.5 Recorrido en bucle sobre la combinación de dos listas con «with_nested»
- 6.9.6 Recorrido de dos listas paralelas con «with_together»
- 6.9.7 Bucles anidados con «with_subelements»
- 6.9.8 Repetición de tareas con «hasta que»
- 6.9.9 Más control con «loop_control»
- 6.9.10 «registro» más bucle
- 6.10 Manejo de errores con «failed_when» e «ignore_errors»
- 6.11 Bloques
- 6.12 Tiempos de espera y ejecución asincrónica
- 6.13 Tareas locales
- 6.13.1 «local_action»
- 6.13.2 Uso de otros hosts
- 6.14 Variables de entorno
- 6.14.1 Configuración de variables de entorno con el parámetro «environment»
- 6.14.2 Lectura de variables de entorno
- 6.14.3 Variables de entorno en los atributos «path» o «dest»
- 7 Uso de módulos y colecciones
- 7.1 Cobros
- 7.1.1 Un entorno mínimo con «ansible-core»
- 7.1.2 Gestión de cobranzas
- 7.1.3 El nombre completo de la colección
- 7.1.4 Conclusión provisional
- 7.2 Módulo
- 7.3 Módulos para la ejecución de comandos
- 7.3.1 «comando»: Ejecución de comandos
- 7.3.2 «shell»: ejecución de comandos a través de un shell
- 7.3.3 «raw»: Ejecución de comandos sin el subsistema Python
- 7.3.4 «script»: Transferencia y ejecución de scripts locales
- 7.4 Módulos para la gestión de paquetes
- 7.4.1 «apt»: gestión de paquetes en sistemas Debian/Ubuntu
- 7.4.2 «dnf» y «yum»: gestión de paquetes en sistemas Rocky, CentOS, Red Hat y Fedora
- 7.4.3 «community.general.zypper»: Administración de paquetes en sistemas SUSE
- 7.4.4 «paquete»: gestión genérica de paquetes
- 7.4.5 «package_facts»: representación de la información del paquete como hechos
- 7.4.6 Otros módulos (sin describir con más detalle)
- 7.5 Módulos para administrar archivos y contenidos de archivos
- 7.5.1 «Copiar»: copiar y cargar archivos
- 7.5.2 «plantilla»: Procesamiento de archivos con Jinja y carga
- 7.5.3 «archivo»: Administración de archivos y atributos de archivo
- 7.5.4 «stat»: Obtención de información sobre archivos
- 7.5.5 «lineinfile»: gestión de líneas en archivos de texto
- 7.5.6 «blockinfile»: gestión de fragmentos de texto en archivos
- 7.5.7 «Reemplazar»: buscar y reemplazar en archivos de texto
- 7.5.8 «Descomprimir»: cargar y extraer archivos comprimidos
- 7.5.9 Otros módulos (sin describir con más detalle)
- 7.6 Módulos para otras tareas administrativas típicas
- 7.6.1 «Servicio»: inicio, detención y reinicio de servicios, etc.
- 7.6.2 «service_facts»: presentación de la información sobre el servicio como hechos
- 7.6.3 «cron»: Administración de tareas cron
- 7.6.4 «hostname»: Cambiar el nombre de host
- 7.6.5 «usuario» y «grupo»: Administración de usuarios y grupos
- 7.6.6 «ansible.posix.firewalld»: Administración de cortafuegos basados en firewalld
- 7.6.7 «reiniciar»: Reiniciar máquinas
- 7.6.8 Otros módulos (sin describir con más detalle)
- 7.7 Módulos para interactuar con servicios de red
- 7.7.1 «get_url»: Descarga de recursos
- 7.7.2 «uri»: Comunicación con servicios web
- 7.7.3 «git»: Interactuar con servidores Git
- 7.8 Módulos especiales (gestión del flujo de control, etc.)
- 7.8.1 «meta»: activación de diversas acciones de Ansible
- 7.8.2 «debug»: generación de salida durante la ejecución del playbook
- 7.8.3 «fallar»: activar un fallo
- 7.8.4 «pausa»: pausar y, opcionalmente, leer la entrada
- 7.8.5 «wait_for»: Esperando ciertos eventos
- 7.8.6 «wait_for_connection»: espera hasta que se pueda acceder al host de destino
- 7.8.7 «assert»: garantizar que se cumplan determinadas condiciones
- 7.8.8 «set_fact»: configuración de variables durante el tiempo de ejecución
- 8 Modularización con roles e inclusiones
- 8.1 Creación y uso de roles
- 8.1.1 El concepto de roles en Ansible
- 8.1.2 Un ejemplo sencillo de función
- 8.1.3 Uso de roles en un playbook
- 8.1.4 Juega con roles y tareas, «pre_tasks» y «post_tasks»
- 8.1.5 Dependencias entre funciones
- 8.1.6 Selección de otros archivos de inicio
- 8.1.7 Creación de nuevas funciones con «ansible-galaxy»
- 8.2 El repositorio en línea Ansible Galaxy
- 8.3 Uso de importaciones e inclusiones
- 8.3.1 «import_tasks» e «include_tasks»
- 8.3.2 «include_tasks» y etiquetas
- 8.3.3 Carga dinámica de variables con «include_vars»
- 8.3.4 «import_playbook»
- 8.4 Apache una vez más
- 8.5 Documentación (y convenciones)
- 8.5.1 «defaults/main.yml» como convención
- 8.5.2 «README.md»
- 8.6 Reutilización de roles
- 8.6.1 Ampliación de la estructura del directorio
- 8.6.2 La situación del desarrollador
- 9 Interfaces web: AWX y más
- 9.1 Instalación de paquetes Python en sistemas Debian y Ubuntu actuales
- 9.2 Base de datos de gestión de configuración de Ansible («ansible-cmdb»)
- 9.2.1 Uso
- 9.2.2 Implementación de la página
- 9.3 Preparativos para operar aplicaciones más exigentes
- 9.4 El servidor Git de Gitea
- 9.4.1 Puesta en marcha e inicio de sesión por primera vez
- 9.4.2 Revisión de nuestro proyecto inicial
- 9.4.3 Añadir «README.md» y comandos útiles de Git
- 9.5 AWX
- 9.5.1 Puesta en marcha y primer inicio de sesión
- 9.5.2 Ejemplo de uso
- 9.5.3 Entornos de ejecución
- 9.5.4 Conclusión
- 9.6 ARA
- 9.6.1 Configuración de la prueba
- 9.6.2 Otras posibilidades
- 9.7 Otras aplicaciones que no se consideran en detalle aquí
- 9.7.1 Semáforo
- 9.7.2 Polemarco
- 9.7.3 Jenkins
- 9.7.4 Rundeck
- 9.8 Cancelar o eliminar aplicaciones que ya no se necesitan
- 10 Herramientas y técnicas adicionales
- 10.1 Ansible Vault
- 10.1.1 Antes de toda tecnología
- 10.1.2 Primeros pasos
- 10.1.3 Significado del ID de la bóveda
- 10.1.4 Otros comandos de Vault
- 10.1.5 Un truco para volver a encontrar variables
- 10.1.6 Cifrado de variables individuales
- 10.1.7 Más comodidad o automatización
- 10.1.8 Comodidad y seguridad relativa con un script de cliente de contraseña
- 10.1.9 Cómodo y (preferiblemente) seguro con GNU Privacy Guard y Pass
- 10.2 Depuración y resolución de problemas
- 10.2.1 Modo de depuración y nivel de detalle
- 10.2.2 Mejorar la legibilidad de los resultados
- 10.2.3 Recopilar datos lleva demasiado tiempo
- 10.2.4 El depurador del libro de jugadas
- 10.2.5 Análisis estático de código con «ansible-lint»
- 10.2.6 Modo de verificación y modo de comparación
- 10.2.7 Por último, pero no menos importante: el módulo «debug»
- 10.3 Aceleración de los playbooks con canalización
- 10.4 La vaca que habla
- 10.5 Ansible en modo Pull
- 10.5.1 «ansible-pull»: técnica y requisitos
- 10.5.2 Primeros pasos
- 10.5.3 La solución completa
- 10.5.4 ¿Qué podría faltar aún?
- 11 Ansible y Docker
- 11.1 Instalación de Docker
- 11.2 Módulos Docker
- 11.2.1 Preparativos y consideraciones preliminares
- 11.2.2 Un primer ejemplo sencillo
- 11.2.3 Resumen general
- 11.3 Un ejemplo de aplicación
- 11.4 Ansible y Docker Compose
- 11.4.1 Problemas con la versión
- 11.4.2 Especificación en línea con «definición»
- 11.5 El complemento de conexión «docker»
- 11.6 Creación de imágenes
- 11.6.1 Creación de imágenes con «docker build»
- 11.6.2 «ansible-bender»
- 11.6.3 Creación de imágenes con «ansible-bender»
- 11.6.4 Conclusión
- 12 Gestión de inventario: métodos avanzados
- 12.1 El comando «ansible-inventory»
- 12.2 Grupos anidados
- 12.3 Inventarios estáticos en formato YAML
- 12.4 Creación de inventarios sobre la marcha con «add_host»
- 12.5 Grupos dinámicos con «group_by»
- 12.6 Inventarios dinámicos y externos
- 12.6.1 Scripts de inventario
- 12.6.2 Uso de complementos de inventario
- 13 Ansible y la nube
- 13.1 Problemas con la versión y virtualenv
- 13.2 Dónde almacenar claves, tokens, secretos, etc.
- 13.3 Nube de Hetzner
- 13.3.1 Preparativos en el host de control
- 13.3.2 Preparativos en la nube
- 13.3.3 Uso de módulos en la nube
- 13.3.4 Aprovisionamiento de servidores en la nube
- 13.3.5 Inventario de servidores en la nube
- 13.3.6 Otras posibilidades del complemento de inventario
- 13.4 Amazon Web Services Elastic Compute Cloud
- 13.4.1 Preparativos en el host de control
- 13.4.2 Preparativos en la nube
- 13.4.3 Uso de módulos en la nube
- 13.4.4 Aprovisionamiento de servidores en la nube
- 13.4.5 Inventario de servidores en la nube
- 13.4.6 Otras posibilidades del complemento de inventario
- 13.5 Entorno virtual Proxmox
- 13.5.1 Preparativos en el host de control
- 13.5.2 Preparativos en el entorno virtual Proxmox
- 13.5.3 Una prueba inicial
- 13.5.4 Aprovisionamiento de máquinas virtuales
- 13.5.5 Perspectivas
- 14 Ansible como herramienta de orquestación
- 14.1 Muchos hosts de destino para realizar pruebas
- 14.2 Alteración de la secuencia de ejecución
- 14.2.1 «acelerador» y «orden»
- 14.2.2 «serie»
- 14.2.3 Hosts defectuosos en modo «serie»
- 14.2.4 Complementos de estrategia
- 14.3 Delegación
- 15 Ansible y Windows
- 15.1 Un host de control basado en Windows
- 15.1.1 El subsistema de Windows para Linux
- 15.1.2 Cygwin
- 15.2 Objetivos de Windows y administración remota de Windows
- 15.3 Preparativos en el host de control
- 15.4 Requisitos previos en Windows y configuración de la administración remota de Windows
- 15.5 Solución de problemas de administración remota de Windows
- 15.6 Configuración con Active Directory y Kerberos
- 15.7 Módulos de Windows
- 15.7.1 «chocolatey.chocolatey.win_chocolatey»: gestión de paquetes con Chocolatey
- 15.7.2 «win_domain_user»: Administración de cuentas de dominio
- 15.7.3 «win_environment»: gestión de variables de entorno
- 15.7.4 «win_regedit»: Administración de entradas del Registro
- 15.7.5 «win_updates»: Aplicación de actualizaciones
- 16 Complementos de devolución de llamada
- 16.1 Complementos de devolución de llamada Stdout
- 16.2 Complementos de agregación y devolución de llamada de notificación
- 17 Creación de colecciones y módulos propios
- 17.1 Espacios de nombres, nombres y configuración de un proyecto de colección
- 17.1.1 Proyecto Ansible para probar manualmente la recopilación
- 17.1.2 ¿Dónde se está trabajando actualmente?
- 17.2 Libros de jugadas en colecciones
- 17.3 Funciones en las colecciones
- 17.4 Módulos en colecciones
- 17.4.1 Primeros pasos
- 17.4.2 Parámetros del módulo
- 17.4.3 Módulos con Python: ejemplo de enunciado del problema
- 17.4.4 Un ejemplo de solución
- 17.4.5 Explicaciones y otras posibilidades
- 17.4.6 Documentación integrada
- 17.4.7 Perspectivas
- 17.5 Complementos en colecciones
- 17.5.1 Un ejemplo de complemento de devolución de llamada
- 17.5.2 Perspectivas
- 17.6 Implementación e instalación de colecciones
- 18 Desarrollo y pruebas con Molecule
- 18.1 Preparativos y configuración
- 18.2 Primeros pasos
- 18.3 Desarrollar
- 18.4 Pruebas con Ansible Verifier
- 18.5 Pruebas con Testinfra Verifier
- 18.6 El ciclo de prueba completo
- 18.7 Perspectivas y conclusión
- 19 recetas, instrucciones y mejores prácticas
- 19.1 Nuevos proyectos
- 19.1.1 Un «ansible.cfg» recomendado
- 19.1.2 Plantilla para un nuevo proyecto
- 19.2 Administración
- 19.2.1 Creación de instaladores sencillos
- 19.2.2 Determinación de la dirección IP de un host de destino
- 19.2.3 Administración de «firewalld»
- 19.2.4 Aplicación de actualizaciones de software de Linux
- 19.2.5 Distribución inicial de claves SSH
- 19.2.6 Transmisión de contraseñas en la línea de comandos
- 19.2.7 Ansible a través de una puerta de enlace o un host de salto
- 19.3 Magia Jinja
- 19.3.1 Ampliación de mapas o listas durante el tiempo de ejecución
- 19.3.2 Modificar y combinar los elementos de una lista
- 19.3.3 Búsqueda en una lista de mapas
- 19.3.4 Filtrar un atributo de una lista de mapas
- 19.3.5 Generación de un informe a partir de datos del sistema de destino
- 19.3.6 Generación de contraseñas y hash de contraseñas
- 19.4 Tareas y flujo de control
- 19.4.1 Ejecución de una tarea que depende de una tarea anterior
- 19.4.2 Ejecución de una tarea si el host pertenece a un grupo específico
- 19.4.3 Evitar parámetros de módulo redundantes con «module_defaults»
- 19.4.4 Configuración dinámica de hosts de reproducción
- 19.4.5 Lectura de archivos de configuración
- 19.5 Varios
- 19.5.1 Simulación de funciones
- 19.5.2 Administración de recursos específicos del host
- 20 ¿Qué podría mejorarse y qué sigue faltando?
- 20.1 Seguimiento de tareas de larga duración
- 20.2 Finalización del procesamiento de una función
- 20.3 Bucles sobre bloques
- 20.4 Bloqueo con llamadas simultáneas al playbook
- 20.5 Conclusión
- Anexos
- Variables de entorno específicas para cada proyecto con «direnv»
- A.1 Instalación e integración con el shell
- A.2 Uso
- A.3 Alias y funciones
- A.4 Ejecución de comandos al entrar
- B El administrador de contraseñas «pass»
- B.1 Instalación y preparativos
- B.2 Uso
- B.3 Configuración de los tiempos de caché del agente GNU Privacy Guard
- C Secure Shell
- C.1 Requisitos del lado del servidor para utilizar Secure Shell
- C.2 Programas cliente Secure Shell
- C.3 Autenticación con clave pública
- C.4 Agentes SSH (cliente Linux)
- C.5 PuTTY, PuTTYgen y Pageant
- C.6 Copia segura de Windows
- C.7 Configuración y uso avanzados
- C.8 «pssh» o «parallel-ssh»
- Expresiones regulares D
- D.1 Motivación
- D.2 Dialectos
- D.3 Conceptos básicos
- D.4 Expresiones regulares: capacidades ampliadas (expresiones regulares compatibles con Perl)
- D.5 Capacidades ampliadas (Interfaz de sistema operativo portátil, expresiones regulares ampliadas)
- Consejos y trucos para «vim» y «nano»
- El autor
- Índice
Ansible
If you want to keep your servers in order, Ansible is the tool of choice! In this practical guide, you’ll learn how to use Ansible to automate server configuration, software deployment, and more. Start by installing Ansible and setting up your initial inventory management process. Then, follow step-by-step instructions for system orchestration, from the basics of playbooks and tasks to using Ansible with Docker. With expert tips and best practices for testing, debugging, and more, this is your all-in-one guide to automating with Ansible!
- Install and set up Ansible on control nodes and target nodes
- Create playbooks using YAML and learn to use tags, variables, loops, and more
- Work with modules, collections, and roles
You'll learn about:
- Ansible Basics:
Install Ansible on your control and target nodes. Set up your initial inventory management process and use ad-hoc commands and YAML to start configuring and automating your tasks.
- Playbooks, Modules, and Roles:
Master complex deployments by storing tasks in structured playbooks and modules and then organizing tasks into reusable automated roles. Get hands-on practice with downloadable playbooks and configuration files.
- Advanced Topics:
Get advice from the experts on more advanced topics: understanding declarative and imperative configuration management, setting up web interfaces, using Ansible on the cloud, and more. Discover recipes, how-tos, and best practices to round out your Ansible skills.
Key Highlights:
- Basic setup
- Inventory management
- Ad-hoc commands and patterns
- YAML
- Playbooks, tasks, and plays
- Modularization
- Roles
- Includes
- Module library
- Web interfaces
- Docker
- Custom collections and modules
View Full Table of Contents
- Preface
- About This Book
- Formatting
- Ansible Versions
- Platforms and Linux Distributions
- 1 Introduction and Installation
- 1.1 What Is Ansible?
- 1.1.1 Basic Features
- 1.1.2 Core Components
- 1.1.3 Declarative or Imperative?
- 1.2 What Is Ansible Not?
- 1.3 History and Versions
- 1.3.1 Versions
- 1.3.2 Supported Python Versions
- 1.4 Setup/Lab Environment
- 1.5 Ansible Installation on the Control Host
- 1.6 Installation via PIP (plus virtualenv)
- 1.7 Authentication and Authorization on Target Hosts
- 1.8 Setting Up SSH Public Key Authentication
- 1.9 An Ad Hoc Test without Any Configuration
- 1.10 Another Note on Migrating from Older Versions
- 2 Basic Setup and Initial Inventory Management
- 2.1 Setting Up the Directory Structure
- 2.2 Basic Configuration (ansible.cfg)
- 2.3 Creating and Managing a Static Inventory
- 2.4 Configuration Settings versus Parameters versus …?
- 2.5 Inventory Aliases and Namespaces
- 2.6 Beyond Ping
- 2.7 A Somewhat More Complex Example
- 2.8 Alternative or Multiple Inventories
- 3 Ad Hoc Commands and Patterns
- 3.1 Ad Hoc Commands
- 3.1.1 The “command” Module
- 3.1.2 The “shell” Module
- 3.2 Use Cases Beyond “command” and “shell”
- 3.3 Idempotency
- 3.4 Internal Workings
- 3.4.1 Parallel Execution
- 3.4.2 Persistent Connections
- 3.4.3 What Happens When a Module Is Called?
- 3.5 The Ansible Console
- 3.6 Patterns for Addressing Hosts
- 4 YAML: The Configuration and Serialization Language
- 4.1 Syntax and Structure
- 4.2 Editing YAML Files
- 4.2.1 vim
- 4.2.2 nano
- 4.2.3 Emacs
- 4.2.4 Notepad++
- 4.3 Syntactic Checks
- 4.4 Lists and Maps
- 4.5 Nested Structures
- 4.6 Text Passages and Block Expressions
- 4.6.1 Variations
- 4.6.2 Long Texts without Line Breaks
- 4.7 Nothingness in YAML
- 4.8 Anchors and References
- 5 Playbooks and Tasks: The Basics
- 5.1 Hello Ansible: The Very First Playbook
- 5.1.1 Relative Paths in Playbook Calls
- 5.1.2 Addressing the Actual Target Hosts
- 5.2 Formulation of Tasks
- 5.3 Ending Plays
- 5.4 The Problematic Colon
- 5.5 Error Handling and Retrying Files
- 5.6 Tags
- 5.7 The “ansible-playbook” Command
- 5.8 An Example of an Apache Installation
- 5.8.1 Step by Step
- 5.8.2 The Complete Playbook
- 5.8.3 “–start-at-task, “–check,” and “–diff”
- 5.9 Handler: Executing Tasks Only on Changes
- 5.9.1 Step by Step Execution
- 5.9.2 Handlers
- 5.9.3 The Complete Playbook up to This Point
- 6 Playbooks and Tasks: Advanced Methods
- 6.1 Variables
- 6.1.1 Play Vars
- 6.1.2 Extra Vars
- 6.1.3 Precedence
- 6.1.4 “set_fact”
- 6.1.5 “group_vars”
- 6.1.6 “host_vars”
- 6.1.7 “vars_files”: Variables in Any External Files
- 6.1.8 Prompting
- 6.1.9 Accessing Complex Structures
- 6.1.10 “assert” Tests
- 6.2 Registered Variables
- 6.3 Facts and Implicit Variables
- 6.3.1 Facts
- 6.3.2 Caching of Facts
- 6.3.3 Implicit Variables
- 6.3.4 Example
- 6.3.5 External Information Gatherers: “facter” and “ohai”
- 6.3.6 Not Enough Facts Yet? Try “/etc/ansible/facts.d”!
- 6.4 Conditional Execution with “when”
- 6.5 Handling System Differences: What’s the Deal Now?
- 6.5.1 The Clumsy Method
- 6.5.2 The Solid Method
- 6.5.3 The Tricky Method
- 6.5.4 The Modular Method
- 6.5.5 The Complete Playbook up to This Point
- 6.6 Jinja and Templates
- 6.6.1 Definition: Templates and Template Engines
- 6.6.2 An Individual Homepage for Our Apache Servers
- 6.6.3 Quick Testing of Jinja Templates
- 6.6.4 Jinja Syntax: Output Expressions, Statements, and Comments
- 6.6.5 Filter
- 6.6.6 Whitespace Control
- 6.6.7 Macros
- 6.7 Variable Tests
- 6.8 Lookup Plug-ins
- 6.9 Loops
- 6.9.1 “with_*” Loops Are Lookups
- 6.9.2 Iteration Over a List with “with_items” or “with_list”
- 6.9.3 Iteration Over a Map with “with_dict”
- 6.9.4 Iteration Over a Generated Sequence with “with_sequence”
- 6.9.5 Looping Over the Combination of Two Lists with “with_nested”
- 6.9.6 Looping Over Two Parallel Lists with “with_together”
- 6.9.7 Nested Loops with “with_subelements”
- 6.9.8 Repeating Tasks with “until”
- 6.9.9 More Control with “loop_control”
- 6.9.10 “register” plus Loop
- 6.10 Error Handling with “failed_when” and “ignore_errors”
- 6.11 Blocks
- 6.12 Timeouts and Asynchronous Execution
- 6.13 Local Tasks
- 6.13.1 “local_action”
- 6.13.2 Using Other Hosts
- 6.14 Environment Variables
- 6.14.1 Setting Environment Variables with the “environment” Parameter
- 6.14.2 Reading Environment Variables
- 6.14.3 Environment Variables in “path” or “dest” Attributes
- 7 Using Modules and Collections
- 7.1 Collections
- 7.1.1 A Minimal Environment with “ansible-core”
- 7.1.2 Managing Collections
- 7.1.3 The Fully Qualified Collection Name
- 7.1.4 Interim Conclusion
- 7.2 Module
- 7.3 Modules for Command Execution
- 7.3.1 “command”: Executing Commands
- 7.3.2 “shell”: Executing Commands via a Shell
- 7.3.3 “raw”: Executing Commands without the Python Subsystem
- 7.3.4 “script”: Transferring and Executing Local Scripts
- 7.4 Modules for Package Management
- 7.4.1 “apt”: Package Management on Debian/Ubuntu Systems
- 7.4.2 “dnf” and “yum”: Package Management on Rocky, CentOS, Red Hat, and Fedora Systems
- 7.4.3 “community.general.zypper”: Package Management on SUSE Systems
- 7.4.4 “package”: Generic Package Management
- 7.4.5 “package_facts”: Representing Package Information as Facts
- 7.4.6 Some Other (Not Further Described) Modules
- 7.5 Modules for Managing Files and File Contents
- 7.5.1 “copy”: Copying and Uploading Files
- 7.5.2 “template”: Processing Files with Jinja and Uploading
- 7.5.3 “file”: Managing Files and File Attributes
- 7.5.4 “stat”: Obtaining Information about Files
- 7.5.5 “lineinfile”: Managing Lines in Text Files
- 7.5.6 “blockinfile”: Managing Text Passages in Files
- 7.5.7 “replace”: Searching and Replacing in Text Files
- 7.5.8 “unarchive”: Uploading and Extracting Archives
- 7.5.9 Some Other (Not Further Described) Modules
- 7.6 Modules for Other Typical Administrative Tasks
- 7.6.1 “service”: Starting, Stopping, and Restarting Services, Etc.
- 7.6.2 “service_facts”: Presenting Service Information as Facts
- 7.6.3 “cron”: Managing Cron Jobs
- 7.6.4 “hostname”: Changing the Hostname
- 7.6.5 “user” and “group”: User and Group Management
- 7.6.6 “ansible.posix.firewalld”: Managing firewalld-Based Firewalls
- 7.6.7 “reboot”: Rebooting Machines
- 7.6.8 Some Other (Not Further Described) Modules
- 7.7 Modules for Interacting with Network Services
- 7.7.1 “get_url”: Downloading Resources
- 7.7.2 “uri”: Communicating with Web Services
- 7.7.3 “git”: Interacting with Git Servers
- 7.8 Special Modules (Control Flow Management, Etc.)
- 7.8.1 “meta”: Triggering Various Ansible Actions
- 7.8.2 “debug”: Generating Output during Playbook Runs
- 7.8.3 “fail”: Triggering a Failure
- 7.8.4 “pause”: Pausing and Optionally Reading Input
- 7.8.5 “wait_for”: Waiting for Certain Events
- 7.8.6 “wait_for_connection”: Waiting Until a Target Host Is Reachable
- 7.8.7 “assert”: Ensuring that Certain Conditions Are Met
- 7.8.8 “set_fact”: Setting Variables during Runtime
- 8 Modularization with Roles and Includes
- 8.1 Creating and Using Roles
- 8.1.1 The Concept of Roles in Ansible
- 8.1.2 A Simple Example of a Role
- 8.1.3 Using Roles in a Playbook
- 8.1.4 Plays with Roles and Tasks, “pre_tasks” and “post_tasks”
- 8.1.5 Dependencies between Roles
- 8.1.6 Choosing Other Startup Files
- 8.1.7 Creating New Roles with “ansible-galaxy”
- 8.2 The Online Ansible Galaxy Repository
- 8.3 Using Imports and Includes
- 8.3.1 “import_tasks” and “include_tasks”
- 8.3.2 “include_tasks” and Tags
- 8.3.3 Dynamic Loading of Variables with “include_vars”
- 8.3.4 “import_playbook”
- 8.4 Apache Once Again
- 8.5 Documentation (and Conventions)
- 8.5.1 “defaults/main.yml” as a Convention
- 8.5.2 “README.md”
- 8.6 Reusing Roles
- 8.6.1 Extending the Directory Structure
- 8.6.2 The Developer’s Situation
- 9 Web Interfaces: AWX and More
- 9.1 Installation of Python Packages on Current Debian and Ubuntu Systems
- 9.2 Ansible Configuration Management Database (“ansible-cmdb”)
- 9.2.1 Usage
- 9.2.2 Deploying the Page
- 9.3 Preparations for Operating More Demanding Applications
- 9.4 The Gitea Git Server
- 9.4.1 Commissioning and Logging In for the First Time
- 9.4.2 Checking In on Our Initial Project
- 9.4.3 Adding »README.md« and Useful Git Commands
- 9.5 AWX
- 9.5.1 Commissioning and First Login
- 9.5.2 Example Usage
- 9.5.3 Execution Environments
- 9.5.4 Conclusion
- 9.6 ARA
- 9.6.1 Test Setup
- 9.6.2 Further Possibilities
- 9.7 Other Applications Not Considered in Detail Here
- 9.7.1 Semaphore
- 9.7.2 Polemarch
- 9.7.3 Jenkins
- 9.7.4 Rundeck
- 9.8 Terminating or Deleting Applications That Are No Longer Needed
- 10 Additional Tools and Techniques
- 10.1 Ansible Vault
- 10.1.1 Before All Technology
- 10.1.2 Getting Started
- 10.1.3 Meaning of the Vault ID
- 10.1.4 Further Vault Commands
- 10.1.5 A Trick for Finding Variables Again
- 10.1.6 Encrypting Individual Variables
- 10.1.7 More Convenience or Automation
- 10.1.8 Convenience and Relative Security with a Password Client Script
- 10.1.9 Convenient and (Preferably) Secure with GNU Privacy Guard plus Pass
- 10.2 Debugging and Troubleshooting
- 10.2.1 Debug Mode and Verbosity Level
- 10.2.2 Improving the Readability of Outputs
- 10.2.3 Gathering Facts Takes Too Long
- 10.2.4 The Playbook Debugger
- 10.2.5 Static Code Analysis with “ansible-lint”
- 10.2.6 Check Mode and Diff Mode
- 10.2.7 Last but Not Least: The “debug” Module
- 10.3 Accelerating Playbooks with Pipelining
- 10.4 The Talking Cow
- 10.5 Ansible in Pull Mode
- 10.5.1 “ansible-pull”: Technique and Requirements
- 10.5.2 Getting Started
- 10.5.3 The Full Solution
- 10.5.4 What Might Still Be Missing?
- 11 Ansible and Docker
- 11.1 Installing Docker
- 11.2 Docker Modules
- 11.2.1 Preparations and Preliminary Considerations
- 11.2.2 A First Simple Example
- 11.2.3 Overview
- 11.3 An Example Application
- 11.4 Ansible and Docker Compose
- 11.4.1 Version Issues
- 11.4.2 Inline Specification with “definition”
- 11.5 The “docker” Connection Plug-in
- 11.6 Creating Images
- 11.6.1 Creating Images with “docker build”
- 11.6.2 “ansible-bender”
- 11.6.3 Creating Images with “ansible-bender”
- 11.6.4 Conclusion
- 12 Inventory Management: Advanced Methods
- 12.1 The “ansible-inventory” Command
- 12.2 Nested Groups
- 12.3 Static Inventories in YAML format
- 12.4 Creating on-the-Fly Inventories with “add_host”
- 12.5 Dynamic Groups with “group_by”
- 12.6 Dynamic and External Inventories
- 12.6.1 Inventory Scripts
- 12.6.2 Using Inventory Plug-ins
- 13 Ansible and the Cloud
- 13.1 Version Issues and virtualenv
- 13.2 Where to Store Keys, Tokens, Secrets, Etc.
- 13.3 Hetzner Cloud
- 13.3.1 Preparations on the Control Host
- 13.3.2 Preparations in the Cloud
- 13.3.3 Using Cloud Modules
- 13.3.4 Provisioning Cloud ervers
- 13.3.5 Inventorying Cloud Servers
- 13.3.6 Further Possibilities of the Inventory Plug-in
- 13.4 Amazon Web Services Elastic Compute Cloud
- 13.4.1 Preparations on the Control Host
- 13.4.2 Preparations in the Cloud
- 13.4.3 Using Cloud Modules
- 13.4.4 Provisioning Cloud Servers
- 13.4.5 Inventorying Cloud Servers
- 13.4.6 Further Possibilities of the Inventory Plug-in
- 13.5 Proxmox Virtual Environment
- 13.5.1 Preparations on the Control Host
- 13.5.2 Preparations in the Proxmox Virtual Environment
- 13.5.3 An Initial Test
- 13.5.4 Provisioning of Virtual Machines
- 13.5.5 Outlook
- 14 Ansible as an Orchestration Tool
- 14.1 Many Target Hosts for Testing
- 14.2 Altering the Sequence of Execution
- 14.2.1 “throttle” and “order”
- 14.2.2 “serial”
- 14.2.3 Faulty Hosts in “serial” Mode
- 14.2.4 Strategy Plug-ins
- 14.3 Delegation
- 15 Ansible and Windows
- 15.1 A Control Host Based on Windows
- 15.1.1 The Windows Subsystem for Linux
- 15.1.2 Cygwin
- 15.2 Windows Targets and Windows Remote Management
- 15.3 Preparations on the Control Host
- 15.4 Prerequisites on the Windows Side and Windows Remote Management Setup
- 15.5 Windows Remote Management Troubleshooting
- 15.6 Setup with an Active Directory and Kerberos
- 15.7 Windows Modules
- 15.7.1 “chocolatey.chocolatey.win_chocolatey”: Package Management with Chocolatey
- 15.7.2 “win_domain_user”: Managing Domain Accounts
- 15.7.3 “win_environment”: Managing Environment Variables
- 15.7.4 “win_regedit”: Managing Registry Entries
- 15.7.5 “win_updates”: Applying Updates
- 16 Callback Plug-ins
- 16.1 Stdout Callback Plug-ins
- 16.2 Aggregate and Notification Callback Plug-ins
- 17 Creating Your Own Collections and Modules
- 17.1 Namespaces, Names, and Setting Up a Collection Project
- 17.1.1 Ansible Project for Manually Testing the Collection
- 17.1.2 Where Is Work Currently Being Done?
- 17.2 Playbooks in Collections
- 17.3 Roles in Collections
- 17.4 Modules in Collections
- 17.4.1 Getting Started
- 17.4.2 Module Parameters
- 17.4.3 Modules with Python: Example Problem Statement
- 17.4.4 An Example Solution
- 17.4.5 Explanations and Further Possibilities
- 17.4.6 Embedded Documentation
- 17.4.7 Outlook
- 17.5 Plug-ins in Collections
- 17.5.1 An Example Callback Plug-in
- 17.5.2 Outlook
- 17.6 Deploying and Installing Collections
- 18 Developing and Testing with Molecule
- 18.1 Preparations and Setup
- 18.2 Getting Started
- 18.3 Develop
- 18.4 Testing with the Ansible Verifier
- 18.5 Testing with the Testinfra Verifier
- 18.6 The Complete Test Cycle
- 18.7 Outlook and Conclusion
- 19 Recipes, How-Tos, and Best Practices
- 19.1 New Projects
- 19.1.1 A Recommended “ansible.cfg”
- 19.1.2 A Template for a New Project
- 19.2 Administration
- 19.2.1 Building Simple Installers
- 19.2.2 Determining the IP Address of a Target Host
- 19.2.3 Managing “firewalld”
- 19.2.4 Applying Linux Software Updates
- 19.2.5 Initial Distribution of SSH keys
- 19.2.6 Passing Passwords on the Command Line
- 19.2.7 Ansible via a Gateway or Jump Host
- 19.3 Jinja Magic
- 19.3.1 Extending Maps or Lists during Runtime
- 19.3.2 Modifying and Combining the Elements of a List
- 19.3.3 Searching in a List of Maps
- 19.3.4 Filtering an Attribute from a List of Maps
- 19.3.5 Generating a Report from Target System Facts
- 19.3.6 Generating Passwords and Password Hashes
- 19.4 Tasks and Control Flow
- 19.4.1 Executing a Task Depending on a Previous Task
- 19.4.2 Executing a Task if the Host Is in a Specific Group
- 19.4.3 Avoiding Redundant Module Parameters with “module_defaults”
- 19.4.4 Dynamically Set Play Hosts
- 19.4.5 Reading Configuration Files
- 19.5 Miscellaneous
- 19.5.1 Simulating Functions
- 19.5.2 Managing Host-Specific Resources
- 20 What Could Be Better, and What Is Still Missing?
- 20.1 Tracking Long-Running Tasks
- 20.2 Finishing the Processing of a Role
- 20.3 Loops over Blocks
- 20.4 Locking with Concurrent Playbook Calls
- 20.5 Conclusion
- Appendices
- A Project-Specific Environment Variables with “direnv”
- A.1 Installation and Shell Integration
- A.2 Usage
- A.3 Aliases and Functions
- A.4 Command Execution Upon Entry
- B The “pass” Password Manager
- B.1 Installation and Preparations
- B.2 Usage
- B.3 Configuring GNU Privacy Guard Agent Cache Times
- C Secure Shell
- C.1 Server-Side Requirements for Using Secure Shell
- C.2 Secure Shell Client Programs
- C.3 Public Key Authentication
- C.4 SSH Agents (Linux Client)
- C.5 PuTTY, PuTTYgen, and Pageant
- C.6 Windows Secure Copy
- C.7 Advanced Configuration and Usage
- C.8 “pssh” or “parallel-ssh”
- D Regular Expressions
- D.1 Motivation
- D.2 Dialects
- D.3 Basics
- D.4 Regular Expressions: Extended Capabilities (Perl Compatible Regular Expressions)
- D.5 Extended Capabilities (Portable Operating System Interface Extended Regular Expressions)
- E “vim” and “nano” Tips and Tricks
- The Author
- Index