Rh294 8.0 Student Guide
Rh294 8.0 Student Guide
The contents of this course and all its modules and related materials, including handouts to audience members, are
Copyright © 2019 Red Hat, Inc.
No part of this publication may be stored in a retrieval system, transmitted or reproduced in any way, including, but
not limited to, photocopy, photograph, magnetic, electronic or other record, without the prior written permission of
Red Hat, Inc.
This instructional program, including all material provided herein, is supplied without any guarantees from Red Hat,
Inc. Red Hat, Inc. assumes no liability for damages or legal action arising from the use or misuse of contents or details
contained herein.
If you believe Red Hat training materials are being used, copied, or otherwise improperly distributed, please send
email to [email protected] or phone toll-free (USA) +1 (866) 626-2994 or +1 (919) 754-3700.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, JBoss, Hibernate, Fedora, the Infinity logo, and RHCE are
trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
XFS® is a registered trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or
other countries.
The OpenStack® word mark and the Square O Design, together or apart, are trademarks or registered trademarks
of OpenStack Foundation in the United States and other countries, and are used with the OpenStack Foundation's
permission. Red Hat, Inc. is not affiliated with, endorsed by, or sponsored by the OpenStack Foundation or the
OpenStack community.
Algunas partes de este curso se adaptaron del proyecto Ansible Lightbulb. El material de ese
proyecto está disponible en https://github.com/ansible/lightbulb con la Licencia de MIT.
Convenciones del documento ix
Introducción xi
Red Hat Enterprise Linux Automation with Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
Orientación sobre el entorno del aula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Internacionalización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
1. Presentación de Ansible 1
Automatización de la administración de Linux con Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Cuestionario: Automatización de la administración de Linux con Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Instalación de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Ejercicio Guiado: Instalación de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2. Implementación de Ansible 19
Compilación de un inventario de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Ejercicio Guiado: Compilación de un inventario de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Administración de archivos de configuración de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Ejercicio Guiado: Administración de archivos de configuración de Ansible . . . . . . . . . . . . . . . . . . . . . . . 38
Ejecución de comandos ad hoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Ejercicio Guiado: Ejecución de comandos ad hoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Trabajo de laboratorio: Implementación de Ansible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3. Implementación de guías 65
Escritura y ejecución de guías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Ejercicio Guiado: Escritura y ejecución de guías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Implementación de varias reproducciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Ejercicio Guiado: Implementación de varias reproducciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Trabajo de laboratorio: Implementación de guías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
RH294-RHEL8.0-es-1-20200501 v
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
vi RH294-RHEL8.0-es-1-20200501
Licencia de Ansible Lightbulb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
RH294-RHEL8.0-es-1-20200501 vii
viii RH294-RHEL8.0-es-1-20200501
Convenciones del documento
Referencias
En "Referencias", se describe el lugar donde se puede encontrar documentación
externa relevante para un tema.
nota
Las "notas" son consejos, atajos o enfoques alternativos para una tarea
determinada. Omitir una nota no debería tener consecuencias negativas, pero
quizás se pase por alto algún truco que puede simplificar una tarea.
Importante
En los cuadros "Importante", se detallan cosas que se olvidan con facilidad: cambios
de configuración que solo se aplican a la sesión actual o servicios que se deben
reiniciar para poder aplicar una actualización. Ignorar un cuadro con la etiqueta
"Importante" no provocará pérdida de datos, pero puede causar irritación y
frustración.
Advertencia
No se deben ignorar las "Advertencias". Es muy probable que omitir las advertencias
provoque pérdida de datos.
RH294-RHEL8.0-es-1-20200501 ix
x RH294-RHEL8.0-es-1-20200501
Introducción
RH294-RHEL8.0-es-1-20200501 xi
Introducción
xii RH294-RHEL8.0-es-1-20200501
Introducción
En este curso, el sistema de cómputo principal utilizado para las actividades prácticas de
aprendizaje es workstation. Los estudiantes también usan otras cuatro máquinas para estas
actividades: servera, serverb, serverc y serverd. Estos cinco sistemas se encuentran en el
dominio DNS lab.example.com.
Todos los sistemas de cómputo de los estudiantes tienen una cuenta de usuario estándar
(student) con la contraseña student. La contraseña root de todos los sistemas de los
estudiantes es redhat.
RH294-RHEL8.0-es-1-20200501 xiii
Introducción
La función principal de bastion es que actúa como enrutador entre la red que conecta las
máquinas de los estudiantes y la red del aula. Si bastion está apagada, otras máquinas de
estudiantes solo podrán acceder a sistemas en la red de estudiantes individuales.
Estados de la máquina
Estado de la Descripción
máquina virtual
xiv RH294-RHEL8.0-es-1-20200501
Introducción
Estado de la Descripción
máquina virtual
WAITING_TO_START La máquina virtual está esperando que inicien las demás máquinas
(EN ESPERA PARA virtuales.
INICIARSE)
Según el estado de una máquina, se dispone de una selección de las siguientes acciones.
Acciones de aula/máquina
PROVISION LAB Cree el aula de ROL. Crea todas las máquinas virtuales necesarias para
(APROVISIONAR el aula y las inicia. Puede tardar algunos minutos en completarse.
TRABAJO DE
LABORATORIO)
DELETE LAB Elimine el aula de ROL. Esta acción destruye todas las máquinas
(ELIMINAR virtuales del aula. Precaución: Se perderán los trabajos generados
TRABAJO DE en los discos.
LABORATORIO)
RH294-RHEL8.0-es-1-20200501 xv
Introducción
Al inicio de un ejercicio, si se le indica que restablezca el nodo de una máquina virtual, haga clic en
ACTION (ACCIÓN) → Reset (Restablecer) solo para la máquina virtual específica.
Al inicio de un ejercicio, si se le indica que restablezca todas las máquinas virtuales, haga clic en
ACTION (ACCIÓN) → Reset (Restablecer).
Si desea que el entorno del aula vuelva a su estado original al inicio del curso, puede hacer
clic en DELETE LAB (ELIMINAR TRABAJO DE LABORATORIO) para eliminar el entorno del
aula completo. Después de eliminar el trabajo de laboratorio, puede hacer clic en PROVISION
LAB (APROVISIONAR TRABAJO DE LABORATORIO) para aprovisionar un nuevo conjunto de
sistemas del aula.
Advertencia
La operación DELETE LAB (ELIMINAR TRABAJO DE LABORATORIO) no puede
deshacerse. Se perderán todos los trabajos que haya completado en el entorno del
aula hasta el momento.
Para ajustar el temporizador, haga clic en MODIFY (MODIFICAR) para que aparezca el cuadro
de diálogo New Autostop Time (Nuevo tiempo de detención automática). Defina la cantidad de
horas y minutos hasta que el aula deba detenerse automáticamente. Haga clic en ADJUST TIME
(AJUSTAR TIEMPO) para aplicar este cambio en los ajustes del temporizador.
xvi RH294-RHEL8.0-es-1-20200501
Introducción
Internacionalización
Compatibilidad de idioma
Red Hat Enterprise Linux 8 admite oficialmente 22 idiomas: inglés, asamés, bengalí, chino
(simplificado), chino (tradicional), francés, alemán, guyaratí, hindi, italiano, japonés, canarés,
coreano, malayalam, maratí, oriya, portugués (brasileño), panyabí, ruso, español, tamil y telugú.
Configuración de idioma
En el entorno de escritorio GNOME, posiblemente el usuario deba definir el idioma de su
preferencia y el método de entrada la primera vez que inicie sesión. Si no es así, la manera
más simple para un usuario individual de definir el idioma de su preferencia y el método
de entrada es usando la aplicación Region & Language (Región e idioma). Ejecute el
comando gnome-control-center region o, en la barra superior, seleccione (Usuario) →
Settings(Configuración). En la ventana que se abre, seleccione Region & Language. El usuario
puede hacer clic en la caja (box) Language (Idioma) y seleccionar el idioma de su preferencia en
la lista que aparece. Esto también actualizará la configuración de Formats (Formatos) mediante la
adopción del valor predeterminado para ese idioma. La próxima vez que el usuario inicie sesión, se
efectuarán los cambios.
Estas configuraciones afectan el entorno de escritorio GNOME y todas las aplicaciones, incluida
gnome-terminal, que se inician dentro de este. Sin embargo, no se aplican a la cuenta si el
acceso a ella es mediante un inicio de sesión ssh desde un sistema remoto o desde una consola
de texto local (como tty2).
RH294-RHEL8.0-es-1-20200501 xvii
Introducción
nota
Un usuario puede hacer que su entorno de intérprete de comandos use la misma
configuración de LANG que su entorno gráfico, incluso cuando inicia sesión
mediante una consola de texto o mediante ssh. Una manera de hacer esto es
colocar un código similar al siguiente en el archivo ~/.bashrc del usuario. Este
código de ejemplo definirá el idioma empleado en un inicio de sesión en interfaz de
texto de modo que coincida con el idioma actualmente definido en el entorno de
escritorio GNOME del usuario:
Es posible que algunos idiomas, como el japonés, coreano, chino y otros con un
conjunto de caracteres no latinos, no se vean correctamente en consolas de texto
locales.
Se pueden crear comandos individuales para usar otro idioma mediante la configuración de la
variable LANG en la línea de comandos:
La aplicación Region & Language (Región e idioma) también se puede usar para habilitar métodos
de entrada alternativos. En la ventana de la aplicación Region & Language (Región e idioma), la
caja (box) Input Sources (Fuentes de entrada) muestra los métodos de entrada disponibles en
este momento. De forma predeterminada, es posible que English (US) (Inglés [EE. UU.]) sea
el único método disponible. Resalte English (US) (inglés de EE. UU.) y haga clic en el icono de
teclado para ver la distribución actual del teclado.
Para agregar otro método de entrada, haga clic en el botón +, en la parte inferior izquierda de
la ventana Input Sources (Fuentes de entrada). Se abrirá la ventana Add an Input Source
(Agregar una fuente de entrada). Seleccione su idioma y, luego, el método de entrada o la
distribución del teclado de su preferencia.
Una vez que haya más de un método de entrada configurado, el usuario puede alternar entre ellos
rápidamente escribiendo Super+Space (en ocasiones denominado Windows+Space). También
aparecerá un indicador de estado en la barra superior de GNOME con dos funciones: por un lado,
indica el método de entrada activo; por el otro lado, funciona como un menú que puede usarse
xviii RH294-RHEL8.0-es-1-20200501
Introducción
para cambiar de un método de entrada a otro o para seleccionar funciones avanzadas de métodos
de entrada más complejos.
Algunos de los métodos están marcados con engranajes, que indican que tienen opciones de
configuración y capacidades avanzadas. Por ejemplo, el método de entrada japonés Japanese
(Kana Kanji) le permite al usuario editar previamente texto en latín y usar las teclas de flecha
hacia abajo y flecha hacia arriba para seleccionar los caracteres correctos que se
usarán.
El indicador también puede ser de utilidad para los hablantes de inglés de Estados Unidos. Por
ejemplo, dentro de English (United States) (Inglés [Estados Unidos]) está la configuración del
teclado English (international AltGr dead keys) (Inglés [internacional, teclas inactivas AltGr]),
que trata AltGr (o la tecla Alt derecha) en un teclado de 104/105 teclas de una PC como una
tecla modificadora "Bloq Mayús secundaria" y tecla de activación de teclas inactivas para escribir
caracteres adicionales. Hay otras distribuciones alternativas disponibles, como Dvorak.
nota
Cualquier carácter Unicode puede ingresarse en el entorno de escritorio GNOME,
si el usuario conoce el código Unicode del carácter, escribiendo Ctrl+Shift+U,
seguido por el código. Después de ingresar Ctrl+Shift+U, aparecerá una u
subrayada que indicará que el sistema espera la entrada del código Unicode.
Por ejemplo, la letra del alfabeto griego en minúscula lambda tiene el código U
+03BB y puede ingresarse escribiendo Ctrl+Shift+U, luego 03bb y por último
Enter.
Desde la línea de comandos, root puede cambiar los ajustes de configuración regional de todo
el sistema con el comando localectl. Si localectl se ejecuta sin argumentos, mostrará los
ajustes actuales de configuración regional de todo el sistema.
En GNOME, un usuario administrativo puede cambiar esta configuración en Region & Language
(Región e idioma) y con un clic en el botón Login Screen (Pantalla de inicio de sesión) ubicado
en la esquina superior derecha de la ventana. Al cambiar la opción de Language de la pantalla
de inicio de sesión, también ajustará el valor de idioma predeterminado de todo el sistema en el
archivo de configuración /etc/locale.conf.
RH294-RHEL8.0-es-1-20200501 xix
Introducción
Importante
Las consolas de texto locales como tty2 están más limitadas en las fuentes
que pueden mostrar que las sesiones gnome-terminal y ssh. Por ejemplo, los
caracteres del japonés, coreano y chino posiblemente no se visualicen como se
espera en una consola de texto local. Por este motivo, es posible que tenga sentido
usar el inglés u otro idioma con un conjunto de caracteres latinos para la consola de
texto del sistema.
De manera similar, las consolas de texto locales admiten una cantidad de métodos
de entrada también más limitada, y esto se administra de manera separada desde
el entorno de escritorio gráfico. La configuración de entrada global disponible se
puede configurar mediante localectl tanto para consolas virtuales de texto
locales como para el entorno gráfico X11. Para obtener más información, consulte las
páginas del manual localectl(1), kbd(4) y vconsole.conf(5).
Paquetes de idiomas
Si utiliza un idioma diferente al inglés, posiblemente desee instalar “paquetes de idiomas”
adicionales para disponer de traducciones adicionales, diccionarios, etc. Para ver la lista de
paquetes de idiomas disponibles, ejecute yum langavailable. Para ver la lista de paquetes de
idiomas actualmente instalados en el sistema, ejecute yum langlist. Para agregar un paquete
de idioma adicional al sistema, ejecute yum langinstall code, donde code es el código en
corchetes después del nombre del idioma en la salida de yum langavailable.
Referencias
Páginas del manual: locale(7), localectl(1), kbd(4), locale.conf(5),
vconsole.conf(5), unicode(7), utf-8(7) y yum-langpacks(8).
Las conversiones entre los nombres de los diseños X11 del entorno de escritorio
gráfico y sus nombres en localectl se pueden encontrar en el archivo /usr/
share/X11/xkb/rules/base.lst.
Códigos de idioma
Asamés as_IN.utf8
Bengalí bn_IN.utf8
Francés fr_FR.utf8
Alemán de_DE.utf8
xx RH294-RHEL8.0-es-1-20200501
Introducción
Guyaratí gu_IN.utf8
Hindi hi_IN.utf8
Italiano it_IT.utf8
Japonés ja_JP.utf8
Canarés kn_IN.utf8
Coreano ko_KR.utf8
Malayalam ml_IN.utf8
Maratí mr_IN.utf8
Odia or_IN.utf8
Panyabí pa_IN.utf8
Ruso ru_RU.utf8
Español es_ES.utf8
Tamil ta_IN.utf8
Telugú te_IN.utf8
RH294-RHEL8.0-es-1-20200501 xxi
xxii RH294-RHEL8.0-es-1-20200501
capítulo 1
Presentación de Ansible
Meta Describir los conceptos fundamentales de Ansible
y la forma de usarlo, e instalar Red Hat Ansible
Engine.
RH294-RHEL8.0-es-1-20200501 1
capítulo 1 | Presentación de Ansible
Automatización de la administración de
Linux con Ansible
Objetivo
Tras finalizar esta sección, deberá ser capaz de describir la motivación para automatizar las tareas
de administración de Linux con Ansible, los conceptos fundamentales de Ansible y la arquitectura
básica de Ansible.
Este enfoque es propenso a errores. Es fácil que un administrador de sistemas omita un paso o
realice un paso por error. A menudo, se hace una verificación limitada para comprobar que los
pasos se hayan realizado correctamente o que produzcan el resultado esperado.
Además, al administrar cada servidor de forma manual e independiente, es muy fácil que muchos
servidores que se supone que deben tener una configuración idéntica tengan diferencias menores
(o importantes). Esto puede dificultar el mantenimiento e introducir errores o inestabilidad en el
entorno de TI.
La automatización puede ayudar a evitar los problemas causados por la administración manual
del sistema y la administración de la infraestructura. Como administrador de sistemas, puede
usarla para garantizar que todos sus sistemas se implementen y se configuren de forma rápida y
correcta. Esto permite automatizar las tareas repetitivas de su cronograma diario a fin de tener
más tiempo para enfocarse en tareas más importantes. Para su organización, esto significa que
puede implementar más rápidamente la próxima versión de una aplicación o las actualizaciones de
un servicio.
Esto crea la base para ayudarlo a seguir las prácticas recomendadas en DevOps. Los
desarrolladores pueden definir su configuración deseada en el lenguaje de automatización. Los
operadores pueden revisar esos cambios con mayor facilidad para proporcionar comentarios y
2 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
usar esa automatización para garantizar de manera reproducible que los sistemas se encuentren
en el estado esperado por los desarrolladores.
La automatización le permite usar la revisión de código, la revisión por varios colegas expertos en
la materia y la documentación del procedimiento mediante la automatización misma para reducir
los riesgos operativos.
En última instancia, puede hacer que los cambios en su infraestructura de TI deban hacerse a
través de la automatización para mitigar los errores humanos.
¿Qué es Ansible?
Ansible es una plataforma de automatización de código abierto. Es un lenguaje de automatización
simple que puede describir perfectamente una infraestructura de aplicaciones de TI en Ansible
Playbooks. También es un motor de automatización que ejecuta Ansible Playbooks.
Ansible es simple
Las guías de Ansible proporcionan automatización legible por el ojo humano. Esto significa que las
guías son herramientas de automatización que también son fáciles de leer, comprender y cambiar
para los humanos. No se necesitan habilidades de codificación especiales para escribirlas. Las
guías ejecutan tareas en orden. La simplicidad del diseño de la guía hace que sean utilizables
por todos los equipos, lo que permite que las personas que nunca usaron Ansible se vuelvan
productivas rápidamente.
Ansible es potente
Puede usar Ansible para la implementación de aplicaciones, la administración de la configuración,
la automatización de flujos de trabajo y la automatización de redes. Ansible puede usarse para
orquestar el ciclo de vida completo de la aplicación.
RH294-RHEL8.0-es-1-20200501 3
capítulo 1 | Presentación de Ansible
• Compatible con diversas plataformas: Ansible proporciona soporte sin agentes para Linux,
Windows, UNIX y dispositivos de red, en entornos físicos, virtuales, de nube y en contenedores.
• Automatización legible por el ojo humano: Las Ansible Playbooks, escritas como archivos de
texto YAML, son fáciles de leer y permiten garantizar que todos entiendan lo que harán.
• Perfecta descripción de aplicaciones: Las guías de Ansible pueden realizar todas las
modificaciones, y se pueden describir y documentar todos los aspectos de su entorno de
aplicaciones.
• Fácil de administrar en el control de versiones: Las guías de Ansible y los proyectos son texto sin
formato. Puede considerarse código fuente y colocarse en su sistema de control de versiones
existente.
• Compatibilidad con inventarios dinámicos: La lista de máquinas que administra Ansible puede
actualizarse de forma dinámica desde fuentes externas para capturar la lista actual y correcta
de todos los servidores administrados todo el tiempo, independientemente de la infraestructura
o la ubicación.
• Orquestación que se integra fácilmente con otros sistemas: HP SA, Puppet, Jenkins, Red Hat
Satellite, y otros sistemas que existen en su entorno, se pueden aprovechar e integrar en su
workflow de Ansible.
Los hosts administrados aparecen en un inventario, que también organiza estos sistemas en
grupos para una administración colectiva más sencilla. El inventario puede definirse en un archivo
de texto estático, o se puede determinar de forma dinámica mediante scripts que obtienen
información de fuentes externas.
4 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
En lugar de escribir scripts complejos, los usuarios de Ansible crean reproducciones de alto nivel
para asegurarse de que un host o grupo de hosts estén en un estado particular. Una reproducción
realiza una serie de tareas en los hosts, en el orden especificado por la reproducción. Estas
reproducciones se expresan en formato YAML en un archivo de texto. Un archivo que contiene una
o más reproducciones se denomina una guía.
Cada tarea ejecuta un módulo, una pequeña parte de un código (escrito en Python, PowerShell
o cualquier otro lenguaje), con argumentos específicos. Cada módulo es esencialmente una
herramienta en su kit de herramientas. Ansible se envía con cientos de módulos útiles que pueden
realizar una amplia variedad de tareas de automatización. Pueden actuar en archivos de sistemas,
instalar software o realizar llamadas de API.
Cuando se usa en una tarea, un módulo generalmente garantiza que un aspecto específico de la
máquina tenga un estado específico. Por ejemplo, una tarea que usa un módulo puede garantizar
que exista un archivo y que tenga permisos y contenidos específicos, mientras que una tarea que
usa un módulo diferente puede asegurarse de que se monte un sistema de archivos específico. Si
el sistema no tiene ese estado, la tarea debe colocarlo en ese estado. Si el sistema ya tiene ese
estado, no realiza acciones. Si una tarea falla, el comportamiento predeterminado de Ansible es
cancelar el resto de la guía para los hosts que tuvieron una falla.
Las tareas, reproducciones y guías están diseñadas para ser idempotentes. Esto significa que
puede ejecutar de forma segura una guía en los mismos hosts varias veces. Cuando sus sistemas
tienen el estado correcto, la guía no realiza cambios cuando lo ejecuta. Esto significa que debería
poder ejecutar una guía de forma segura en los mismos hosts varias veces. Cuando, al ejecutar
sus sistemas, estos tienen el estado correcto, la guía no debería realizar cambios. Hay un puñado
de módulos que puede usar para ejecutar comandos arbitrarios. Sin embargo, debe usar esos
módulos con cuidado para asegurarse de que se ejecuten de forma idempotente.
Ansible también usa complementos (plug-ins). Los complementos (plug-ins) son códigos que
puede agregar a Ansible para ampliarla y adaptarla a los nuevos usos y las nuevas plataformas.
La arquitectura de Ansible no tiene agentes. En general, cuando un administrador ejecuta una guía
de Ansible o un comando ad hoc, el nodo de control se conecta con el host administrado mediante
SSH (de forma predeterminada) o WinRM. Esto significa que los clientes no necesitan tener un
agente específico de Ansible instalado en los hosts administrados y no necesitan permitir el tráfico
de red especial a un puerto no estándar.
Red Hat Ansible Tower es un marco (framework) empresarial que le permite controlar, asegurar
y administrar su automatización de Ansible a escala. Puede usarlo para controlar quién tiene
acceso a la ejecución de guías en qué hosts, el uso compartido de credenciales SSH sin permitir
a los usuarios transferir o ver su contenido, registrar todos sus trabajos de Ansible y administrar
el inventario, entre muchas otras cosas. Proporciona una interfaz de usuario basada en la Web (IU
web) y una API RESTful. No es una parte principal de Ansible, sino un producto diferente que le
permite usar Ansible de manera más efectiva con un equipo o a gran escala.
RH294-RHEL8.0-es-1-20200501 5
capítulo 1 | Presentación de Ansible
La manera de Ansible
La complejidad mata la productividad
Más sencillo es mejor. Ansible está diseñada de modo que sus herramientas sean simples de
usar y la automatización sea simple de escribir y leer. Debería aprovechar esto para lograr la
simplificación en el modo en que crea su automatización.
6 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Casos de uso
A diferencia de otras herramientas, Ansible combina y une la orquestación con la administración de
la configuración, el aprovisionamiento y la implementación de aplicaciones en una plataforma fácil
de usar.
Administración de configuraciones
Centralizar la implementación y administración de archivos de configuración es un caso
práctico común para Ansible, por lo que constituye el primer contacto de muchos usuarios
avanzados con la plataforma de automatización de Ansible.
Implementación de aplicaciones
Al definir su aplicación con Ansible, y administrar la implementación con Red Hat Ansible
Tower, los equipos pueden administrar con eficacia todo el ciclo de vida de la aplicación desde
desarrollo hasta producción.
Aprovisionamiento
Las aplicaciones deben implementarse o instalarse en los sistemas. Ansible y Red Hat
Ansible Tower pueden ayudar a optimizar el proceso de los sistemas de aprovisionamiento,
ya sea que esté arrancando servicios o máquinas virtuales sin sistema operativo PXE, o que
cree máquinas virtuales o instancias de cloud a partir de plantillas. Las aplicaciones deben
implementarse o instalarse en los sistemas.
Entrega continua
Crear una canalización de CI/CD requiere la coordinación y la participación de numerosos
equipos. No puede hacerlo sin una plataforma de automatización simple que pueden usar
RH294-RHEL8.0-es-1-20200501 7
capítulo 1 | Presentación de Ansible
Seguridad y conformidad
Al definir su política de seguridad en Ansible Playbooks, la detección y la corrección
de políticas de seguridad con respecto al sitio se pueden integrar en otros procesos
automatizados. En lugar de ser algo secundario, es una parte integral de todo lo que se
implementa.
Orquestación
Las configuraciones en sí mismas no definen su entorno. Debe definir cómo interactúan
los diferentes archivos de configuración y asegurarse de que las distintas piezas se puedan
administrar como una sola.
Referencias
Ansible
https://www.ansible.com
8 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Cuestionario
Automatización de la administración de
Linux con Ansible
Elija las respuestas correctas para las siguientes preguntas:
2. ¿Qué protocolo de red usa Ansible, de manera predeterminada, para comunicarse con
nodos administrados?
a. HTTP
b. HTTPS
c. SNMP
d. SSH
3. ¿Cuál de los siguientes archivos define las acciones que Ansible realiza en nodos
administrados?
a. Inventario de host
b. Manifiesto
c. Guía
d. Script
RH294-RHEL8.0-es-1-20200501 9
capítulo 1 | Presentación de Ansible
Solución
Automatización de la administración de
Linux con Ansible
Elija las respuestas correctas para las siguientes preguntas:
2. ¿Qué protocolo de red usa Ansible, de manera predeterminada, para comunicarse con
nodos administrados?
a. HTTP
b. HTTPS
c. SNMP
d. SSH
3. ¿Cuál de los siguientes archivos define las acciones que Ansible realiza en nodos
administrados?
a. Inventario de host
b. Manifiesto
c. Guía
d. Script
10 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Instalación de Ansible
Objetivos
Tras completar esta sección, deberá ser capaz de instalar Ansible en un nodo de control y describir
la diferencia entre la comunidad de Ansible y Red Hat Ansible Engine.
Sin embargo, si desea soporte formal para Ansible y sus módulos, Red Hat ofrece una suscripción
especial para esto: Red Hat Ansible Automation. Esta suscripción incluye soporte para Ansible
mismo, como Red Hat Ansible Engine. Esto agrega soporte técnico formal con acuerdos de
nivel de servicio y un alcance de cobertura publicado para Ansible y sus módulos principales.
Puede encontrar más información sobre el alcance de este soporte en Ciclo de vida de Red Hat
Ansible Engine [https://access.redhat.com/support/policy/updates/ansible-engine].
Nodos de control
Ansible es simple de instalar. El software de Ansible solo debe instalarse en el nodo (o los nodos)
de control desde el cual se ejecutará Ansible. No es necesario que los hosts que son administrados
por Ansible tengan Ansible instalado. Esta instalación implica relativamente pocos pasos y tiene
menos requisitos.
El nodo de control debería ser un sistema Linux o UNIX. Microsoft Windows no se admite como
nodo de control, si bien los sistemas Windows pueden ser hosts administrados.
Debe instalarse Python 3 (versión 3.5 o posterior) o Python 2 (versión 2.7 o posterior) en el nodo
de control.
Importante
Si está ejecutando Red Hat Enterprise Linux 8, Ansible 2.8 puede usar
automáticamente el paquete platform-python que admite utilidades del sistema
que usan Python. No es necesario instalar los paquetes python36 o python27 de
AppStream.
Puede encontrar información sobre cómo instalar el paquete de software ansible en un sistema
Red Hat Enterprise Linux en el artículo de la base de conocimiento ¿Cómo descargo e instalo
Red Hat Ansible Engine? [https://access.redhat.com/articles/3174981].
RH294-RHEL8.0-es-1-20200501 11
capítulo 1 | Presentación de Ansible
Ansible está en rápido desarrollo innovador y, por lo tanto, Red Hat Ansible Engine tiene un
ciclo de vida rápido. Puede encontrar más información sobre el ciclo de vida actual en https://
access.redhat.com/support/policy/updates/ansible-engine.
Puede usar estos canales para instalar Ansible con soporte limitado con las suscripciones estándar
de Red Hat Enterprise Linux. Si necesita un soporte de Ansible más completo, puede comprar
suscripciones completas de Red Hat Ansible Engine y asociarlas a sus sistemas antes de habilitar
los canales, como se explica en el artículo de la base de conocimiento.
Si tiene una suscripción de Red Hat Ansible Engine, el procedimiento de instalación para Red Hat
Ansible Engine 2 es de la siguiente manera:
Advertencia
No es necesario que ejecute estos pasos en el entorno de su aula.
3. Conecte su suscripción de Red Hat Ansible Engine. Este comando lo ayuda a encontrar su
suscripción de Red Hat Ansible Engine:
Si está utilizando la versión con soporte limitado provista con su suscripción de Red Hat Enterprise
Linux, use el siguiente procedimiento:
12 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Hosts administrados
Uno de los beneficios de Ansible es que los hosts administrados no necesitan tener un agente
especial instalado. El nodo de control de Ansible se conecta con los hosts administrados mediante
un protocolo de red estándar para garantizar que los sistemas tengan el estado especificado.
Los hosts administrados pueden tener algunos requisitos según el modo en que el nodo de control
se conecte con ellos y los módulos que se ejecutarán en ellos.
Los hosts administrados de Linux y UNIX deben tener Python 2 (versión 2.6 o posterior) o
Python 3 (versión 3.5 o posterior) instalado para que funcione la mayoría de los módulos.
Para Red Hat Enterprise Linux 8, puede ser capaz de depender del paquete platform-python.
También puede habilitar e instalar el flujo de aplicaciones python36 (o el flujo de aplicaciones
python27).
Si SELinux está habilitado en los hosts administrados, también deberá asegurarse de que el
paquete python3-libselinux esté instalado antes de usar módulos que se relacionen con las
funciones de copia, archivo o plantilla. (Observe que si se instalan otros componentes de Python,
puede usar módulos de Ansible, como yum o package, para garantizar que este paquete también
esté instalado).
Importante
Algunos nombres de paquetes pueden ser diferentes en Red Hat Enterprise Linux 7
y versiones anteriores debido a la migración en curso a Python 3.
Para Red Hat Enterprise Linux 7 y versiones anteriores, instale el paquete python,
que proporciona Python 2. En lugar de python3-libselinux, tendrá que asegurarse de
que el paquete libselinux-python esté instalado.
Algunos módulos pueden tener sus propios requisitos adicionales. Por ejemplo, el módulo dnf,
que puede usarse para instalar paquetes en sistemas Fedora actuales, requiere el paquete
python3-dnf (python-dnf en RHEL 7).
RH294-RHEL8.0-es-1-20200501 13
capítulo 1 | Presentación de Ansible
nota
Algunos módulos no necesitan Python. Por ejemplo, los argumentos pasados
al módulo raw de Ansible se ejecutan directamente mediante la shell remota
configurada, en lugar de pasar por el subsistema del módulo. Esto puede ser útil
para administrar dispositivos que no tengan Python disponible o que no puedan
instalar Python, o para arrancar Python en un sistema que no lo tenga.
Este curso usa hosts administrados basados en Linux en sus ejemplos y no profundiza sobre las
diferencias y los ajustes específicos necesarios cuando se gestionan hosts administrados basados
en Microsoft Windows. Puede encontrar más información en el sitio web de Ansible en https://
docs.ansible.com/ansible/latest/user_guide/windows.html.
Puede escribir guías de Ansible para dispositivos de red utilizando las mismas técnicas básicas
que utiliza al escribir guías para servidores. Como la mayoría de los dispositivos de red no
pueden ejecutar Python, Ansible ejecuta módulos de red en el nodo de control, no en los hosts
administrados. Los métodos de conexión especiales también se utilizan para comunicarse
con dispositivos de red, generalmente utilizando CLI sobre SSH, XML sobre SSH o API sobre
HTTP(S).
14 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Referencias
Página del manual (1)ansible
RH294-RHEL8.0-es-1-20200501 15
capítulo 1 | Presentación de Ansible
Ejercicio Guiado
Instalación de Ansible
En este ejercicio, instalará Ansible en un nodo de control que ejecuta Red Hat
Enterprise Linux.
Resultado
Usted deberá ser capaz de instalar Ansible en un nodo de control.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student y ejecute lab
intro-install start. Este script de inicio configura el nodo de control.
1. Instale Ansible en workstation de modo que se pueda usar como nodo de control.
2. Verifique que Ansible esté instalado en el sistema. Ejecute el comando ansible con la
opción --version.
16 RH294-RHEL8.0-es-1-20200501
capítulo 1 | Presentación de Ansible
Finalizar
En workstation, ejecute el script lab intro-install finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 17
capítulo 1 | Presentación de Ansible
Resumen
En este capítulo, aprendió lo siguiente:
• La automatización es una herramienta clave para mitigar los errores humanos y garantizar
rápidamente que su infraestructura de TI se encuentre en un estado correcto y coherente.
• Ansible es una plataforma de automatización de código abierto que puede adaptarse a muchos
flujos de trabajo y entornos diferentes.
• Ansible puede usarse para administrar muchos tipos de sistemas diferentes, incluidos los
servidores que ejecutan Linux, Microsoft Windows o UNIX, y dispositivos de red.
• Las guías de Ansible son archivos de texto legibles por humanos que describen el estado
deseado de una infraestructura de TI.
• Ansible está desarrollada en torno a una arquitectura sin agente en la cual Ansible se instala en
un nodo de control y los clientes no necesitan ningún software de agente especial.
• Ansible se conecta con hosts administrados con protocolos de red estándar, como SSH, y
ejecuta códigos o comandos en los hosts administrados para garantizar que tengan el estado
especificado por Ansible.
18 RH294-RHEL8.0-es-1-20200501
capítulo 2
Implementación de Ansible
Meta Configurar Ansible para administrar hosts y
ejecutar comandos ad hoc Ansible.
RH294-RHEL8.0-es-1-20200501 19
capítulo 2 | Implementación de Ansible
Objetivos
Tras finalizar esta sección, deberá ser capaz de describir los conceptos de inventario de Ansible y
de administrar un archivo de inventario estático.
Definición de inventario
Un inventario define un conjunto de hosts que Ansible administrará. Estos hosts también pueden
ser asignados a grupos, que pueden ser gestionados colectivamente. Los grupos pueden contener
grupos secundarios, y los hosts pueden ser miembros de múltiples grupos. El inventario también
puede establecer variables que se apliquen a los hosts y grupos que define.
Los inventarios de host se pueden definir de dos maneras diferentes. Un inventario de hosts
estático puede definirse por un archivo de texto. Un inventario de hosts dinámico puede estar
generado por un script u otro programa, según sea necesario, mediante proveedores de
información externos.
nota
Hay múltiples formatos de inventario estático soportados por Ansible. En esta
sección, nos centramos en el más frecuente, el formato INI-style.
En su forma más simple, un archivo de inventario estático estilo INI es una lista de nombres de host
o direcciones IP de hosts administrados, cada uno en una línea única:
web1.example.com
web2.example.com
db1.example.com
db2.example.com
192.0.2.42
Sin embargo, normalmente organiza hosts administrados en grupos de hosts. Los grupos de hosts
le permiten ejecutar Ansible de manera más efectiva en comparación con un conjunto de sistemas.
En este caso, cada sección comienza con un nombre de grupo de hosts encerrado entre corchetes
([]). A continuación, siguen el nombre de host o una dirección IP para cada host administrado en el
grupo, cada uno en una línea única.
En el siguiente ejemplo, el inventario del host define dos grupos de hosts, webservers y db-
servers.
20 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
[webservers]
web1.example.com
web2.example.com
192.0.2.42
[db-servers]
db1.example.com
db2.example.com
Los hosts pueden estar en múltiples grupos. De hecho, la práctica recomendada es organizar sus
hosts en múltiples grupos, posiblemente organizados de diferentes maneras, según el rol del host,
su ubicación física, ya sea en producción o no, y otras variables. Esto le permite aplicar fácilmente
reproducciones de Ansible a hosts específicos.
[webservers]
web1.example.com
web2.example.com
192.0.2.42
[db-servers]
db1.example.com
db2.example.com
[east-datacenter]
web1.example.com
db1.example.com
[west-datacenter]
web2.example.com
db2.example.com
[production]
web1.example.com
web2.example.com
db1.example.com
db2.example.com
[development]
192.0.2.42
Importante
Existen siempre dos grupos de hosts:
• El grupo de hosts all contiene todos los hosts detallados de manera explícita en
el inventario.
RH294-RHEL8.0-es-1-20200501 21
capítulo 2 | Implementación de Ansible
[usa]
washington1.example.com
washington2.example.com
[canada]
ontario01.example.com
ontario02.example.com
[north-america:children]
canada
usa
Un grupo puede tener hosts administrados y grupos secundarios como miembros. Por ejemplo, en
el inventario anterior, podría agregar una sección [north-america] que tenga su propia lista de
hosts administrados. Esta lista de hosts se fusionaría con los hosts adicionales que hereda el grupo
north-america de sus grupos secundarios.
[START:END]
Los rangos hacen coincidir todos los valores desde START hasta END, inclusive. Considere los
siguientes ejemplos:
• 192.168.[4:7].[0:255] coincide con todas las direcciones IPv4 en la red 192.168.4.0/22 (de
192.168.4.0 a 192.168.7.255).
22 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
[usa]
washington[1:2].example.com
[canada]
ontario[01:02].example.com
hosts (0):
Puede ejecutar el siguiente comando para mostrar todos los hosts en un grupo:
Importante
Si el inventario contiene un host y un grupo de hosts con el mismo nombre, el
comando ansible imprime una advertencia y el destinatario es el host. El grupo de
hosts se ignora.
Existen diversas maneras de tratar esta situación: la manera más fácil es garantizar
que los grupos de hosts no usen los mismos nombres que los hosts en el inventario.
Los comandos ansible y ansible-playbook que utiliz para ejecutar guías y comandos ad
hoc de Ansible más adelante en el curso también pueden especificar la ubicación de un archivo
de inventario en la línea de comandos con la opción --inventory PATHNAME o -i PATHNAME,
donde PATHNAME es la ruta al archivo de inventario deseado.
RH294-RHEL8.0-es-1-20200501 23
capítulo 2 | Implementación de Ansible
Por ejemplo, un programa de inventario dinámico podría contactarse con su servidor de Red Hat
Satellite o su cuenta de Amazon EC2, y usar la información almacenada allí para construir un
inventario de Ansible. Dado que el programa hace esto cuando ejecuta Ansible, puede completar
el inventario con información actualizada provista por el servicio a medida que se agregan nuevos
hosts y se eliminan hosts anteriores.
Referencias
Inventario: Documentación Ansible
http://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
24 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Ejercicio Guiado
Resultados
Deberá ser capaz de crear inventarios estáticos predeterminados y personalizados.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
servera.lab.example.com
servera.lab.example.com
[webservers]
serverb.lab.example.com
2.1. Use el comando ansible all --list-hosts para mostrar todos los hosts
administrados en el archivo de inventario. predeterminado
RH294-RHEL8.0-es-1-20200501 25
capítulo 2 | Implementación de Ansible
2.2. Use el comando ansible ungrouped --list-hosts para mostrar solo los hosts
administrados que no pertenecen a un grupo.
2.3. Use el comando ansible webservers --list-hosts para mostrar solo los hosts
administrados que pertenecen al grupo webservers.
26 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
[raleigh]
servera.lab.example.com
serverb.lab.example.com
[mountainview]
serverc.lab.example.com
[london]
serverd.lab.example.com
[development]
servera.lab.example.com
[testing]
serverb.lab.example.com
[production]
serverc.lab.example.com
serverd.lab.example.com
[us:children]
raleigh
mountainview
Importante
Su comando ansible debe incluir la opción -i inventory. Esto hace que
ansible use su archivo inventory en el directorio de trabajo actual en lugar del
archivo de inventario del sistema /etc/ansible/hosts.
4.1. Use el comando ansible all -i inventory --list-hosts para mostrar todos
los hosts administrados.
RH294-RHEL8.0-es-1-20200501 27
capítulo 2 | Implementación de Ansible
que no forman parte de un grupo. No hay hosts administrados sin grupo en este
archivo de inventario.
hosts (0):
4.7. Se le recomienda experimentar con otras variaciones para confirmar las entradas del
host administrado en el archivo de inventario personalizado.
Finalizar
En workstation, ejecute el script lab deploy-inventory finish para limpiar este
ejercicio.
28 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
RH294-RHEL8.0-es-1-20200501 29
capítulo 2 | Implementación de Ansible
Administración de archivos de
configuración de Ansible
Objetivos
Tras completar esta sección, deberá ser capaz de describir dónde están ubicados los archivos
de configuración de Ansible, cómo los selecciona Ansible y editarlos para aplicar los cambios a la
configuración predeterminada.
Configuración de Ansible
El comportamiento de una instalación de Ansible puede personalizarse mediante la modificación
de los parámetros en el archivo de configuración de Ansible. Ansible elige su archivo de
configuración entre diversas posibles ubicaciones en el nodo de control.
Uso de /etc/ansible/ansible.cfg
El paquete ansible proporciona un archivo de configuración base ubicado en /etc/ansible/
ansible.cfg. Este archivo se usa si no se encuentra ningún otro archivo de configuración.
Uso de ~/.ansible.cfg
Ansible busca un archivo .ansible.cfg en el directorio principal del usuario. Esta configuración
se usa en lugar de /etc/ansible/ansible.cfg si existe y si no existe el archivo ansible.cfg
en el directorio de trabajo actual.
Uso de ./ansible.cfg
Si existe un archivo ansible.cfg en el directorio en el cual se ejecuta el comando ansible,
se usa en lugar del archivo global o del archivo personal del usuario. Esto permite que los
administradores creen una estructura de directorios donde se almacenen diferentes entornos o
proyectos en directorios separados, y que cada directorio contenga un archivo de configuración
adaptado con un exclusivo conjunto de parámetros.
Importante
La práctica recomendada es crear un archivo ansible.cfg en un directorio desde
el que ejecute comandos de Ansible. El directorio también contendría archivos
usados por su proyecto Ansible, como un inventario y una guía. Esta es la ubicación
más común usada para el archivo de configuración de Ansible. Es inusual usar un
archivo ~/.ansible.cfg o /etc/ansible/ansible.cfg en la práctica.
30 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Los archivos especificados por la variable de entorno ANSIBLE_CONFIG reemplazan todos los
demás archivos de configuración. Si no se establece esa variable, a continuación, se verifica el
directorio en el que se ejecutó el comando ansible en busca de un archivo ansible.cfg. Si
ese archivo no está presente, el directorio principal del usuario se verifica en busca de un archivo
.ansible.cfg. El archivo /etc/ansible/ansible.cfg global se usa únicamente si no se
encuentra ningún otro archivo de configuración. Si el archivo de configuración /etc/ansible/
ansible.cfg no está presente, Ansible usa los valores predeterminados que contiene.
Debido a la gran cantidad de ubicaciones donde se pueden colocar los archivos de configuración
de Ansible, puede ser confuso qué archivo de configuración está usando Ansible. Puede ejecutar
el comando ansible --version para identificar claramente la versión instalada de Ansible y el
archivo de configuración utilizado.
Otra manera de mostrar el archivo de configuración de Ansible activo es usar la opción -v cuando
se ejecutan comandos de Ansible en la línea de comandos.
Ansible solo usa los parámetros del archivo de configuración con la mayor precedencia. Aun
si existen otros archivos con menor precedencia, sus parámetros se omiten y no se combinan
con aquellos en el archivo de configuración seleccionado. Por lo tanto, si decide crear su propio
archivo de configuración en favor del archivo de configuración /etc/ansible/ansible.cfg
global, debe duplicar todos los parámetros deseados de ese archivo en su propio archivo de
configuración de su nivel de usuario. Los parámetros no definidos en el archivo de configuración
del nivel de usuario permanecerán establecidos con los valores predeterminados integrados, aun si
el archivo de configuración global establece otros valores.
RH294-RHEL8.0-es-1-20200501 31
capítulo 2 | Implementación de Ansible
[defaults]
inventory = ./inventory
remote_user = user
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
Configuración de Ansible
Directiva Descripción
remote_user El nombre del usuario para iniciar sesión como en los hosts
administrados. Si no se especifica, se usa el nombre del
usuario actual.
Configuración de conexiones
Ansible debe saber cómo comunicarse con sus hosts administrados. Uno de los motivos más
comunes para cambiar el archivo de configuración es controlar los métodos y usuarios que usa
Ansible para manejar hosts administrados. A continuación, se detalla parte de la información
necesaria:
• La ubicación del inventario que muestra los hosts y grupos de hosts administrados.
• Qué protocolo de conexión se debe usar para comunicarse con los hosts administrados (de
forma predeterminada, SSH), y si se necesita un puerto de red no estándar para conectarse con
el servidor.
• Qué usuario remoto se debe usar en los hosts administrados; este podría ser root o podría ser
un usuario sin privilegios.
32 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
• Si el usuario remoto no tiene privilegios, Ansible debe saber si debe intentar escalar los
privilegios a root y cómo hacerlo (por ejemplo, mediante el uso de sudo).
• Si se debe solicitar o no una contraseña SSH o una contraseña sudo para iniciar sesión u
obtener privilegios.
[defaults]
inventory = ./inventory
Ajustes de conexión
De forma predeterminada, Ansible se conecta a los hosts administrados mediante el protocolo
SSH. Los parámetros más importantes que controlan el modo en que Ansible se conecta a los
hosts administrados se establecen en la sección [defaults].
De forma predeterminada, Ansible intenta conectarse a los hosts administrados con el mismo
nombre de usuario que el usuario local que ejecuta los comandos de Ansible. Para especificar un
usuario remoto diferente, establezca el parámetro remote_user con ese nombre de usuario.
Si el usuario local que ejecuta Ansible tiene claves SSH privadas configuradas que le permiten
autenticarse como el usuario remoto en los hosts administrados, Ansible inicia sesión de forma
automática. Si este no es el caso, puede configurar Ansible para que solicite al usuario local la
contraseña usada por el usuario remoto al establecer la directiva ask_pass = true.
[defaults]
inventory = ./inventory
remote_user = root
ask_pass = true
Suponiendo que usa un nodo de control de Linux y OpenSSH en sus hosts administrados, si
puede iniciar sesión en el usuario remoto con una contraseña, probablemente pueda configurar la
autenticación basada en claves mediante SSH, que le permitiría establecer ask_pass = false.
El primer paso es garantizar que el usuario en el nodo de control tenga un par de claves SSH
configurado en ~/.ssh. Puede ejecutar el comando ssh-keygen para lograr esto.
Para un solo host administrado existente, puede instalar su clave pública en el host administrado
y usar el comando ssh-copy-id para completar su archivo ~/.ssh/known_hosts local con su
clave de host, de la siguiente manera:
RH294-RHEL8.0-es-1-20200501 33
capítulo 2 | Implementación de Ansible
nota
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.
En este curso, aún no se analizan las Ansible Playbooks en detalle. Una reproducción
que garantice que su clave pública se implementa en las cuentas root de los hosts
administrados debe decir lo siguiente:
tasks:
- name: Ensure key is in root's ~/.ssh/authorized_hosts
authorized_key:
user: root
state: present
key: '{{ item }}'
with_file:
- ~/.ssh/id_rsa.pub
Dado que los hosts administrados aún no tendrían autenticación basada en claves
mediante SSH configurada, tendría que ejecutar la guía mediante el comando
ansible-playbook con la opción --ask-pass para que el comando se
autentique como usuario remoto.
Aumento de privilegios
Por motivos de seguridad y auditoría, Ansible puede tener que conectarse a hosts remotos
como un usuario sin privilegios antes de escalar privilegios para obtener acceso administrativo
como root. Esto se puede configurar en la sección [privilege_escalation] del archivo de
configuración de Ansible.
La directiva become_method especifica cómo aumentar los privilegios. Hay varias opciones
disponibles, pero la opción predeterminada es utilizar sudo. Del mismo modo, la directiva
become_user especifica el usuario al que se desea escalar, pero el predeterminado es root.
34 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Si el mecanismo become_method elegido requiere que el usuario introduzca una contraseña para
aumentar los privilegios, puede establecer la directiva become_ask_pass = true en el archivo
de configuración.
nota
En Red Hat Enterprise Linux 7, la configuración predeterminada de /etc/sudoers
garantiza que todos los usuarios en el grupo wheel tengan la capacidad de utilizar
sudo para convertirse en root después de introducir su contraseña.
Examine las implicaciones de seguridad del enfoque que elija para la escalación de
privilegios. Las distintas organizaciones e implementaciones pueden tener distintas
ventajas y desventajas para considerar.
El siguiente archivo ansible.cfg de ejemplo supone que puede conectarse a los hosts
administrados como someuser mediante la autenticación basada en claves SSH, y que someuser
puede usar sudo para ejecutar comandos como root sin introducir una contraseña:
[defaults]
inventory = ./inventory
remote_user = someuser
ask_pass = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
Conexiones no SSH
El protocolo utilizado por Ansible para conectarse a hosts administrados se establece de manera
predeterminada en smart, que determina la manera más eficaz de utilizar SSH. Esto se puede
establecer de muchas otras maneras en otros valores.
Por ejemplo, existe una excepción a la regla de que SSH se utiliza de manera predeterminada.
Si no tiene localhost en su inventario, Ansible establece una entrada implicit localhost para
permitirle ejecutar comandos ad hoc y guías que se dirijan a localhost . Esta entrada de
inventario especial no se incluye en los grupos de hosts all o ungrouped. Además, en lugar de
usar el tipo de conexión SSH smart, Ansible se conecta de manera predeterminada mediante el
tipo de conexión local especial.
RH294-RHEL8.0-es-1-20200501 35
capítulo 2 | Implementación de Ansible
hosts (1):
localhost
Si quiere estar seguro de conectarse a localhost mediante SSH como otros hosts
administrados, un enfoque es enumerarlo en su inventario. Sin embargo, esta acción lo incluye en
los grupos all y ungrouped, situación que quizás usted no desea.
Otro enfoque es cambiar el protocolo usado para conectarse a localhost. La mejor manera
de hacerlo es establecer la ansible_connection variable de host para localhost .
Para ello, en el directorio desde el que ejecuta los comandos Ansible, cree un subdirectorio
host_vars. En ese subdirectorio, cree un archivo denominado localhost que contenga la línea
ansible_connection: smart. Esto garantiza que se use el protocolo de conexión (SSH)
smart en lugar de local para localhost.
nota
También puede usar group variables para cambiar el tipo de conexión para un grupo
de hosts completo. Para ello, coloque los archivos con el mismo nombre como un
grupo en un directorio group_vars y asegúrese de que esos archivos contengan
parámetros para las variables de conexión.
Por ejemplo, puede querer que todos sus hosts administrados de Microsoft
Windows utilicen el protocolo winrm y el puerto 5986 para las conexiones. Para
configurar esto, puede colocar todos los hosts administrados en el grupo windows
y, luego, crear un archivo denominado group_vars/windows que contenga las
siguientes líneas:
ansible_connection: winrm
ansible_port: 5986
El numeral al inicio de una línea comenta toda la línea. No debe estar en la misma línea con una
directiva.
36 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
El punto y coma comenta todo hacia la derecha en la línea. Puede estar en la misma línea que una
directiva, siempre que esa directiva se encuentre a su izquierda.
Referencias
Páginas del manual: ansible(1), ansible-config(1), ssh-keygen(1) y ssh-
copy-id(1)
RH294-RHEL8.0-es-1-20200501 37
capítulo 2 | Implementación de Ansible
Ejercicio Guiado
Administración de archivos de
configuración de Ansible
En este ejercicio, personalizará su entorno de Ansible al editar un archivo de configuración
de Ansible.
Resultados
Usted deberá ser capaz de crear un archivo de configuración para configurar su entorno de
Ansible con parámetros personalizados persistentes.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
[defaults]
inventory = ./inventory
38 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
[myself]
localhost
[intranetweb]
servera.lab.example.com
[internetweb]
serverb.lab.example.com
[web:children]
intranetweb
internetweb
[myself]
localhost
[intranetweb]
servera.lab.example.com
[internetweb]
serverb.lab.example.com
[web:children]
intranetweb
internetweb
RH294-RHEL8.0-es-1-20200501 39
capítulo 2 | Implementación de Ansible
hosts (1):
serverb.lab.example.com
[student@workstation deploy-manage]$ ansible web --list-hosts
hosts (2):
servera.lab.example.com
serverb.lab.example.com
[student@workstation deploy-manage]$ ansible all --list-hosts
hosts (3):
localhost
servera.lab.example.com
serverb.lab.example.com
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = true
40 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
[defaults]
inventory = ./inventory
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = true
Finalizar
En workstation, ejecute el script lab deploy-manage finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 41
capítulo 2 | Implementación de Ansible
Objetivos
Después de completar esta sección, debe ser capaz de ejecutar una única tarea de
automatización Ansible usando un comando ad hoc y explicar algunos casos de uso de comandos
ad hoc.
Los comandos ad hoc son útiles para pruebas y cambios rápidos. Por ejemplo, puede usar un
comando ad hoc para asegurarse de que exista una determinada línea en el archivo /etc/hosts
en un grupo de servidores. Puede usar otro comando ad hoc para reiniciar un servicio de manera
eficiente en muchas máquinas diferentes o asegurarse de que un paquete de software específico
esté actualizado.
Los comandos ad hoc son una herramienta muy útil para realizar rápidamente tareas simples con
Ansible. Tienen sus límites y, en general, se recomienda usar Ansible Playbooks para desarrollar
la potencia máxima de Ansible. Sin embargo, en muchas situaciones, los comandos ad hoc son
exactamente la herramienta que necesita para realizar tareas simples de manera rápida.
El argumento host-pattern se usa para especificar los hosts administrados en los cuales se debería
ejecutar el comando ad hoc. Podría ser un host administrado específico o un grupo de hosts en
el inventario. Ya vio esto, usado junto con la opción --list-hosts, que le muestra qué hosts
coinciden con un patrón de host específico. Ya vio también que puede usar la opción -i para
especificar una ubicación diferente del inventario para usar en lugar de la predeterminada en el
archivo de configuración actual de Ansible.
La opción -m toma como argumento el nombre del módulo que Ansible debería ejecutar en los
hosts de destino. Los módulos son pequeños programas que se ejecutan para implementar una
tarea. Algunos módulos no necesitan información adicional, pero otros necesitan argumentos
adicionales para especificar los detalles de su funcionamiento. La opción -a toma una lista de
estos argumentos como cadena entre comillas.
Uno de los comandos ad hoc más simples usa el módulo ping. Este módulo no realiza un
ping ICMP, sino que verifica para ver si lpuede ejecutar os módulos basados en Python en
hosts administrados. Por ejemplo, el siguiente comando ad hoc determina si todos los hosts
administrados en el inventario pueden ejecutar módulos estándares:
42 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
El comando ansible-doc -l detalla todos los módulos instalados en un sistema. Puede usar
ansible-doc para ver la documentación de módulos específicos por nombre y para buscar
información respecto de los argumentos que los módulos toman como opciones. Por ejemplo, el
siguiente comando muestra documentación para el módulo ping:
- data
Data to return for the `ping' return value.
If this parameter is set to `crash', the module will cause an exception.
[Default: pong]
type: str
SEE ALSO:
* Module net_ping
The official documentation on the net_ping module.
https://docs.ansible.com/ansible/latest/modules/net_ping_module.html
* Module win_ping
The official documentation on the win_ping module.
https://docs.ansible.com/ansible/latest/modules/win_ping_module.html
RH294-RHEL8.0-es-1-20200501 43
capítulo 2 | Implementación de Ansible
- stableinterface
supported_by: core
EXAMPLES:
# Test we can logon to 'webservers' and execute python with json lib.
# ansible webservers -m ping
RETURN VALUES:
ping:
description: value provided with the data parameter
returned: success
type: str
sample: pong
Para obtener más información sobre los módulos, acceda a la documentación de Ansible en línea
en http://docs.ansible.com/ansible/latest/modules/modules_by_category.html.
En la siguiente tabla, se enumera una serie de ejemplos de módulos útiles. Existen muchos otros.
Módulos de Ansible
44 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
La mayoría de los módulos toman argumentos. Puede encontrar la lista de argumentos disponibles
para un módulo en la documentación del módulo. Los comandos ad hoc pasan argumentos a
los módulos con la opción -a. Cuando no se necesite ningún argumento, omita la opción -a
del comando ad hoc. Si se deben especificar varios argumentos, suminístrelos como una lista
separada por espacios entre comillas.
Por ejemplo, el siguiente comando ad hoc usa el módulo user para asegurarse de que exista el
usuario newbie y que tenga un UID 4000 en servera.lab.example.com:
La mayoría de los módulos son idempotent, lo que significa que pueden ejecutarse de forma
segura varias veces, y si el sistema ya tiene el estado correcto, no hacen nada. Por ejemplo, si se
ejecuta el comando ad hoc anterior nuevamente, este no debe informar ningún cambio:
RH294-RHEL8.0-es-1-20200501 45
capítulo 2 | Implementación de Ansible
"move_home": false,
"name": "newbie",
"shell": "/bin/bash",
"state": "present",
"uid": 4000
}
El ejemplo de comando ad hoc anterior arrojó dos líneas de salida para cada host administrado.
La primera línea es un informe de estado, donde se muestra el nombre del host administrado en el
que se ejecutó la operación ad hoc, así como el resultado de la operación. La segunda línea es la
salida del comando ejecutado de forma remota con el módulo command de Ansible.
Para obtener una mejor legibilidad y análisis de la salida del comando ad hoc, los administradores
pueden encontrar útil tener una sola línea de salida para cada operación realizada en un host
administrado. Utilice la opción -o para mostrar la salida de los comandos ad hoc de Ansible en un
formato de una sola línea.
nota
Si un comando ad hoc no especifica qué módulo usar con la opción -m, Red Hat
Ansible Engine usa el módulo command de manera predeterminada.
Para las situaciones en las que los comandos requieren procesamiento de la shell, los
administradores pueden usar el módulo shell. Al igual que el módulo command, pase los
comandos que se deben ejecutar como argumentos al módulo en un comando ad hoc. A
continuación, Ansible ejecuta el comando de forma remota en los hosts administrados. A
diferencia del módulo command, los comandos se procesan a través de una shell en los hosts
administrados. Por lo tanto, se podrá acceder a las variables del entorno de la shell, y también está
disponible el uso de las operaciones de la shell, como redirección y tubería.
46 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
El siguiente ejemplo ilustra la diferencia entre los módulos command y shell. Si intenta ejecutar el
comando Bash integrado, set, con estos dos módulos, solo es satisfactorio con el módulo shell.
Ambos módulos command y shell requieren una instalación Python de trabajo en el host
administrado. Un tercer módulo, raw, puede ejecutar comandos directamente con la shell remota
y eludir el subsistema del módulo. Esto es útil cuando administra sistemas que no pueden tener
Python instalado (por ejemplo, un enrutador de red). También puede usarse para instalar Python
en un host.
Importante
En la mayoría de las circunstancias, la práctica recomendada es evitar los módulos
de "ejecución de comandos" command, shell y raw.
Hay veces en las que los módulos de "ejecución de comandos" son herramientas
valiosas y una buena solución a un problema. Si no necesita usarlos, probablemente
sea mejor intentar usar el módulo command primero, y recurrir a los módulos shell
o raw solo si necesita sus funciones especiales.
inventory -i
RH294-RHEL8.0-es-1-20200501 47
capítulo 2 | Implementación de Ansible
remote_user -u
become --become, -b
become_method --become-method
become_user --become-user
become_ask_pass --ask-become-pass, -K
Antes de configurar estas directivas con las opciones de la línea de comandos, sus valores
definidos actualmente pueden determinarse al consultar la salida de ansible --help.
Referencias
Página del manual (1)ansible
48 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Ejercicio Guiado
Resultados
Usted debe poder ejecutar comandos ad hoc en hosts administrados con escalación de
privilegios.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
1.1. Determine la configuración sudo para la cuenta devops que se configuró cuando se
creó workstation. Ingrese student si se le solicita la contraseña, para la cuenta
student.
Tenga en cuenta que el usuario tiene plenos privilegios sudo, pero no requiere
autenticación de contraseña.
1.2. Determine la configuración sudo para la cuenta devops que se configuró cuando se
creó servera.
Tenga en cuenta que el usuario tiene plenos privilegios sudo, pero no requiere
autenticación de contraseña.
RH294-RHEL8.0-es-1-20200501 49
capítulo 2 | Implementación de Ansible
[intranetweb]
servera.lab.example.com
3. Con el grupo de hosts all y el módulo ping, ejecute un comando ad hoc para asegurarse
de que todos los hosts administrados puedan ejecutar módulos de Ansible con Python.
50 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Observe que el comando ad hoc se ejecutó en el host administrado como usuario devops.
El comando ad hoc falló porque el usuario devops no tiene permiso para escribir en el
archivo.
RH294-RHEL8.0-es-1-20200501 51
capítulo 2 | Implementación de Ansible
"owner": "root",
"secontext": "system_u:object_r:etc_t:s0",
"size": 19,
"src": "/home/devops/.ansible/tmp/ansible-
tmp-1558954193.0260043-131348380629718/source",
"state": "file",
"uid": 0
}
8. Ejecute de nuevo el comando ad hoc anterior en todos los hosts usando el grupo de hosts
all. Esto garantiza que /etc/motd en workstation y servera contengan el texto
“Managed by Ansible” (Administrado por Ansible).
52 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
"size": 19,
"state": "file",
"uid": 0
}
Debe ver SUCCESS para localhost y CHANGED para servera. Sin embargo, localhost
debe informar "changed": false, ya que el archivo ya tiene el estado correcto. Por
el contrario, servera debe informar "changed": true, ya que el comando ad hoc
actualizó el archivo con el estado correcto.
9. Con el módulo command, ejecute un comando ad hoc para ejecutar cat /etc/motd
a fin de verificar que el contenido del archivo se haya modificado correctamente en
workstation y servera. Use el grupo de hosts all y el usuario devops para especificar
los hosts administrados y realizar la conexión con ellos. No es necesario aumentar los
privilegios para que funcione este comando.
Finalizar
En workstation, ejecute el script lab deploy-adhoc finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 53
capítulo 2 | Implementación de Ansible
Trabajo de laboratorio
Implementación de Ansible
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará un nodo de control de Ansible para las conexiones
con los hosts de inventario y usará comandos ad hoc para realizar acciones en hosts
administrados.
Resultados
Usted deberá ser capaz de configurar un nodo de control para ejecutar comandos ad hoc en
hosts administrados.
Usará comandos ad hoc para garantizar que el archivo /etc/motd en todos los hosts
administrados esté compuesto por contenido especificado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
1. Verifique que el paquete ansible esté instalado en el nodo de control y ejecute el comando
ansible --version.
2. En el directorio principal del usuario student en workstation, /home/student, cree un
nuevo directorio denominado deploy-review. Cambie a ese directorio.
3. Cree un archivo ansible.cfg en el directorio deploy-review, el cual usará para
configurar los siguientes valores predeterminados de Ansible:
54 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Los hosts administrados se configuraron con un usuario devops que puede iniciar sesión
con autenticación basada en claves mediante SSH y que puede ejecutar cualquier comando
como root con el comando sudo sin contraseña.
4. Cree el directorio /home/student/deploy-review/inventory.
Descargue el archivo http://materials.example.com/labs/deploy-review/
inventory y guárdelo como un archivo de inventario estático denominado /home/
student/deploy-review/inventory/inventory.
5. Ejecute el comando id como comando ad hoc con el grupo de hosts all como destino
para verificar que devops es ahora el usuario remoto y que la escalación de privilegios está
deshabilitada de forma predeterminada.
6. Ejecute un comando ad hoc, con el grupo de hosts all como destino, que usa el módulo
copy para modificar el contenido del archivo /etc/motd en todos los hosts.
Use la opción content del módulo copy para garantizar que el archivo /etc/motd esté
compuesto por la cadena This server is managed by Ansible.\n (Este servidor es
administrado por Ansible.\n) como una sola línea. (\n, usado con la opción content, hace
que el módulo coloque una nueva línea al final de la cadena.)
Debe solicitar el aumento de privilegios desde la línea de comandos para hacer este trabajo
con sus valores predeterminados de ansible.cfg actuales.
7. Si ejecuta nuevamente el mismo comando ad hoc, debería ver que el módulo copy detecta
que los archivos ya son correctos, por lo que estos no se modifican. Busque el comando
ad hoc para informar SUCCESS y la línea "changed": false para cada host administrado.
8. Para confirmar esta otra manera, ejecute un comando ad hoc con el grupo all como destino,
con el módulo command para ejecutar el comando cat /etc/motd. La salida del comando
ansible debería mostrar la cadena This server is managed by Ansible. (Este
servidor es administrado por Ansible) para todos los hosts. No es necesario aumentar los
privilegios para este comando ad hoc.
9. Ejecute lab deploy-review grade en workstation para verificar su trabajo.
Finalizar
En workstation, ejecute el script lab deploy-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 55
capítulo 2 | Implementación de Ansible
Solución
Implementación de Ansible
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará un nodo de control de Ansible para las conexiones
con los hosts de inventario y usará comandos ad hoc para realizar acciones en hosts
administrados.
Resultados
Usted deberá ser capaz de configurar un nodo de control para ejecutar comandos ad hoc en
hosts administrados.
Usará comandos ad hoc para garantizar que el archivo /etc/motd en todos los hosts
administrados esté compuesto por contenido especificado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
1. Verifique que el paquete ansible esté instalado en el nodo de control y ejecute el comando
ansible --version.
1.2. Ejecute el comando ansible --version para confirmar la versión de Ansible que
está instalada.
56 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Los hosts administrados se configuraron con un usuario devops que puede iniciar sesión
con autenticación basada en claves mediante SSH y que puede ejecutar cualquier comando
como root con el comando sudo sin contraseña.
[defaults]
remote_user = devops
inventory = inventory
RH294-RHEL8.0-es-1-20200501 57
capítulo 2 | Implementación de Ansible
[privilege_escalation]
become = False
become_method = sudo
become_user = root
become_ask_pass = False
[defaults]
remote_user = devops
inventory = inventory
[privilege_escalation]
become = False
become_method = sudo
become_user = root
become_ask_pass = False
[intranetweb]
servera.lab.example.com
serverc.lab.example.com
serverd.lab.example.com
5. Ejecute el comando id como comando ad hoc con el grupo de hosts all como destino
para verificar que devops es ahora el usuario remoto y que la escalación de privilegios está
deshabilitada de forma predeterminada.
58 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
RH294-RHEL8.0-es-1-20200501 59
capítulo 2 | Implementación de Ansible
"changed": true,
"checksum": "93d304488245bb2769752b95e0180607effc69ad",
"dest": "/etc/motd",
"gid": 0,
"group": "root",
"md5sum": "af74293c7b2a783c4f87064374e9417a",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_t:s0",
"size": 35,
"src": "/home/devops/.ansible/tmp/ansible-
tmp-1558954517.7165847-103324013882266/source",
"state": "file",
"uid": 0
}
serverc.lab.example.com | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "93d304488245bb2769752b95e0180607effc69ad",
"dest": "/etc/motd",
"gid": 0,
"group": "root",
"md5sum": "af74293c7b2a783c4f87064374e9417a",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_t:s0",
"size": 35,
"src": "/home/devops/.ansible/tmp/ansible-tmp-1558954517.75727-94151722302122/
source",
"state": "file",
"uid": 0
}
serverb.lab.example.com | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "93d304488245bb2769752b95e0180607effc69ad",
"dest": "/etc/motd",
"gid": 0,
"group": "root",
"md5sum": "af74293c7b2a783c4f87064374e9417a",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_t:s0",
"size": 35,
"src": "/home/devops/.ansible/tmp/ansible-
tmp-1558954517.6649802-53313238077104/source",
"state": "file",
"uid": 0
}
60 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
7. Si ejecuta nuevamente el mismo comando ad hoc, debería ver que el módulo copy detecta
que los archivos ya son correctos, por lo que estos no se modifican. Busque el comando
ad hoc para informar SUCCESS y la línea "changed": false para cada host administrado.
RH294-RHEL8.0-es-1-20200501 61
capítulo 2 | Implementación de Ansible
"state": "file",
"uid": 0
}
servera.lab.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"checksum": "93d304488245bb2769752b95e0180607effc69ad",
"dest": "/etc/motd",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/etc/motd",
"secontext": "system_u:object_r:etc_t:s0",
"size": 35,
"state": "file",
"uid": 0
}
8. Para confirmar esta otra manera, ejecute un comando ad hoc con el grupo all como destino,
con el módulo command para ejecutar el comando cat /etc/motd. La salida del comando
ansible debería mostrar la cadena This server is managed by Ansible. (Este
servidor es administrado por Ansible) para todos los hosts. No es necesario aumentar los
privilegios para este comando ad hoc.
Finalizar
En workstation, ejecute el script lab deploy-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
62 RH294-RHEL8.0-es-1-20200501
capítulo 2 | Implementación de Ansible
Resumen
En este capítulo, aprendió lo siguiente:
• Cualquier sistema en el que se instale Ansible y que tenga acceso a las guías y los archivos
de configuración requeridos para administrar sistemas remotos (managed hosts [hosts
administrados]) se denomina un nodo de control.
• Los hosts administrados se definen en el inventario. Los patrones del host se usan para hacer
referencia a los hosts administrados definidos en un inventario.
• Los inventarios pueden ser archivos estáticos o pueden ser generados de forma dinámica
por un programa desde una fuente externa, como un servicio de directorio o un sistema de
administración de la nube.
• Los comandos ad hoc determinan la operación que se realizará mediante el uso de módulos y
sus argumentos, y pueden hacer uso de las características de aumento de privilegios de Ansible.
RH294-RHEL8.0-es-1-20200501 63
64 RH294-RHEL8.0-es-1-20200501
capítulo 3
Implementación de guías
Meta Escribir un Ansible Playbook simple y ejecutarlo
para automatizar tareas en varios hosts.
RH294-RHEL8.0-es-1-20200501 65
capítulo 3 | Implementación de guías
Objetivos
Tras finalizar esta sección, deberá ser capaz de escribir una guía de Ansible básica y ejecutarla con
el comando ansible-playbook.
Este se puede reescribir como una reproducción de una sola tarea y se puede guardar en una guía.
La guía resultante puede verse de la siguiente manera:
---
- name: Configure important user consistently
hosts: servera.lab.example.com
tasks:
- name: newbie exists with UID 4000
user:
name: newbie
uid: 4000
state: present
66 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Una guía es un archivo de texto escrito en formato YAML, y se guarda generalmente con la
extensión yml. La guía usa sangría con caracteres de espacio para indicar la estructura de sus
datos. YAML no establece requisitos estrictos sobre cuántos espacios se usan para la sangría, pero
hay dos reglas básicas.
• Los elementos de datos en el mismo nivel en la jerarquía (como ítems en la misma lista) deben
tener la misma sangría.
• Los elementos que son elementos secundarios de otro elemento deben tener más sangría que
sus elementos principales.
Importante
Solo el carácter de espacio se puede usar para sangría; no se permiten caracteres
de tabulación.
Si usa el editor de texto vi, puede aplicar algunos parámetros que pueden facilitar
la edición de sus guías. Por ejemplo, puede agregar la siguiente línea a su archivo
$HOME/.vimrc y, si vi detecta que usted está editando un archivo YAML, realiza
una sangría de dos espacios cuando presiona la tecla Tab y realiza una sangría
automática de las líneas posteriores.
La guía comienza con una línea que consiste en tres guiones (---) como un marcador del inicio de
documento. También puede finalizar con tres puntos (...) como marcador de fin del documento,
si bien en la práctica por lo general se omite.
Entre estos marcadores, la guía se define como una lista de reproducciones. Un elemento en una
lista YAML comienza con un solo guión seguido de un espacio. Por ejemplo, una lista YAML puede
verse de la siguiente manera:
- apple
- orange
- grape
En Ejemplo 3.1, “Una guía simple”, la línea después de --- comienza con un guión y comienza la
primera (y la única) reproducción en la lista de reproducciones.
RH294-RHEL8.0-es-1-20200501 67
capítulo 3 | Implementación de guías
La reproducción original a modo de ejemplo tiene tres claves, name, hosts y tasks, porque todas
estas claves tienen la misma sangría.
La primera línea de la reproducción de ejemplo comienza con un guión y un espacio (que indican
que la reproducción es el primer ítem de una lista); luego, sigue la primera clave, el atributo name
(nombre). La clave name asocia una cadena arbitraria con la reproducción como etiqueta. Esta
identifica para qué es la reproducción. La clave name es opcional, pero se recomienda, ya que
ayuda a documentar su guía. Esto es especialmente útil cuando una guía contiene reproducciones
múltiples.
La segunda clave en la reproducción es un atributo hosts, que especifica los hosts respecto
de los cuales se deben ejecutar las tareas de la reproducción. Al igual que el argumento para el
comando ansible, el atributo hosts toma un patrón de host como valor, como los nombres de
los hosts administrados o grupos en el inventario.
hosts: servera.lab.example.com
Finalmente, la última clave en la reproducción es el atributo tasks (tareas), cuyo valor especifica
una lista de tareas para ejecutar para esta reproducción. Este ejemplo tiene una sola tarea que
ejecuta el módulo user con argumentos específicos (para garantizar que el usuario newbie exista
y tenga una UID de 4000).
tasks:
- name: newbie exists with UID 4000
user:
name: newbie
uid: 4000
state: present
El atributo tasks (tareas) es la parte de la reproducción que detalla realmente, en orden, las
tareas que se ejecutarán en los hosts administrados. Cada tarea en la lista es en sí una recopilación
de pares de claves-valores.
• name es una etiqueta opcional que documenta el propósito de la tarea. Es una buena idea
asignarles nombres a todas sus tareas para poder documentar el propósito de cada paso del
proceso de automatización.
• user es el módulo que se ejecutará para esta tarea. Sus argumentos se pasan como una
recopilación de pares de claves-valores, que son elementos secundarios del módulo (name, uid
y state).
A continuación, se incluye otro ejemplo de un atributo tasks con varias tareas, que usan el
módulo service para garantizar que varios servicios de red estén habilitados para iniciarse en el
arranque:
tasks:
- name: web server is enabled
service:
name: httpd
enabled: true
68 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Importante
El orden en el que se muestran las reproducciones y tareas en una guía es
importante, ya que Ansible las ejecuta en el mismo orden.
Las guías que vio hasta ahora son ejemplos básicos, y verá ejemplos más sofisticados de lo que
puede hacer con reproducciones y tareas a medida que continúe este curso.
Ejecución de guías
El comando ansible-playbook se usa para ejecutar guías. El comando se ejecuta en el nodo de
control y el nombre de la guía que debe ejecutarse se pasa como un argumento:
Cuando ejecuta la guía, se genera la salida para mostrar la reproducción y las tareas que se están
ejecutando. En la salida, también se reportan los resultados de cada tarea ejecutada.
El siguiente ejemplo muestra el contenido de una guía simple y, luego, el resultado de su ejecución.
RH294-RHEL8.0-es-1-20200501 69
capítulo 3 | Implementación de guías
Observe que el valor de la clave name establecido para cada reproducción y tarea se muestra
cuando se ejecuta la guía. (La tarea Gathering Facts [Recopilación de datos] es una
tarea especial que el módulo setup en general ejecuta de forma automática al inicio de una
reproducción. Esto se analizará más adelante en el curso). En el caso de las guías con varias
reproducciones y tareas, el hecho de establecer los atributos name (nombre) facilita el monitoreo
del progreso de la ejecución de una guía.
También debe ver que la tarea latest httpd version installed (versión httpd más
reciente instalada) se cambie por servera.lab.example.com. Esto significa que la tarea
modificó algo en ese host para garantizar que se cumpla su especificación. En este caso, significa
que el paquete httpd probablemente no se instaló o no era la versión más reciente.
En general, las tareas en las Ansible Playbooks son idempotentes, y es seguro ejecutar una
guía varias veces. Si los hosts administrados de destino ya tienen el estado correcto, no se
deberían realizar cambios. Por ejemplo, supongamos que la guía del ejemplo anterior se ejecuta
nuevamente:
Esta vez, todas las tareas pasaron con el estado ok y no se informaron cambios.
Opción Descripción
70 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Opción Descripción
Verificación de la sintaxis
Antes de ejecutar una guía, se recomienda realizar la verificación para garantizar que la sintaxis
de su contenido sea la correcta. El comando ansible-playbook ofrece una opción --syntax-
check, que se puede utilizar para verificar la sintaxis de una guía. El siguiente ejemplo muestra la
verificación correcta de la sintaxis de una guía.
playbook: webserver.yml
Cuando falla la verificación de la sintaxis, se reporta un error de sintaxis. La salida también incluye
la ubicación aproximada del problema de sintaxis en la guía. El siguiente ejemplo muestra la
verificación de sintaxis fallida de una guía en donde falta el separador de espacio después del
atributo name para la reproducción.
The error appears to have been in ...output omitted... line 3, column 8, but may
be elsewhere in the file depending on the exact syntax problem.
Ejecución de un simulacro
Puede usar la opción -C para realizar un simulacro de la ejecución de la guía. 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.
El siguiente ejemplo muestra la ejecución práctica de una guía que contiene una única tarea para
garantizar que la última versión del paquete httpd esté instalada en un host administrado. Observe
que la ejecución práctica informa que la tarea realizaría un cambio en el host administrado.
RH294-RHEL8.0-es-1-20200501 71
capítulo 3 | Implementación de guías
Referencias
Página del manual: ansible-playbook(1)
72 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Ejercicio Guiado
Resultados
Usted deberá ser capaz de escribir una guía con una sintaxis YAML básica y una estructura
de Ansible Playbook, y ejecutarla correctamente con el comando ansible-playbook.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
En este directorio, use un editor de texto para crear una guía denominada site.yml. Esta
guía contiene una reproducción, que debe destinarse a miembros del grupo de host web. La
guía debería usar tareas para garantizar que se cumplan las siguientes condiciones en los hosts
administrados:
Puede usar el comando ansible-doc para poder entender las palabras clave necesarias para
cada uno de los módulos.
Después de que se escriba la guía, verifique su sintaxis y, luego, use ansible-playbook para
ejecutar la guía a fin de implementar la configuración.
RH294-RHEL8.0-es-1-20200501 73
capítulo 3 | Implementación de guías
2. Use un editor de texto para crear una nueva guía denominada /home/student/
playbook-basic/site.yml. Comience a escribir una reproducción que destine los
hosts en el grupo de hosts web.
---
2.2. La siguiente línea inicia la reproducción. Debe iniciar con un guión y un espacio antes
de la primera palabra clave en la reproducción. Asígnele a la reproducción el nombre
de una cadena arbitraria que documente el propósito de la reproducción, con la
palabra clave name.
---
- name: Install and start Apache HTTPD
2.3. Agregue un par palabra clave-valor hosts para especificar que la reproducción se
ejecute en hosts en el grupo de hosts web del inventario. Asegúrese de que la palabra
clave hosts esté indentada dos espacios para que se alinee con la palabra clave
name en la línea anterior.
El archivo site.yml completo ahora debe verse de la siguiente manera:
---
- name: Install and start Apache HTTPD
hosts: web
3.1. Agregue una palabra clave tasks con una sangría de dos espacios (alineada con la
palabra clave hosts) para iniciar la lista de tareas. Su archivo ahora debe verse de la
siguiente manera:
---
- name: Install and start Apache HTTPD
hosts: web
tasks:
3.2. Agregue la primera tarea. Aplique una sangría de cuatro espacios, e inicie la tarea con
un guión y un espacio; luego, asigne un nombre a la tarea, como httpd package
is present (el paquete httpd está presente). Use el módulo yum para esta tarea.
Agregue una sangría de dos espacios más a las palabras clave del módulo; configure
el nombre del paquete en httpd y el estado del paquete en present (presente). La
tarea debe verse de la siguiente manera:
74 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
3.3. Agregue la segunda tarea. Haga coincidir el formato de la tarea anterior y asígnele
un nombre a la tarea, como correct index.html is present (el index.html
correcto está presente). Use el módulo copy. Las palabras clave del módulo deben
configurar la clave src para files/index. html y la clave dest para /var/www/
html/index.html. La tarea debe verse de la siguiente manera:
3.4. Agregue la tercera tarea para iniciar y habilitar el servicio httpd. Haga coincidir el
formato de las dos tareas anteriores y asígnele un nombre a la nueva tarea, como
httpd is started (se inició httpd). Use el módulo service para esta tarea.
Configure la clave name (nombre) del servicio en httpd, el state (estado) en
started (iniciado) y enabled (habilitado) en true (verdadero). La tarea debe
verse de la siguiente manera:
3.5. Su guía Ansible site.yml completa debe coincidir con el siguiente ejemplo.
Asegúrese de que la sangría de las palabras clave de su reproducción, la lista de
tareas y las palabras clave de cada tarea sean todas correctas.
---
- name: Install and start Apache HTTPD
hosts: web
tasks:
- name: httpd package is present
yum:
name: httpd
state: present
RH294-RHEL8.0-es-1-20200501 75
capítulo 3 | Implementación de guías
playbook: site.yml
5. Ejecute su guía. Lea la salida generada para garantizar que todas las tareas se hayan
completado satisfactoriamente.
6. Si todo fue bien, usted deberá ser capaz de ejecutar la guía por segunda vez y ver todas las
tareas completas sin cambios en los hosts administrados.
76 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
ok: [serverc.lab.example.com]
7. Use el comando curl para verificar que serverc y serverd se hayan configurado como
un servidor HTTPD.
Finalizar
En workstation, ejecute el script lab playbook-basic finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 77
capítulo 3 | Implementación de guías
Implementación de varias
reproducciones
Objetivos
Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente:
• Escribir una guía que use varias reproducciones y aumento de privilegios por reproducción.
• Use con eficacia ansible-doc para aprender a usar nuevos módulos a fin de implementar
tareas para una reproducción.
Esto puede ser muy útil cuando se organiza una implementación compleja que puede involucrar
diferentes tareas en diferentes hosts. Puede escribir una guía que ejecute una reproducción
respecto de un conjunto de hosts y que, cuando esta finaliza, ejecute otra reproducción respecto
de otro conjunto de hosts.
Escribir una guía que contenga varias reproducciones es muy sencillo. Cada reproducción en la
guía se escribe como un ítem de lista de nivel superior en la guía. Cada reproducción es un ítem de
una lista que contiene las palabras clave de reproducciones habituales.
El siguiente ejemplo muestra una guía simple con dos reproducciones. La primera reproducción se
ejecuta respecto de web.example.com, y la segunda, respecto de database.example.com.
---
# This is a simple playbook with two plays
78 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
service:
name: mariadb
enabled: true
Atributos de usuario
Las tareas en guías se ejecutan generalmente a través de una conexión de red en los hosts
administrados. Al igual que con comandos ad hoc, la cuenta de usuario usada para la ejecución
de tareas depende de diferentes palabras clave en el archivo de configuración de Ansible, /etc/
ansible/ansible.cfg. El usuario que ejecuta las tareas puede estar definido por la palabra
clave remote_user. Sin embargo, si se activa el aumento de privilegios, otras palabras clave
como become_user también pueden causar un impacto.
remote_user: remoteuser
become: true
become_method: sudo
become_user: privileged_user
RH294-RHEL8.0-es-1-20200501 79
capítulo 3 | Implementación de guías
tasks:
- name: server.example.com in /etc/hosts
lineinfile:
path: /etc/hosts
line: '192.0.2.42 server.example.com server'
state: present
Por cada módulo, el sitio web de la documentación de Ansible brinda un resumen de sus funciones
e instrucciones sobre cómo se puede invocar cada función específica con opciones para el
módulo. La documentación también proporciona ejemplos útiles que muestran cómo usar cada
módulo y cómo establecer sus palabras clave en una tarea.
Ya trabajó con el comando ansible-doc para buscar información acerca de módulos instalados
en el sistema local. Como revisión, para ver una lista de los módulos disponibles en un nodo de
control, ejecute el comando ansible-doc -l. Esto muestra una lista de nombres de módulos y
una sinopsis de sus funciones.
80 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Installs, upgrade, downgrades, removes, and lists packages and groups with
the `yum' package manager. This module only works on Python 2. If you require
Python
3 support see the [dnf] module.
OPTIONS (= is mandatory):
- allow_downgrade
Specify if the named package and version is allowed to downgrade a maybe
already installed higher version of that package. Note that setting
allow_downgrade=True can make this module behave in a non-idempotent way.
The task could end up with a set of packages that does not match the complete
list of
specified packages to install (because dependencies between the downgraded
package and others can cause changes to the packages which were in the earlier
transaction).
[Default: no]
type: bool
version_added: 2.4
- autoremove
If `yes', removes all "leaf" packages from the system that were originally
installed as dependencies of user-installed packages but which are no longer
required
by any such package. Should be used alone or when state is `absent'
NOTE: This feature requires yum >= 3.4.3 (RHEL/CentOS 7+)
[Default: no]
type: bool
version_added: 2.7
- bugfix
If set to `yes', and `state=latest' then only installs updates that have
been marked bugfix related.
[Default: no]
version_added: 2.6
- conf_file
The remote yum configuration file to use for the transaction.
[Default: (null)]
version_added: 0.6
- disable_excludes
Disable the excludes defined in YUM config files.
If set to `all', disables all excludes.
If set to `main', disable excludes defined in [main] in yum.conf.
If set to `repoid', disable excludes defined for given repo id.
[Default: (null)]
version_added: 2.7
RH294-RHEL8.0-es-1-20200501 81
capítulo 3 | Implementación de guías
- disable_gpg_check
Whether to disable the GPG checking of signatures of packages being
installed. Has an effect only if state is `present' or `latest'.
[Default: no]
type: bool
version_added: 1.2
- disable_plugin
`Plugin' name to disable for the install/update operation. The disabled
plugins will not persist beyond the transaction.
[Default: (null)]
version_added: 2.5
- disablerepo
`Repoid' of repositories to disable for the install/update operation.
These repos will not persist beyond the transaction. When specifying multiple
repos,
separate them with a `","'.
As of Ansible 2.7, this can alternatively be a list instead of `","'
separated string
[Default: (null)]
El comando ansible-doc también ofrece la opción -s, la cual genera una salida a modo de
ejemplo, la cual puede servir como modelo de cómo utilizar un módulo particular en una guía. Esta
salida puede servir como plantilla de inicio, la cual se puede incluir en una guía para implementar
el módulo para la ejecución de la tarea. Los comentarios se incluyen en la salida para recordarles a
los administradores el uso de cada opción. En el siguiente ejemplo, se muestra esta salida para el
módulo yum.
82 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Mantenimiento de módulos
Ansible se proporciona con una gran cantidad de módulos que pueden usarse para muchas tareas.
La comunidad creativa es muy activa, y estos módulos pueden estar en diferentes etapas del
desarrollo. Se espera que la documentación de ansible-doc para el módulo especifique quién
realiza el mantenimiento de ese módulo en la comunidad creativa de Ansible y cuál es el estado
de su desarrollo. Esto se indica en la sección METADATA al final de la salida de ansible-doc para
ese módulo.
• stableinterface: las palabras clave del módulo son estables, y se harán todos los esfuerzos
para no eliminar palabras clave ni cambiar su significado.
• preview: el módulo está en la vista previa de tecnología y puede ser inestable; sus palabras
clave pueden cambiar, o puede requerir librerías o servicios web que estén sujetos a cambios
incompatibles.
• removed: el módulo se eliminó de la versión, pero existe un stub con fines de documentación
para ayudar a usuarios anteriores a migrar a nuevos módulos.
nota
El estado stableinterface solo indica que la interfaz de un módulo es estable;
no califica la calidad del código del módulo.
• core: mantenido por los desarrolladores creativos "core" de Ansible e incluido siempre con
Ansible.
La comunidad creativa de Ansible tiene un rastreador de problemas para Ansible y sus módulos
integrados en https://github.com/ansible/ansible/issues.
RH294-RHEL8.0-es-1-20200501 83
capítulo 3 | Implementación de guías
Algunas veces, un módulo no existe para algo que desea hacer. Como usuario final, puede
escribir sus propios módulos privados u obtener módulos de un tercero. Ansible busca módulos
personalizados en la ubicación especificada por la variable del entorno ANSIBLE_LIBRARY o, si
no se estableció, por la palabra clave library en el archivo de configuración de Ansible actual.
Ansible también busca módulos personalizados en el directorio ./library, relacionados con la
guía que se está ejecutando actualmente.
library = /usr/share/my_modules
La información sobre la escritura de módulos va más allá del alcance de este curso. La
documentación sobre cómo hacer esto está disponible en https://docs.ansible.com/ansible/
latest/dev_guide/developing_modules.html.
Importante
Use el comando ansible-doc para buscar módulos y aprender a usarlos para sus
tareas.
De ser posible, intente evitar los módulos command, shell y raw en las guías, por
más simple que parezca su uso. Debido a que estos adoptan comandos arbitrarios,
es muy fácil programar guías no idempotentes con estos módulos.
Por ejemplo, la siguiente tarea que usa el módulo shell no es idempotente. Cada
vez que se ejecuta la reproducción, reescribe /etc/resolv.conf aunque ya
conste de la línea nameserver 192.0.2.1.
Hay varias maneras para escribir tareas que usen el módulo shell de manera
idempotente, y algunas veces, realizar estas modificaciones y usar shell es
el mejor enfoque. Una solución más rápida puede ser usar ansible-doc para
descubrir el módulo copy y usarlo para obtener el efecto deseado.
Las guías idempotentes se pueden ejecutar de manera repetida para garantizar que
los sistemas se encuentren en un estado particular sin interrumpir esos sistemas si
ya lo están.
84 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Comentarios en YAML
Los comentarios también se pueden utilizar para asistir a la capacidad de lectura. En YAML, todo
lo que está a la derecha del número o símbolo numeral (#) es un comentario. Si hay contenido a la
izquierda del comentario, coloque un espacio delante del símbolo numérico.
Cadenas en YAML
Por lo general, no es necesario colocar entre comillas las cadenas en YAML, inclusive si hay
espacios contenidos en la cadena. Puede incluir cadenas entre comillas dobles o comillas simples.
this is a string
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.
include_newlines: |
Example Company
123 Main Street
Atlanta, GA 30303
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. A menudo, este método se usa para dividir cadenas extensas en caracteres
de espacio a fin de que puedan abarcar múltiples líneas para una mejor capacidad de lectura.
fold_newlines: >
This is an example
of a long string,
that will become
a single sentence once folded.
Diccionarios en YAML
Hemos visto recopilaciones de pares de claves-valores escritos como un bloque con sangría, de la
siguiente manera:
RH294-RHEL8.0-es-1-20200501 85
capítulo 3 | Implementación de guías
name: svcrole
svcservice: httpd
svcport: 80
Los diccionarios también pueden escribirse en un formato de bloque en línea entre llaves, de la
siguiente manera:
En la mayoría de los casos, se debe evitar el formato de bloque en línea, ya que es difícil de leer.
Sin embargo, existe al menos una situación en la que se usa más comúnmente. Más adelante
en este curso hablaremos sobre el uso de roles. Cuando una guía incluye una lista de roles,
es más común usar esta sintaxis para facilitar la distinción de los roles que se incluyen en una
reproducción de las variables que se pasan a un rol.
Listas en YAML
También hemos visto listas escritas con la sintaxis normal de un solo guión:
hosts:
- servera
- serverb
- serverc
Las listas también tienen un formato en línea entre corchetes que se ve de la siguiente manera:
tasks:
- name: shorthand form
service: name=httpd enabled=true state=started
tasks:
- name: normal form
service:
name: httpd
enabled: true
state: started
86 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
La forma normal tiene más líneas, pero es más fácil para trabajar. Las palabras clave de la tarea
se apilan verticalmente y son más fáciles de diferenciar. Sus ojos pueden recorrer la reproducción
hacia abajo con menos movimiento de izquierda a derecha. Además, la sintaxis normal es YAML
nativa, mientras que la abreviatura no lo es. Las herramientas de resaltado de sintaxis en editores
de texto modernos pueden ayudarlo de manera más efectiva si usa el formato normal en lugar del
formato abreviado.
Puede encontrar esta sintaxis en documentación y guías anteriores de otras personas, y la sintaxis
aún funciona.
Referencias
Páginas del manual: ansible-playbook(1) y ansible-doc(1)
RH294-RHEL8.0-es-1-20200501 87
capítulo 3 | Implementación de guías
Ejercicio Guiado
Implementación de varias
reproducciones
En este ejercicio, creará una guía que contiene varias reproducciones y, luego, la usará para
realizar tareas de configuración en hosts administrados.
Resultados
Usted deberá ser capaz de construir y ejecutar una guía para gestionar la configuración y
realizar la administración de un host administrado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
---
88 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
1.4. Agregue la siguiente línea para indicar que la reproducción se aplica al host
administrado servera.lab.example.com. Asegúrese de aplicar una sangría de
dos espacios en la línea (y alinearla con la palabra clave name sobre esta) para indicar
que es parte de la primera reproducción.
hosts: servera.lab.example.com
become: yes
1.6. Agregue la siguiente línea para definir el comienzo de la lista tasks. Aplique una
sangría de dos espacios en la línea (y alinearla con las palabras claves sobre esta)
para indicar que es parte de la primera reproducción.
tasks:
2. Como primera tarea en la primera reproducción, defina una tarea que garantice que los
paquetes httpd y firewalld estén actualizados.
Asegúrese de aplicar una sangría de cuatro espacios a la primera línea de la tarea. Bajo la
palabra clave tasks en la primera reproducción, agregue las siguientes líneas.
La primera línea aporta un nombre descriptivo para la tarea. La segunda línea tiene una
sangría de seis espacios e invoca al módulo yum. La siguiente línea tiene una sangría de
ocho espacios y es una palabra clave name. Especifica qué paquetes debe garantizar que
estén actualizados el módulo yum. La palabra clave name del módulo yum (que es diferente
del nombre de la tarea) puede tomar una lista de paquetes, que tienen una sangría de
diez espacios en las dos líneas siguientes. Después de la lista, la palabra clave state con
una sangría de ocho espacios especifica que el módulo yum debe asegurarse de que esté
instalada la versión más reciente de los paquetes.
3. Agregue una tarea a la lista de la primera reproducción que garantice que el contenido
correcto esté en /var/www/html/index.html.
Agregue las siguientes líneas para definir el contenido de /var/www/html/index.html.
Asegúrese de aplicar una sangría de cuatro espacios a la primera línea.
La primera entrada aporta un nombre descriptivo para la tarea. La segunda entrada está
marcada con seis espacios e invoca al módulo copy. Las entradas restantes tienen una
RH294-RHEL8.0-es-1-20200501 89
capítulo 3 | Implementación de guías
sangría de ocho espacios y envían los argumentos necesarios para garantizar que el
contenido correcto esté en la página web.
4. Defina dos tareas más en la reproducción para garantizar que se esté ejecutando el servicio
firewalld y que se iniciará en el arranque, y permita conexiones con el servicio httpd.
4.1. Agregue las siguientes líneas para garantizar que el servicio firewalld esté
habilitado y ejecutándose. Asegúrese de aplicar una sangría de cuatro espacios a la
primera línea.
4.2. Agregue las siguientes líneas para garantizar que firewalld permita conexiones
HTTP desde los sistemas remotos. Asegúrese de aplicar una sangría de cuatro
espacios a la primera línea.
5. Agregue una tarea final a la primera reproducción que garantice que el servicio httpd se
esté ejecutando y que se iniciará en el arranque.
Agregue las siguientes líneas para garantizar que el servicio httpd esté habilitado y
ejecutándose. Asegúrese de aplicar una sangría de cuatro espacios a la primera línea.
La primera entrada aporta un nombre descriptivo para la tarea. La segunda entrada está
marcada con seis espacios e invoca al módulo service. Las entradas restantes están
marcadas con ocho espacios y envían los argumentos necesarios para garantizar que el
servicio httpd esté habilitado y en funcionamiento.
90 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
6.1. Agregue la siguiente línea para definir el comienzo de una segunda reproducción.
Tenga en cuenta que no hay sangría.
6.2. Agregue la siguiente línea para indicar que la reproducción se aplica al host
administrado localhost. Asegúrese de aplicar una sangría de dos espacios a la línea
para indicar que está contenida por la segunda reproducción.
hosts: localhost
become: no
tasks:
7. Agregue una sola tarea a la segunda reproducción y use el módulo uri para solicitar
contenido de http://servera.lab.example.com. La tarea debe verificar un código de
estado HTTP de retorno de 200. Configure la tarea para colocar el contenido devuelto en la
variable de resultados de la tarea.
Agregue las siguientes líneas para crear la tarea a fin de verificar el servicio web del nodo de
control. Asegúrese de aplicar una sangría de cuatro espacios a la primera línea.
La primera línea aporta un nombre descriptivo para la tarea. La segunda línea tiene una
sangría de seis espacios y llama al módulo uri. Las líneas restantes tienen una sangría de
ocho espacios y envían los argumentos necesarios para ejecutar una consulta de contenido
web del nodo de control al host administrado y verifican el código de estado recibido. La
palabra clave return_content garantiza que la respuesta del servidor se agregue a los
resultados de la tarea.
RH294-RHEL8.0-es-1-20200501 91
capítulo 3 | Implementación de guías
---
- name: Enable intranet services
hosts: servera.lab.example.com
become: yes
tasks:
- name: latest version of httpd and firewalld installed
yum:
name:
- httpd
- firewalld
state: latest
playbook: intranet.yml
92 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
10. Ejecute la guía con la opción -v para ver los resultados detallados para cada
tarea. Lea la salida generada para asegurarse de que todas las tareas se hayan
completado satisfactoriamente. Verifique que una solicitud HTTP GET para http://
servera.lab.example.com proporcione el contenido correcto.
Finalizar
En workstation, ejecute el comando lab playbook-multi finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 93
capítulo 3 | Implementación de guías
94 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Trabajo de laboratorio
Implementación de guías
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará y realizará tareas administrativas en hosts
administrados usando una guía.
Resultados
Debería construir y ejecutar una guía para instalar, configurar y verificar el estado de los
servicios web y de las bases de datos en un host administrado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
nota
La guía usada por este trabajo de laboratorio es muy similar a la que escribió en el
ejercicio guiado anterior en este capítulo. Si no desea crear la guía de este trabajo
de laboratorio desde cero, puede usar la guía del ejercicio como punto de partida
para este trabajo de laboratorio.
Si hace esto, tenga cuidado de apuntar a los hosts correctos y cambie las tareas
para que coincidan con las instrucciones para este ejercicio.
RH294-RHEL8.0-es-1-20200501 95
capítulo 3 | Implementación de guías
Evaluación
Evalúe su trabajo ejecutando el comando lab playbook-review grade de su máquina
workstation. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un
resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab playbook-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
96 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Solución
Implementación de guías
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará y realizará tareas administrativas en hosts
administrados usando una guía.
Resultados
Debería construir y ejecutar una guía para instalar, configurar y verificar el estado de los
servicios web y de las bases de datos en un host administrado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
nota
La guía usada por este trabajo de laboratorio es muy similar a la que escribió en el
ejercicio guiado anterior en este capítulo. Si no desea crear la guía de este trabajo
de laboratorio desde cero, puede usar la guía del ejercicio como punto de partida
para este trabajo de laboratorio.
Si hace esto, tenga cuidado de apuntar a los hosts correctos y cambie las tareas
para que coincidan con las instrucciones para este ejercicio.
---
RH294-RHEL8.0-es-1-20200501 97
capítulo 3 | Implementación de guías
1.2. Agregue la siguiente entrada para denotar el comienzo de una reproducción con un
nombre de Enable internet services (Habilitar servicios de internet).
1.3. Agregue la siguiente entrada para indicar que la reproducción se aplica al host
administrado serverb.
hosts: serverb.lab.example.com
become: yes
tasks:
4. Agregue las tareas necesarias para asegurar que los servicios httpd y mariadb estén en los
estados enabled y running.
98 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
5. Agregue las entradas necesarias para definir la tarea final a fin de generar
contenido web para realizar pruebas. Use el módulo get_url para copiar http://
materials.example.com/labs/playbook-review/index.php a /var/www/html/
en el host administrado.
6.1. Agregue la siguiente entrada para denotar el comienzo de una segunda reproducción
con un nombre de Test internet web server (Probar servidor web de Internet).
6.2. Agregue la siguiente entrada para indicar que la reproducción se aplica al host
administrado localhost.
hosts: localhost
6.3. Agregue la siguiente línea después de la palabra clave hosts para deshabilitar el
aumento de privilegios para la segunda reproducción.
become: no
tasks:
7. Agregue una tarea que pruebe el servicio web que se ejecuta en serverb desde el nodo de
control usando el módulo uri. Compruebe si existe un código de estado de retorno de 200.
RH294-RHEL8.0-es-1-20200501 99
capítulo 3 | Implementación de guías
playbook: internet.yml
9. Use el comando ansible-playbook para ejecutar la guía. Lea la salida generada para
garantizar que todas las tareas se hayan completado satisfactoriamente.
100 RH294-RHEL8.0-es-1-20200501
capítulo 3 | Implementación de guías
Evaluación
Evalúe su trabajo ejecutando el comando lab playbook-review grade de su máquina
workstation. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un
resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab playbook-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 101
capítulo 3 | Implementación de guías
Resumen
En este capítulo, aprendió lo siguiente:
• Una reproducción es una lista ordenada de tareas que se ejecutan respecto de hosts
seleccionados de su inventario.
• Una guía es un archivo de texto que contiene una lista de una o más reproducciones para
ejecutar en orden.
• Los archivos YAML están estructurados mediante la sangría de espacio para representar la
jerarquía de datos.
• Las tareas se implementan mediante el código estandarizado incluido como módulos Ansible.
102 RH294-RHEL8.0-es-1-20200501
capítulo 4
Administración de variables y
hechos
Meta Escribir guías que usen variables para simplificar
la administración de la guía y datos para
hacer referencia a información sobre los hosts
administrados.
RH294-RHEL8.0-es-1-20200501 103
capítulo 4 | Administración de variables y hechos
Gestión de variables
Objetivos
Después de completar esta sección, debe ser capaz de crear variables de las guías que afecten a
hosts particulares o grupos de hosts, la reproducción o el entorno global, y hacer referencia a ellas,
y describir cómo funciona la prioridad de variables.
Las variables brindan una forma conveniente de gestionar los valores dinámicos para un entorno
dado en su proyecto Ansible. Los ejemplos de valores que pueden contener las variables incluyen:
Denominación de variables
Los nombres de las variables deben iniciarse con una letra y solo pueden contener letras, números
y guiones bajos.
remote.file remote_file
file1
remoteserver$1 remote_server_1
remote_server1
104 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Definición de variables
Las variables se pueden definir en una variedad de lugares en un proyecto Ansible. No obstante,
esto se puede simplificar en tres niveles de alcance básicos:
• Host scope: variables establecidas en grupos de hosts y hosts individuales por el inventario,
reunión de datos, o tareas registradas
Si el mismo nombre de variable se define en más de un nivel, el nivel con la mayor precedencia
gana. Un alcance más corto tiene prioridad sobre un alcance más amplio: las variables definidas
por el inventario se reemplazan por variables definidas por la guía, las cuales se reemplazan por
variables definidas en la línea de comando.
Variables en guías
Las variables desempeñan un papel importante en Ansible Playbook porque facilitan la
administración de datos variables en una guía.
Las variables de guías se pueden definir de múltiples maneras. Uno de los métodos más comunes
es colocar una variable en un bloque vars al comienzo de una guía:
- hosts: all
vars:
user: joe
home: /home/joe
También es posible definir variables de guías en archivos externos. En este caso, en lugar de usar
el bloque vars en la guía, se puede utilizar la directiva vars_files, seguida de una lista de
nombres para archivos de variables externas, relativos a la ubicación de la guía:
- hosts: all
vars_files:
- vars/users.yml
A continuación, las variables de la guía se definen en ese archivo o los archivos en formato YAML:
user: joe
home: /home/joe
RH294-RHEL8.0-es-1-20200501 105
capítulo 4 | Administración de variables y hechos
vars:
user: joe
tasks:
# This line will read: Creates the user joe
- name: Creates the user {{ user }}
user:
# This line will create the user named Joe
name: "{{ user }}"
Importante
Cuando se utiliza una variable como el primer elemento para iniciar un valor, las
comillas son obligatorias. De esta manera, se evita que Ansible interprete que la
referencia de la variable inicia un diccionario YAML. Si faltan las comillas, aparece el
siguiente mensaje:
yum:
name: {{ service }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
with_items:
- "{{ foo }}"
Una forma de definir las variables de hosts y las variables de grupos es hacerlo directamente en
el archivo de inventario. Este es un enfoque antiguo y no se lo recomienda, pero aún puede ser
detectado.
106 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
[servers]
demo.example.com ansible_user=joe
[servers]
demo1.example.com
demo2.example.com
[servers:vars]
user=joe
• Definición de la variable de grupo user para el grupo servers, que consta de dos grupos de
hosts, cada uno con dos servidores.
[servers1]
demo1.example.com
demo2.example.com
[servers2]
demo3.example.com
demo4.example.com
[servers:children]
servers1
servers2
[servers:vars]
user=joe
Algunas desventajas de este enfoque son que dificulta más el trabajo con el archivo de inventario,
mezcla la información acerca de hosts y variables en el mismo archivo, y usa una sintaxis obsoleta.
Importante
La práctica recomendada es definir las variables de inventario usando los directorios
host_vars y group_vars, y no definirlas directamente en los archivos de
inventario.
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 utilizando la misma sintaxis que en una guía:
user: joe
RH294-RHEL8.0-es-1-20200501 107
capítulo 4 | Administración de variables y hechos
De la misma forma, para definir variables de hosts para un host específico, cree un archivo con un
nombre que coincida con el host que se encuentra en el directorio host_vars para que contenga
las variables de hosts.
Los siguientes ejemplos ilustran este enfoque más detalladamente. Considere una situación en
la que hay dos centros de datos para administrar y los hosts del centro de datos se definen en el
archivo de inventario ~/project/inventory:
[datacenter2]
demo3.example.com
demo4.example.com
[datacenters:children]
datacenter1
datacenter2
• 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:
project
├── ansible.cfg
├── group_vars
108 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
│ ├── datacenters
│ ├── datacenters1
│ └── datacenters2
├── host_vars
│ ├── demo1.example.com
│ ├── demo2.example.com
│ ├── demo3.example.com
│ └── demo4.example.com
├── inventory
└── playbook.yml
Las variables adicionales pueden ser útiles cuando debe reemplazar el valor definido para una
variable para una ejecución única de una guía. Por ejemplo:
user1_first_name: Bob
user1_last_name: Jones
user1_home_dir: /users/bjones
user2_first_name: Anne
user2_last_name: Cook
user2_home_dir: /users/acook
users:
bjones:
first_name: Bob
last_name: Jones
home_dir: /users/bjones
acook:
first_name: Anne
last_name: Cook
home_dir: /users/acook
Luego puede usar las siguientes variables para acceder a los datos del usuario:
RH294-RHEL8.0-es-1-20200501 109
capítulo 4 | Administración de variables y hechos
# Returns 'Bob'
users.bjones.first_name
# Returns '/users/acook'
users.acook.home_dir
Debido a que la variable se define como un diccionario Python, hay disponible una sintaxis
alternativa.
# Returns 'Bob'
users['bjones']['first_name']
# Returns '/users/acook'
users['acook']['home_dir']
Importante
La notación de punto puede causar problemas si los nombres clave son los mismos
que los nombres de los métodos o atributos de Python, como discard, copy, add,
y así sucesivamente. Usar la notación de paréntesis puede ayudar a evitar conflictos
y errores.
Ambas sintaxis son válidas, pero para simplificar la solución de problemas, Red Hat
recomienda usar una sintaxis de manera consistente en todos los archivos en
cualquier proyecto de Ansible.
---
- name: Installs a package and prints the result
hosts: all
tasks:
- name: Install the package
yum:
name: httpd
state: installed
register: install_result
- debug: var=install_result
Cuando se ejecuta la guía, el módulo debug se usa para volcar el valor de la variable registrada
install_result en el terminal.
110 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Referencias
Inventario — Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
RH294-RHEL8.0-es-1-20200501 111
capítulo 4 | Administración de variables y hechos
Ejercicio Guiado
Gestión de variables
En este ejercicio, definirá y usará variables en una guía.
Resultados
Deberá poder realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
2. Durante los siguientes varios pasos, usted creará una guía que instale el servidor web
Apache y abra los puertos para que se pueda acceder al servicio. La guía consulta al
servidor web para garantizar que se esté ejecutando.
Cree la guía playbook.yml y defina las siguientes variables en la sección vars:
Variables
Variable Descripción
112 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
---
- name: Deploy and start Apache HTTPD service
hosts: webserver
vars:
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
python_pkg: python3-PyMySQL
rule: http
3. Cree el bloque tasks y cree la primera tarea, que debería usar el módulo yum para
garantizar que estén instaladas las versiones más recientes de los paquetes requeridos.
tasks:
- name: Required packages are installed and up to date
yum:
name:
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
- "{{ python_pkg }}"
state: latest
nota
Puedes usar ansible-doc yum para revisar la sintaxis del módulo yum. La sintaxis
muestra que su directiva name puede tomar una lista de paquetes con los que debe
trabajar el módulo, de modo que no necesita tareas separadas para garantizar que
cada paquete esté actualizado.
4. Cree dos tareas para asegurarse de que los servicios httpd y firewalld estén iniciados y
habilitados.
RH294-RHEL8.0-es-1-20200501 113
capítulo 4 | Administración de variables y hechos
service:
name: "{{ web_service }}"
enabled: true
state: started
nota
El módulo service funciona de manera diferente que el módulo yum, según se
documenta en ansible-doc service. Su directiva name toma el nombre de
exactamente un servicio con el cual trabajar.
Puede escribir una sola tarea que garantice que ambos servicios se inicien y se
habiliten, usando la palabra clave loop que se verá más adelante en este curso.
5. Agregue una tarea que garantice que exista contenido específico en el archivo /var/www/
html/index.html.
6. Agregue una tarea que utilice el módulo firewalld para garantizar que los puertos de
firewall estén abiertos para el servicio firewalld mencionado en la variable rule.
7. Cree una nueva reproducción que consulte el servicio web para garantizar que todo se haya
configurado correctamente. Debe ejecutarse en localhost. Debido a esto, Ansible no
debe cambiar la identidad; por lo tanto, establezca el módulo become en false. Puede
usar el módulo uri para verificar una URL. Para esta tarea, verifique el código de estado
de 200 para confirmar que el servidor web en servera.lab.example.com se esté
ejecutando y esté configurado adecuadamente.
114 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
8. Cuando se complete, la guía debe verse de la siguiente forma. Revise la guía y confirme que
ambas reproducciones sean correctas.
---
- name: Deploy and start Apache HTTPD service
hosts: webserver
vars:
web_pkg: httpd
firewall_pkg: firewalld
web_service: httpd
firewall_service: firewalld
python_pkg: python3-PyMySQL
rule: http
tasks:
- name: Required packages are installed and up to date
yum:
name:
- "{{ web_pkg }}"
- "{{ firewall_pkg }}"
- "{{ python_pkg }}"
state: latest
RH294-RHEL8.0-es-1-20200501 115
capítulo 4 | Administración de variables y hechos
playbook: playbook.yml
10. Use el comando ansible-playbook para ejecutar la guía. Observe la salida a medida que
Ansible instala los paquetes, inicia y habilita los servicios, y garantiza que el servidor web
esté disponible.
116 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Finalizar
En workstation, ejecute el script lab data-variables finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 117
capítulo 4 | Administración de variables y hechos
Gestión de secretos
Objetivos
Después de completar esta sección, debe ser capaz de cifrar las variables confidenciales usando
Ansible Vault y ejecutar guías que hagan referencia a archivos de variables cifradas por Vault.
Se puede utilizar Ansible Vault, que está incluido con Ansible, para cifrar y descifrar cualquier
archivo de datos estructurados utilizado por Ansible. Para usar Ansible Vault, se usa una
herramienta de la línea de comandos denominada ansible-vault para crear, editar, cifrar,
descifrar y ver archivos. Ansible Vault puede cifrar cualquier archivo de datos estructurado usado
por Ansible. Esto podría incluir variables de inventario, archivos de variables incluidos en una guía,
archivos de variables pasados como argumento al ejecutar la guía o variables definidas en roles de
Ansible.
Importante
Ansible Vault no implementa sus propias funciones criptográficas, sino que
utiliza un kit de herramientas Python externo. Los archivos están protegidos con
cifrado simétrico mediante el uso de AES256 con una contraseña como clave
secreta. Tenga en cuenta que la forma en la que se realiza esto no ha sido auditado
formalmente por un tercero.
118 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
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.
nota
El subcomando edit siempre reescribe el archivo, de modo que solo debería
usarse al hacer cambios. Esto puede tener implicancias cuando el archivo se guarda
en control de versiones. El subcomando view debe usarse siempre para ver el
contenido del archivo sin hacer cambios.
Use la opción --output=OUTPUT_FILE para guardar el archivo cifrado con un nombre nuevo
Solo puede usar un archivo de entrada con la opción --output.
RH294-RHEL8.0-es-1-20200501 119
capítulo 4 | Administración de variables y hechos
Para proporcionar la contraseña de Vault para la guía, use la opción --vault-id. Por ejemplo,
para proporcionar la contraseña de Vault de forma interactiva, use --vault-id @prompt como
se ilustra en el siguiente ejemplo:
120 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Importante
Si está utilizando una versión de Ansible anterior a la versión 2.4, debe usar la
opción--ask-vault-pass para proporcionar la contraseña de Vault de forma
interactiva. Todavía puede usar esta opción si todos los archivos cifrados con Vault
utilizados por la guía se cifraron con la misma contraseña.
Importante
Comenzando con Ansible 2. 4, puede usar múltiples contraseñas de Ansible
Vault con ansible-playbook. Para usar múltiples contraseñas, pase múltiples
opciones --vault-id o --vault-password-file para el comando ansible-
playbook.
Las identificaciones de Vault one y two anteriores a @prompt pueden ser cualquier
cosa e incluso puede omitirlas por completo. Sin embargo, si usa la opción --
vault-id id cuando cifra un archivo con el comando ansible-vault, cuando
se ejecuta ansible-playbook, la contraseña para el ID coincidente se prueba
antes que cualquier otra. Si no coincide, las otras contraseñas que proporcionó
se intentarán a continuación. El ID de Vault @prompt sin ID es en realidad la
abreviatura para default@prompt, lo que significa solicitar la contraseña para el ID
de Vault default.
RH294-RHEL8.0-es-1-20200501 121
capítulo 4 | Administración de variables y hechos
Recuerde que la manera preferida para administrar las variables del grupo y las variables del host
es crear directorios en el nivel de la guía. El directorio group_vars, generalmente, contiene
archivos de variables con nombres que coinciden con los grupos de hosts a los que se aplican. El
directorio host_vars, generalmente, contiene archivos de variables con nombres que coinciden
con los nombres de host de los hosts administrados a los que se aplican.
Sin embargo, en lugar de usar archivos en group_vars o host_vars, puede usar directories
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. Por
ejemplo, en el siguiente directorio de proyecto para playbook.yml, los miembros del grupo
de hosts webservers usan variables en el archivo group_vars/webservers/vars,
y demo.example.com usa las variables en host_vars/demo.example.com/vars y
host_vars/demo.example.com/vault:
.
├── ansible.cfg
├── group_vars
│ └── webservers
│ └── vars
├── host_vars
│ └── demo.example.com
│ ├── vars
│ └── vault
├── inventory
└── playbook.yml
En este escenario, la ventaja es que la mayor parte de las variables para demo.example.com
pueden ubicarse en el archivo vars, pero las variables confidenciales pueden mantenerse en
secreto colocándolas por separado en el archivo vault. Luego, el administrador puede usar
ansible-vault para cifrar el archivo vault, y a la vez dejar el archivo vars como texto sin
formato.
No hay nada especial acerca de los nombres de archivos que se usan en este ejemplo dentro
del directorio host_vars/demo.example.com. Ese directorio podría contener más archivos,
algunos cifrados por Ansible Vault y otros no.
Las variables de guías (en oposición a las variables de inventario) también se pueden proteger con
Ansible Vault. Las variables de guías confidenciales se pueden colocar en un archivo separado que
se cifra con Ansible Vault y que se incluye en la guía mediante una directiva vars_files. Esto
puede ser útil, ya que las variables de la guía tienen precedencia sobre las variables de inventario.
Si está usando varias contraseñas de Vault con su guía, asegúrese de que a cada archivo cifrado se
le asigne un ID de Vault y que ingrese la contraseña correspondiente con ese ID de Vault cuando
ejecute la guía. Esto garantiza que la contraseña correcta se seleccione primero al descifrar el
archivo cifrado con Vault, que es más rápido que forzar a Ansible a probar todas las contraseñas de
Vault que proporcionó hasta que encuentre la correcta.
122 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Referencias
Páginas del manual: ansible-playbook(1) y ansible-vault(1)
RH294-RHEL8.0-es-1-20200501 123
capítulo 4 | Administración de variables y hechos
Ejercicio Guiado
Gestión de secretos
En este ejercicio, cifrará las variables confidenciales con Ansible Vault para protegerlas y
luego ejecutará una guía que utiliza esas variables.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
2. Edite el contenido del archivo cifrado proporcionado, secret.yml . El archivo puede ser
descifrado usando redhat como contraseña. Elimine los comentarios de las entradas con
variables username y pwhash.
2.2. Quite las marcas de comentarios de las dos entradas de variables; luego, guarde el
archivo y salga del editor. Deben aparecer como se muestra a continuación:
username: ansibleuser1
pwhash: $6$jf...uxhP1
124 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
---
- name: create user accounts for all our servers
hosts: devservers
become: True
remote_user: devops
vars_files:
- secret.yml
tasks:
- name: Creating user from secret.yml
user:
name: "{{ username }}"
password: "{{ pwhash }}"
playbook: create_users.yml
nota
En lugar de usar --ask-vault-pass, puede usar la opción --vault-id
@prompt más nueva para hacer lo mismo.
RH294-RHEL8.0-es-1-20200501 125
capítulo 4 | Administración de variables y hechos
Finalizar
En workstation, ejecute el script lab data-secret finish para limpiar este ejercicio.
126 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Gestión de datos
Objetivos
Después de completar esta sección, debe ser capaz de hacer referencia a los datos sobre
hosts administrados que usan datos de Ansible y configurar datos personalizados en hosts
administrados.
Algunos de los datos recopilados para un host administrado pueden incluir los siguientes:
• Las direcciones IP
• La cantidad de CPU
Los datos son una forma conveniente de recuperar el estado de un host administrado y de
determinar qué acción tomar en función de ese estado. Por ejemplo:
• Un servidor puede reiniciarse mediante una tarea condicional que se ejecuta sobre la base de un
dato que contiene la versión del kernel actual del host administrado.
• La dirección IPv4 usada en un archivo de configuración puede configurarse sobre la base del
valor de un dato.
En general, todas las reproducciones ejecutan el módulo setup de forma automática entes
de la primera tarea para recopilar datos. Esto se informa como la tarea Gathering Facts
en Ansible 2.3 y versiones posteriores o simplemente como setup en versiones anteriores de
Ansible. De forma predeterminada, no es necesario tener una tarea para ejecutar setup en la
reproducción. En general, se ejecuta automáticamente para usted.
Una forma de ver qué datos se recopilan para sus hosts administrados es ejecutar una guía corta
que recopile datos y use el módulo debug para imprimir el valor de la variable ansible_facts.
RH294-RHEL8.0-es-1-20200501 127
capítulo 4 | Administración de variables y hechos
En la siguiente tabla, se muestran algunos de los datos que pueden recopilarse de un nodo
administrado y que pueden ser útiles en una guía:
128 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Dato Variable
Tamaño de la ansible_facts['devices']['vda']['partitions']
partición de disco / ['vda1']['size']
dev/vda1
nota
Recuerde que cuando el valor de una variable es un diccionario/hash, hay dos
sintaxis que pueden usarse para recuperar el valor. Para tomar dos ejemplos de la
tabla anterior:
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:
---
- hosts: all
tasks:
- name: Prints various Ansible facts
debug:
msg: >
The default IPv4 address of {{ ansible_facts.fqdn }}
is {{ ansible_facts.default_ipv4.address }}
RH294-RHEL8.0-es-1-20200501 129
capítulo 4 | Administración de variables y hechos
En el siguiente resultado, se muestra cómo Ansible consiguió consultar el nodo gestionado y usar
de manera dinámica la información del sistema para actualizar la variable. Los datos también se
pueden usar para crear grupos de hosts dinámicos que combinen criterios en particular.
Muchas guías más antiguas aún utilizan datos inyectados como variables en lugar de la nueva
sintaxis que se encuentra en el espacio de nombres debajo de la variable ansible_facts. Puede
utilizar un comando ad hoc para ejecutar el módulo setup para imprimir el valor de todos los
datos en este formulario. En el siguiente ejemplo, se usa un comando ad hoc para ejecutar el
módulo setup en el host administrado demo1.example.com:
130 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
"root": "UUID=2460ab6e-e869-4011-acae-31b2e8c05a3b"
}
...output omitted...
ansible_facts['hostname'] ansible_hostname
ansible_facts['fqdn'] ansible_fqdn
ansible_facts['default_ipv4'] ansible_default_ipv4['address']
['address']
ansible_facts['interfaces'] ansible_interfaces
ansible_facts['devices']['vda'] ansible_devices['vda']
['partitions']['vda1']['size'] ['partitions']['vda1']['size']
ansible_facts['dns'] ansible_dns['nameservers']
['nameservers']
ansible_facts['kernel'] ansible_kernel
Importante
Actualmente, Ansible reconoce tanto el nuevo sistema de denominación de datos
(usando ansible_facts) como el antiguo sistema de denominación de “datos
inyectados como variables separadas”, anterior a la versión 2.5.
...output omitted...
TASK [Show me the facts] *************************************************
fatal: [demo.example.com]: FAILED! => {"msg": "The task includes an option
with an undefined variable. The error was: 'ansible_distribution' is
undefined\n\nThe error appears to have been in
'/home/student/demo/playbook.yml': line 5, column 7, but may\nbe elsewhere in
the file depending on the exact syntax problem.\n\nThe offending line appears
to be:\n\n tasks:\n - name: Show me the facts\n ^ here\n"}
...output omitted...
RH294-RHEL8.0-es-1-20200501 131
capítulo 4 | Administración de variables y hechos
Para deshabilitar la recopilación de datos para una reproducción, establezca la palabra clave
gather_facts en no:
---
- name: This play gathers no facts automatically
hosts: large_farm
gather_facts: no
Aun si se establece gather_facts: no para una reproducción, puede recopilar datos de forma
manual en cualquier momento mediante la ejecución de una tarea que use el módulo setup:
tasks:
- name: Manually gather facts
setup:
...output omitted...
Los datos personalizados pueden definirse en un archivo estático y formatearse como un archivo
INI o con JSON. También pueden ser scripts ejecutables que generen una salida JSON, como un
script de inventario dinámico.
Los datos personalizados permiten a los administradores definir determinados valores para
hosts administrados, qué reproducciones pueden usar para completar archivos de configuración
o ejecutar tareas de forma condicional. Los datos personalizados dinámicos permiten que
los valores para estos datos se determinen de manera programática, o incluso qué datos se
suministran, cuando se ejecuta la reproducción.
132 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
[packages]
web_package = httpd
db_package = mariadb-server
[users]
user1 = joe
user2 = jane
Los mismos datos podrían proveerse en formato JSON. Los siguientes datos JSON son
equivalentes a los datos especificados por el formato INI en el ejemplo anterior. Los datos JSON
podrían almacenarse en un archivo de texto estático o imprimirse en una salida estándar mediante
un script ejecutable:
{
"packages": {
"web_package": "httpd",
"db_package": "mariadb-server"
},
"users": {
"user1": "joe",
"user2": "jane"
}
}
nota
Los archivos de datos personalizados no pueden tener formato YAML como una
guía. El formato JSON es el equivalente más cercano.
Puede inspeccionar la estructura de sus datos personalizados mediante la ejecución del módulo
setup en los hosts administrados con un comando ad hoc.
RH294-RHEL8.0-es-1-20200501 133
capítulo 4 | Administración de variables y hechos
}
}
},
...output omitted...
},
"changed": false
}
Los datos personalizados pueden usarse de la misma manera que los datos predeterminados en
las guías:
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.
134 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
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.
También existe una serie de otras “variables mágicas”. Para obtener más información, consulte
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-
precedence-where-should-i-put-a-variable. Una manera de obtener información sobre sus
valores es usar el módulo debug para informar sobre el contenido de la variable hostvars para
un host específico:
RH294-RHEL8.0-es-1-20200501 135
capítulo 4 | Administración de variables y hechos
Referencias
setup - Reúne los datos acerca de los hosts remotos — Documentación Ansible
https://docs.ansible.com/ansible/latest/modules/setup_module.html
136 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Ejercicio Guiado
Gestión de datos
En este ejercicio, recopilará datos Ansible de un host administrado y los usará en las
reproducciones.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
RH294-RHEL8.0-es-1-20200501 137
capítulo 4 | Administración de variables y hechos
[general]
package = httpd
service = httpd
state = started
enabled = true
---
- name: Install remote facts
hosts: webserver
vars:
remote_dir: /etc/ansible/facts.d
facts_file: custom.fact
tasks:
- name: Create the remote directory
file:
state: directory
recurse: yes
path: "{{ remote_dir }}"
- name: Install the new facts
copy:
src: "{{ facts_file }}"
dest: "{{ remote_dir }}"
playbook: setup_facts.yml
138 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
8. Ahora es posible crear la guía principal que usa los datos personalizados y del usuario para
configurar servera. Durante los próximos varios pasos, los agregará al archivo de la guía.
Cree la guía playbook.yml con lo siguiente:
---
- name: Install Apache and starts the service
hosts: webserver
tasks:
- name: Install the required package
yum:
name: "{{ ansible_facts['ansible_local']['custom']['general']
['package'] }}"
state: latest
10. Cree otra tarea que usa el dato personalizado para iniciar el servicio httpd.
RH294-RHEL8.0-es-1-20200501 139
capítulo 4 | Administración de variables y hechos
11. Al completarse con todas las tareas, la guía completa debe verse de la siguiente forma.
Revise la guía y garantice que todas las tareas estén definidas.
---
- name: Install Apache and starts the service
hosts: webserver
tasks:
- name: Install the required package
yum:
name: "{{ ansible_facts['ansible_local']['custom']['general']
['package'] }}"
state: latest
12. Antes de ejecutar la guía, use un comando ad hoc para verificar que el servicio httpd no se
ejecute actualmente en servera.
playbook: playbook.yml
14. Con el comando ansible-playbook, ejecute la guía. Observe la salida a medida que
Ansible instala el paquete y, luego, habilite el servicio.
140 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
15. Use un comando ad hoc para ejecutar systemctl a fin de determinar si el servicio httpd
se está ejecutando en servera.
Finalizar
En workstation, ejecute el script lab data-facts finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 141
capítulo 4 | Administración de variables y hechos
Trabajo de laboratorio
Resultados
Debe ser capaz de definir variables y usar datos en una guía, así como usar variables
definidas en un archivo cifrado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
142 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Variables
Variable Valores
firewall_pkg firewalld
firewall_svc firewalld
web_pkg httpd
web_svc httpd
ssl_pkg mod_ssl
httpdconf_src files/httpd.conf
httpdconf_dest /etc/httpd/conf/httpd.conf
htaccess_src files/.htaccess
secrets_dir /etc/httpd/secrets
secrets_src files/htpasswd
web_root /var/www/html
2. Agregue una sección tasks a la reproducción. Escriba una tarea que garantice que esté
instalada la última versión de los paquetes necesarios. Estos paquetes están definidos por las
variables firewall_pkg, web_pkg y ssl_pkg.
3. Agregue una segunda tarea a la guía que garantice que el archivo especificado por la variable
httpdconf_src ha sido copiado (con el módulo copy) en la ubicación especificada por
la variable httpdconf_dest en el host administrado. El archivo debe ser propiedad del
usuario root y el grupo root. También establece 0644 como los permisos de archivo.
4. Agregue una tercera tarea que use el módulo file para crear el directorio especificado por
la variable secrets_dir en el host administrado. Este directorio contiene los archivos de
contraseña utilizados para la autenticación básica de los servicios web. El archivo debe ser
propiedad del usuario apache y el grupo apache. Establezca 0500 como los permisos de
archivo.
5. Agregue una cuarta tarea que use el módulo copy para colocar un archivo htpasswd que
se usará para la autenticación básica de los usuarios web. El origen debe estar definido por
la variable secrets_src. El destino debe estar definido por la variable secrets_dest.
El archivo debe ser propiedad del usuario y el grupo apache. Establezca 0400 como los
permisos de archivo.
6. Agregue una quinta tarea que use el módulo copy para crear un archivo .htaccess en el
directorio raíz del documento del servidor web. Copie el archivo especificado por la variable
htaccess_src en {{web_root}}/.htaccess. El archivo debe ser propiedad del usuario
apache y el grupo apache. Establezca 0400 como los permisos de archivo.
7. Agregue una tercera tarea que use el módulo copy para crear el archivo de contenido
web index.html en el directorio especificado por la variable web_root. El archivo
debe contener el mensaje “HOSTNAME (IPADDRESS) has been customized by Ansible”
RH294-RHEL8.0-es-1-20200501 143
capítulo 4 | Administración de variables y hechos
Evaluación
En workstation, ejecute el comando lab data-review grade para confirmar que ha realizado
correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta
obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el comando lab data-review finish para limpiar este ejercicio.
144 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Solución
Resultados
Debe ser capaz de definir variables y usar datos en una guía, así como usar variables
definidas en un archivo cifrado.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
RH294-RHEL8.0-es-1-20200501 145
capítulo 4 | Administración de variables y hechos
Variables
Variable Valores
firewall_pkg firewalld
firewall_svc firewalld
web_pkg httpd
web_svc httpd
ssl_pkg mod_ssl
httpdconf_src files/httpd.conf
httpdconf_dest /etc/httpd/conf/httpd.conf
htaccess_src files/.htaccess
secrets_dir /etc/httpd/secrets
secrets_src files/htpasswd
web_root /var/www/html
1.2. Cree el archivo de guía playbook.yml y edítelo en un editor de texto. El inicio del
archivo debe aparecer de la siguiente manera:
---
- name: install and configure webserver with basic auth
hosts: webserver
vars:
firewall_pkg: firewalld
firewall_svc: firewalld
web_pkg: httpd
web_svc: httpd
ssl_pkg: mod_ssl
httpdconf_src: files/httpd.conf
httpdconf_dest: /etc/httpd/conf/httpd.conf
htaccess_src: files/.htaccess
secrets_dir: /etc/httpd/secrets
secrets_src: files/htpasswd
secrets_dest: "{{ secrets_dir }}/htpasswd"
web_root: /var/www/html
146 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
2. Agregue una sección tasks a la reproducción. Escriba una tarea que garantice que esté
instalada la última versión de los paquetes necesarios. Estos paquetes están definidos por las
variables firewall_pkg, web_pkg y ssl_pkg.
tasks:
2.2. Agregue las siguientes líneas a la guía para definir una tarea que utilice el módulo yum
para instalar los paquetes necesarios.
3. Agregue una segunda tarea a la guía que garantice que el archivo especificado por la variable
httpdconf_src ha sido copiado (con el módulo copy) en la ubicación especificada por
la variable httpdconf_dest en el host administrado. El archivo debe ser propiedad del
usuario root y el grupo root. También establece 0644 como los permisos de archivo.
Agregue las siguientes líneas a la guía para definir una tarea que usa el módulo copy para
copiar el contenido del archivo definido por la variable httpdconf_src en la ubicación
especificada por la variable httpdconf_dest.
4. Agregue una tercera tarea que use el módulo file para crear el directorio especificado por
la variable secrets_dir en el host administrado. Este directorio contiene los archivos de
contraseña utilizados para la autenticación básica de los servicios web. El archivo debe ser
propiedad del usuario apache y el grupo apache. Establezca 0500 como los permisos de
archivo.
Agregue las siguientes líneas a la guía para definir una tarea que use el módulo file para
crear el directorio definido por la variable secrets_dir.
5. Agregue una cuarta tarea que use el módulo copy para colocar un archivo htpasswd que
se usará para la autenticación básica de los usuarios web. El origen debe estar definido por
RH294-RHEL8.0-es-1-20200501 147
capítulo 4 | Administración de variables y hechos
6. Agregue una quinta tarea que use el módulo copy para crear un archivo .htaccess en el
directorio raíz del documento del servidor web. Copie el archivo especificado por la variable
htaccess_src en {{web_root}}/.htaccess. El archivo debe ser propiedad del usuario
apache y el grupo apache. Establezca 0400 como los permisos de archivo.
Agregue las siguientes líneas a la guía para definir una tarea que utilice el módulo copy para
crear el archivo .htaccess definido por la variable htaccess_src.
7. Agregue una tercera tarea que use el módulo copy para crear el archivo de contenido
web index.html en el directorio especificado por la variable web_root. El archivo
debe contener el mensaje “HOSTNAME (IPADDRESS) has been customized by Ansible”
(HOSTNAME [IPADDRESS] ha sido personalizado por Ansible), donde HOSTNAME es el
nombre de host calificado completo del host administrado e IPADDRESS es su dirección IP
IPv4. Use la opción content para el módulo copy para especificar el contenido del archivo y
los datos de Ansible para especificar el nombre de host y la dirección IP.
Agregue las siguientes líneas a la guía para definir una tarea que utilice el módulo
copy para crear el archivo index.html en el directorio definido por la variable
web_root. Rellene el archivo con el contenido especificado usando los datos de Ansible
ansible_facts['fqdn'] y ansible_facts['default_ipv4']['address']
recuperados del host administrado.
148 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
8. Agregue una séptima tarea que use el módulo service para habilitar e iniciar el servicio de
firewall en el host administrado.
Agregue las siguientes líneas a la guía para definir una tarea que use el módulo service para
habilitar e iniciar el servicio de firewall.
9. Agregue una octava tarea que use el modulo firewalld para permitir el servicio https
necesario para que los usuarios accedan a servicios web en el host administrado. Este cambio
de firewall debe ser permanente y debe tener lugar inmediatamente.
Agregue las siguientes líneas a la guía para definir una tarea que use el módulo firewalld
para abrir el puerto HTTPS para el servicio web.
10. Agregue una tarea final que use el módulo service para habilitar e iniciar el servicio web
en el host administrado para que todos los cambios de configuración se hagan efectivos. El
nombre del servicio web está definido por la variable web_svc.
11. Defina una segunda reproducción destinada a localhost que probará la autenticación
en el servidor web. No necesita aumento de privilegios. Defina una variable denominada
web_user con el valor guest.
11.1. Agregue la siguiente línea para definir el comienzo de una segunda reproducción.
Tenga en cuenta que no hay sangría.
11.2. Agregue la siguiente línea para indicar que la reproducción se aplica al host
administrado localhost.
hosts: localhost
become: no
RH294-RHEL8.0-es-1-20200501 149
capítulo 4 | Administración de variables y hechos
11.4. Agregue las siguientes líneas para definir una lista de variables y la variable web_user.
vars:
web_user: guest
12. Agregue una directiva a la reproducción que agregue variables adicionales de un archivo de
variables llamado vars/secret.yml. Este archivo contiene una variable que especifica la
contraseña para el usuario web. Creará este archivo más adelante en el trabajo de laboratorio.
Defina el inicio de la lista de tareas.
12.1. Con la palabra clave vars_files, agregue las siguientes líneas a la guía para indicar
a Ansible que use las variables que se encuentran en el archivo de variables vars/
secret.yml.
vars_files:
- vars/secret.yml
tasks:
13.1. Agregue las siguientes líneas para crear la tarea a fin de verificar el servicio web del
nodo de control. Asegúrese de aplicar una sangría de cuatro espacios a la primera línea.
13.2. Cree la segunda tarea usando el módulo de depuración. El contenido devuelto desde el
servidor web se agrega a la variable registrada como la clave content.
- debug:
var: auth_test.content
150 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
---
- name: install and configure webserver with basic auth
hosts: webserver
vars:
firewall_pkg: firewalld
firewall_svc: firewalld
web_pkg: httpd
web_svc: httpd
ssl_pkg: mod_ssl
httpdconf_src: files/httpd.conf
httpdconf_dest: /etc/httpd/conf/httpd.conf
htaccess_src: files/.htaccess
secrets_dir: /etc/httpd/secrets
secrets_src: files/htpasswd
secrets_dest: "{{ secrets_dir }}/htpasswd"
web_root: /var/www/html
tasks:
- name: latest version of necessary packages installed
yum:
name:
- "{{ firewall_pkg }}"
- "{{ web_pkg }}"
- "{{ ssl_pkg }}"
state: latest
RH294-RHEL8.0-es-1-20200501 151
capítulo 4 | Administración de variables y hechos
owner: apache
group: apache
mode: 0400
- debug:
var: auth_test.content
14. Cree un archivo cifrado con Ansible Vault, llamado vars/secret.yml. Debe establecer la
variable web_pass a redhat, que será la contraseña del usuario web.
152 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
web_pass: redhat
15. Ejecute la guía playbook.yml. Verifique que el contenido se haya devuelto correctamente
desde el servidor web y que coincida con lo que se configuró en una tarea anterior.
playbook: playbook.yml
...output omitted...
RH294-RHEL8.0-es-1-20200501 153
capítulo 4 | Administración de variables y hechos
Evaluación
En workstation, ejecute el comando lab data-review grade para confirmar que ha realizado
correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script hasta
obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el comando lab data-review finish para limpiar este ejercicio.
154 RH294-RHEL8.0-es-1-20200501
capítulo 4 | Administración de variables y hechos
Resumen
En este capítulo, aprendió lo siguiente:
• Las variables de Ansible permiten a los administradores reutilizar valores en los archivos de un
proyecto completo de Ansible.
• Las variables se pueden definir para los hosts y los grupos de hosts en el archivo de inventario.
• Las variables se pueden definir para las guías usando datos y archivos externos. También se
pueden definir en la línea de comando.
• La palabra clave register se puede usar para capturar la salida de un comando en una
variable.
• Ansible Vault es una manera de proteger los datos confidenciales, como los hash de contraseñas
y las claves privadas para la implementación, con Ansible Playbook.
• Los datos de Ansible son variables automáticamente descubiertas por Ansible desde un host
administrado.
RH294-RHEL8.0-es-1-20200501 155
156 RH294-RHEL8.0-es-1-20200501
capítulo 5
RH294-RHEL8.0-es-1-20200501 157
capítulo 5 | Implementación del control de tareas
Objetivos
Después de completar esta sección, debe ser capaz de usar bucles para escribir tareas eficientes y
usar condiciones para controlar cuándo ejecutar tareas.
Ansible admite la iteración de una tarea sobre un conjunto de elementos utilizando la palabra clave
loop. Puede configurar los bucles para que repitan una tarea con cada elemento en una lista, el
contenido de cada uno de los archivos en una lista, una secuencia de números generada o con
estructuras más complicadas. En esta sección, se cubren bucles simples que iteran sobre una lista
de elementos. Consulte la documentación para ver escenarios de bucle más avanzados.
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.
Considere el siguiente fragmento que usa el módulo service dos veces para garantizar que se
estén ejecutando dos servicios de red:
Estas dos tareas pueden reescribirse para usar un bucle simple, de modo que se necesita solo una
tarea para garantizar que se ejecuten ambos servicios:
158 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
La lista usada por loop puede ser provista por una variable. En el siguiente ejemplo, la variable
mail_services contiene la lista de servicios que se deben ejecutar.
vars:
mail_services:
- postfix
- dovecot
tasks:
- name: Postfix and Dovecot are running
service:
name: "{{ item }}"
state: started
loop: "{{ mail_services }}"
El resultado de la tarea anterior es que el usuario jane está presente y es un miembro del grupo
wheel, y el usuario joe está presente y es un miembro del grupo root.
RH294-RHEL8.0-es-1-20200501 159
capítulo 5 | Implementación del control de tareas
with_items Se comporta igual que la palabra clave loop para listas simples,
como una lista de cadenas o una lista de hashes/dictionarios.
A diferencia de loop, si se proporcionan listas de listas a
with_items, se aplanan en una lista de nivel simple. La variable
de bucle item contiene el elemento de lista usado durante cada
iteración.
vars:
data:
- user0
- user1
- user2
tasks:
- name: "with_items"
debug:
msg: "{{ item }}"
with_items: "{{ data }}"
Importante
Desde Ansible 2.5, la forma recomendada de escribir bucles es usar la palabra clave
loop.
Cualquier tarea que use la sintaxis antigua se puede convertir para usar loop conjuntamente con
filtros Ansible. No necesita saber cómo usar los filtros Ansible para hacer esto. Hay una buena
referencia sobre cómo convertir los bucles antiguos a la nueva sintaxis, así como ejemplos de
cómo realizar un bucle sobre los ítems que no son listas simples, en la documentación de Ansible,
en la sección Migración de with_X a bucle [https://docs.ansible.com/ansible/latest/user_guide/
playbooks_loops.html#migrating-from-with-x-to-loop] de la Guía del usuario Ansible.
Es probable que encuentre tareas de guías más antiguas que contienen palabras clave with_*.
160 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Las técnicas avanzadas de bucle están fuera del alcance de este curso. Todas las tareas de
iteración en este curso se pueden implementar ya sea con la palabra clave with_items o loop.
RH294-RHEL8.0-es-1-20200501 161
capítulo 5 | Implementación del control de tareas
En lo anterior, la clave results contiene una lista. A continuación, la guía se modifica de modo
que la segunda tarea itera en esta lista:
162 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
- two
register: echo_results
Los condicionales permiten que los administradores diferencien entre hosts administrados y les
asignen roles funcionales según las condiciones que cumplen. Las variables de la guía, las variables
registradas y los datos de Ansible se pueden probar con condicionales. Los operadores para
comparar cadenas, datos numéricos y valores booleanos están disponibles.
• La salida de un comando puede ser capturada y evaluada por Ansible para determinar si se
completó una tarea antes de tomar otras medidas. Por ejemplo, si falla un programa, se omite un
lote.
• Utilice los datos de Ansible para determinar la configuración de la red del host administrado y
decida qué archivo de plantilla enviar (por ejemplo, unificación o enlace troncal de red).
• El número de CPU se puede evaluar para determinar cómo ajustar adecuadamente un servidor
web.
• Compare una variable registrada con una variable predefinida para determinar si un servicio
cambió. Por ejemplo, pruebe la suma de comprobación MD5 de un archivo de configuración de
servicio para ver si se modifica el servicio.
RH294-RHEL8.0-es-1-20200501 163
capítulo 5 | Implementación del control de tareas
Una de las condiciones más simples que pueden probarse es si una variable booleana es
verdadera o falsa. El enunciado when en el siguiente ejemplo hace que la tarea se ejecute solo si
run_my_task es verdadero:
---
- name: Simple Boolean Task Demo
hosts: all
vars:
run_my_task: true
tasks:
- name: httpd package is installed
yum:
name: httpd
when: run_my_task
El siguiente ejemplo es un poco más sofisticado y prueba si la variable my_service tiene un valor.
Si lo hace, el valor de my_service se usa como nombre del paquete para instalar. Si la variable
my_service no está definida, la tarea se omite sin errores.
---
- name: Test Variable is Defined Demo
hosts: all
vars:
my_service: httpd
tasks:
- name: "{{ my_service }} package is installed"
yum:
name: "{{ my_service }}"
when: my_service is defined
En la siguiente tabla, se muestran algunas de las operaciones que pueden utilizar los
administradores al trabajar con condicionales:
Ejemplos de condicionales
Operación Ejemplo
164 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Operación Ejemplo
La última entrada en la tabla anterior puede ser confusa al principio. El siguiente ejemplo ilustra
cómo funciona.
---
- name: Demonstrate the "in" keyword
hosts: all
gather_facts: yes
vars:
supported_distros:
- RedHat
- Fedora
tasks:
- name: Install httpd using yum, where supported
yum:
name: http
state: present
when: ansible_distribution in supported_distros
RH294-RHEL8.0-es-1-20200501 165
capítulo 5 | Implementación del control de tareas
Importante
Observe la sangría de la declaración when. Debido a que la declaración when no es
una variable de módulo, se la debe colocar fuera del módulo con sangría en el nivel
superior de la tarea.
• Si una declaración condicional se debe cumplir cuando ambas condiciones son verdaderas, debe
utilizar la declaración or. Por ejemplo, la siguiente condición se cumple si la máquina ejecuta
Red Hat Enterprise Linux o Fedora:
• Con la operación and, ambas condiciones deben ser verdaderas para que se cumpla con toda
la declaración condicional. Por ejemplo, la siguiente condición se cumple si el host remoto es un
host Red Hat Enterprise Linux 7.5, y el kernel instalado es la versión especificada:
La palabra clave when también admite el uso de una lista para describir una lista de condiciones.
Cuando se proporciona una lista a la palabra clave when, todos los condicionales se combinan
utilizando la operación and. En el siguiente ejemplo, se muestra otra forma de combinar varias
declaraciones condicionales usando el operador and:
when:
- ansible_distribution_version == "7.5"
- ansible_kernel == "3.10.0-327.el7.x86_64"
Este formato mejora la legibilidad, un objetivo clave de una guía Ansible bien escrita.
• Se pueden expresar declaraciones condicionales más complejas agrupando las condiciones con
paréntesis. Esto asegura que se interpreten correctamente.
Por ejemplo, la siguiente declaración condicional se cumple si la máquina ejecuta Red Hat
Enterprise Linux 7 o Fedora 28: Este ejemplo usa el carácter mayor que (>) para que el
condicional largo se pueda dividir en varias líneas en la guía, a fin de que sea más fácil de leer.
166 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
when: >
( ansible_distribution == "RedHat" and
ansible_distribution_major_version == "7" )
or
( ansible_distribution == "Fedora" and
ansible_distribution_major_version == "28" )
Importante
Cuando usa when con loop para una tarea, se verifica la declaración when de cada
ítem.
Este es otro ejemplo que combina condicionales y variables de registro. La siguiente guía anotada
reinicia el servicio httpd únicamente si se ejecuta el servicio postfix.
---
- name: Restart HTTPD if Postfix is Running
hosts: all
tasks:
- name: Get Postfix server status
command: /usr/bin/systemctl is-active postfix
ignore_errors: yes
register: result
RH294-RHEL8.0-es-1-20200501 167
capítulo 5 | Implementación del control de tareas
Referencias
Bucles — Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html
168 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Ejercicio Guiado
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Implementar la iteración de tareas usando la palabra clave loop junto con condicionales.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
[database_prod]
serverb.lab.example.com
3. Cree la guía playbook.yml, que contiene una reproducción con dos tareas. Use el grupo
de hosts database_dev. La primera tarea instala los paquetes requeridos por MariaDB, y
la segunda tarea garantiza que el servicio MariaDB se está ejecutando.
3.1. Abra la guía en un editor de texto. Defina la variable mariadb_packages con dos
valores: mariadb-server y python3-PyMySQL. La guía usa la variable para instalar
los paquetes requeridos. Se debería leer lo siguiente en el archivo:
RH294-RHEL8.0-es-1-20200501 169
capítulo 5 | Implementación del control de tareas
---
- name: MariaDB server is running
hosts: database_dev
vars:
mariadb_packages:
- mariadb-server
- python3-PyMySQL
3.2. Defina una tarea que use el módulo yum y la variable mariadb_packages. La tarea
instala los paquetes requeridos. La tarea debe decir lo siguiente:
tasks:
- name: MariaDB packages are installed
yum:
name: "{{ item }}"
state: present
loop: "{{ mariadb_packages }}"
3.3. Defina una segunda tarea para iniciar el servicio mariadb. La tarea debe decir lo
siguiente:
5. Actualice la primera tarea para que se ejecute solo si el host administrado usa Red Hat
Enterprise Linux como su sistema operativo. Actualice la reproducción para que use el
grupo de hosts database_prod. La tarea debe decir lo siguiente:
170 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
6. Verifique que los hosts administrados en el grupo de hosts database_prod usen Red Hat
Enterprise Linux como su sistema operativo.
Finalizar
En workstation, ejecute el script lab control-flow finish para limpiar los recursos creados
en este ejercicio.
RH294-RHEL8.0-es-1-20200501 171
capítulo 5 | Implementación del control de tareas
Implementación de manejadores
Objetivos
Después de completar esta sección, debe ser capaz de implementar una tarea que se ejecute solo
cuando otra tarea cambie el host administrado.
Manejadores de Ansible
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 a
su estado deseado.
No obstante, algunas veces, cuando una tarea realiza un cambio en el sistema, se puede tener
que ejecutar otra tarea. Por ejemplo, un cambio en un archivo de configuración del servicio puede
luego requerir que el servicio se vuelva a cargar para que se aplique la configuración modificada.
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 tiene un nombre único a nivel global, y se desencadena al final de un bloque
de tareas en una 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.
Los manejadores se pueden considerar como tareas inactive que solo se desencadenan cuando
se las invoca explícitamente mediante una declaración notify. El siguiente fragmento muestra
cómo el servidor Apache solo se reinicia mediante el manejador restart_apache cuando un
archivo de configuración se actualiza y lo notifica:
tasks:
- name: copy demo.example.conf configuration template
template:
src: /var/lib/templates/demo.example.conf.template
dest: /etc/httpd/conf.d/demo.example.conf
notify:
- restart apache
handlers:
- name: restart apache
service:
name: httpd
state: restarted
172 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
tasks:
- name: copy demo.example.conf configuration template
template:
src: /var/lib/templates/demo.example.conf.template
dest: /etc/httpd/conf.d/demo.example.conf
notify:
- restart mysql
- restart apache
handlers:
- name: restart mysql
service:
name: mariadb
state: restarted
• 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).
• 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.
RH294-RHEL8.0-es-1-20200501 173
capítulo 5 | Implementación del control de tareas
Importante
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.
Referencias
Introducción a guías — Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html
174 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Ejercicio Guiado
Implementación de manejadores
En este ejercicio, implementará manejadores en guías.
Resultados
Debe ser capaz de definir manejadores en guías y notificarlos para un cambio de
configuración.
Andes De Comenzar
Desde workstation, ejecute lab control-handlers start para configurar el
entorno para el ejercicio. Este script crea el directorio del proyecto /home/student/
control-handlers y descarga el archivo de configuración Ansible y el archivo de
inventario del host necesarios para el ejercicio. El directorio del proyecto también contiene
una guía parcialmente completa, configure_db.yml.
---
- name: MariaDB server is installed
hosts: databases
vars:
db_packages:
- mariadb-server
- python3-PyMySQL
db_service: mariadb
resources_url: http://materials.example.com/labs/control-handlers
config_file_url: "{{ resources_url }}/my.cnf.standard"
config_file_dst: /etc/my.cnf
tasks:
RH294-RHEL8.0-es-1-20200501 175
capítulo 5 | Implementación del control de tareas
2.2. En el archivo configure_db.yml, defina una tarea que usa el módulo yum para
instalar los paquetes de base de datos, según lo define la variable db_packages.
Si la tarea cambia el sistema, la base de datos no se instaló, y debe notificar al
manejador set db password para establecer su usuario de base de datos inicial y
contraseña. Recuerde que la tarea del manejador, si se notifica, no se ejecutará hasta
que todas las tareas en la sección tasks se hayan ejecutado.
La tarea debe decir lo siguiente:
tasks:
- name: "{{ db_packages }} packages are installed"
yum:
name: "{{ db_packages }}"
state: present
notify:
- set db password
2.3. Agregue una tarea para iniciar y habilitar el servicio de base de datos. La tarea debe
decir lo siguiente:
176 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
2.5. Agregue la palabra clave handlers para definir el inicio de las tareas del manejador.
Defina el primer manejador, restart db service, que reinicia el servicio
mariadb. Debe decir lo siguiente:
handlers:
- name: restart db service
service:
name: "{{ db_service }}"
state: restarted
---
- name: MariaDB server is installed
hosts: databases
vars:
db_packages:
- mariadb-server
- python3-PyMySQL
db_service: mariadb
resources_url: http://materials.example.com/labs/control-handlers
config_file_url: "{{ resources_url }}/my.cnf.standard"
config_file_dst: /etc/my.cnf
tasks:
- name: "{{ db_packages }} packages are installed"
yum:
name: "{{ db_packages }}"
state: present
notify:
- set db password
RH294-RHEL8.0-es-1-20200501 177
capítulo 5 | Implementación del control de tareas
notify:
- restart db service
handlers:
- name: restart db service
service:
name: "{{ db_service }}"
state: restarted
playbook: configure_db.yml
178 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Finalizar
En workstation, ejecute el script lab control-handlers finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 179
capítulo 5 | Implementación del control de tareas
Objetivos
Después de completar esta sección, debe ser capaz de controlar lo que sucede cuando falla una
tarea y qué condiciones hacen que esta falle.
No obstante, algunas veces puede desear continuar la ejecución de la reproducción, aunque una
tarea falle. Por ejemplo, puede esperar que una tarea específica falle y tal vez desee recuperarla
ejecutando otra tarea de forma condicional. Existen varias funciones de Ansible que se pueden
usar para administrar los errores de tareas.
En el siguiente fragmento, se muestra cómo usar ignore_errors en una tarea para continuar
la ejecución de una guía en el host, aun si la tarea falla. Por ejemplo, si el paquete notapkg no
existe, el módulo yum falla, pero si se tiene ignore_errors establecido como yes, la ejecución
continuará.
---
- hosts: all
force_handlers: yes
tasks:
180 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
handlers:
- name: restart the database
service:
name: mariadb
state: restarted
nota
Recuerde que se notifica a los manejadores cuando una tarea informa un resultado
changed (modificado), pero no se notifican cuando informa un resultado ok
(correcto) o failed (con errores).
Por ejemplo, puede ejecutar un script que presenta un mensaje de error y usar ese mensaje
para definir el estado fallido para la tarea. El siguiente fragmento muestra cómo la palabra clave
failed_when se puede utilizar en una tarea:
tasks:
- name: Run user creation script
shell: /usr/local/bin/create_users.sh
register: command_result
failed_when: "'Password missing' in command_result.stdout"
El módulo fail también se puede utilizar para forzar una falla de tarea. El escenario anterior se
puede escribir alternativamente como dos tareas:
tasks:
- name: Run user creation script
shell: /usr/local/bin/create_users.sh
register: command_result
ignore_errors: yes
RH294-RHEL8.0-es-1-20200501 181
capítulo 5 | Implementación del control de tareas
Puedes usar el módulo fail para proporcionar un mensaje de error claro para la tarea. Este
enfoque también permite la falla retrasada, lo que le permite ejecutar tareas intermedias para
completar o revertir otros cambios.
La palabra clave changed_when puede usarse para controlar cuando una tarea informa que se
ha modificado. Por ejemplo, el módulo shell en el siguiente ejemplo se usa para obtener una
credencial de Kerberos que usarán las tareas posteriores. En general, informaría siempre changed
(modificado) cuando se ejecuta. Para eliminar esa modificación, changed_when: false se
establece de modo que solo informa ok (correcto) o failed (con errores).
El siguiente ejemplo usa el módulo shell que informa changed (modificado) según la salida del
módulo recopilada por una variable registrada:
tasks:
- shell:
cmd: /usr/local/bin/upgrade-database
register: command_result
changed_when: "'Success' in command_result.stdout"
notify:
- restart_database
handlers:
- name: restart_database
service:
name: mariadb
state: restarted
182 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Los bloques también permiten el manejo de errores junto con los enunciados rescue y always.
Si una tarea en un bloque falla, las tareas en su bloque rescue se ejecutan para recuperarla.
Después de que se ejecuten las tareas en la cláusula block, así como las tareas en la cláusula
rescue si hubo una falla, se ejecutan las tareas en la cláusula always. Para resumir:
• rescue: define las tareas que se ejecutarán si fallan las tareas definidas en la cláusula block.
• always: define las tareas que se ejecutarán siempre, independientemente del éxito o de la falla
de las tareas definidas en las cláusulas block y rescue.
En el siguiente ejemplo, se muestra cómo implementar un bloque en una guía. Inclusive si las
tareas definidas en la cláusula block fallan, se ejecutan las tareas definidas en las cláusulas
rescue y always.
tasks:
- name: Upgrade DB
block:
- name: upgrade the database
shell:
cmd: /usr/local/lib/upgrade-database
rescue:
- name: revert the database upgrade
shell:
cmd: /usr/local/lib/revert-database
always:
- name: always restart the database
service:
name: mariadb
state: restarted
La condición when en una cláusula block también se aplica a sus cláusulas rescue y always si
están presentes.
Referencias
Manejo de errores en guías — Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html
RH294-RHEL8.0-es-1-20200501 183
capítulo 5 | Implementación del control de tareas
Ejercicio Guiado
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
En workstation, ejecute el script de inicio del trabajo de laboratorio a fin de confirmar
que el entorno esté listo para que comience el trabajo de laboratorio. Este script crea el
directorio de trabajo, /home/student/control-errors.
2. El script del trabajo de laboratorio creó un archivo de configuración Ansible, así como un
archivo de inventario que contiene el servidor servera.lab.example.com en el grupo
databases. Revise el archivo antes de continuar.
3. Cree la guía playbook.yml, que contiene una reproducción con dos tareas. Escriba la
primera tarea con un error deliberado para que falle.
3.1. Abra la guía en un editor de texto. Defina tres variables: web_package con un valor
de http, db_package con un valor de mariadb-server y db_service con un
valor de mariadb. Estas variables se usarán para instalar los paquetes requeridos e
iniciar el servidor.
El valor http es un error intencional en el nombre del paquete. Se debería leer lo
siguiente en el archivo:
184 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
---
- name: Task Failure Exercise
hosts: databases
vars:
web_package: http
db_package: mariadb-server
db_service: mariadb
3.2. Defina dos tareas que usen el módulo yum y las dos variables, web_package y
db_package. Las tareas instalarán los paquetes requeridos. En las tareas, se debe
leer lo siguiente:
tasks:
- name: Install {{ web_package }} package
yum:
name: "{{ web_package }}"
state: present
La tarea falló porque no hay un paquete existente denominado http. Debido a que falló la
primera tarea, no se ejecutó la segunda tarea.
5. Actualice la primera tarea para ignorar cualquier error añadiendo la palabra clave
ignore_errors. En las tareas, se debe leer lo siguiente:
tasks:
- name: Install {{ web_package }} package
yum:
name: "{{ web_package }}"
state: present
ignore_errors: yes
RH294-RHEL8.0-es-1-20200501 185
capítulo 5 | Implementación del control de tareas
A pesar del hecho de que falló la primera tarea, Ansible ejecutó la segunda.
7. En este paso, configurará una palabra clave block para que pueda experimentar con su
funcionamiento.
7.1. Actualice la guía anidando la primera tarea en una cláusula block. Elimine la línea que
establece ignore_errors: yes. El bloque debe decir lo siguiente:
7.2. Anide la tarea que instala el paquete mariadb-server en una cláusula rescue. La
tarea se ejecutará si falla la tarea que se detalla en la cláusula block. La cláusula
block debe decir lo siguiente:
rescue:
- name: Install {{ db_package }} package
yum:
name: "{{ db_package }}"
state: present
186 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
7.3. Por último, agregue una cláusula always que iniciará el servidor de base de datos
una vez realizada la instalación usando el módulo service. La cláusula debe decir lo
siguiente:
always:
- name: Start {{ db_service }} service
service:
name: "{{ db_service }}"
state: started
tasks:
- name: Attempt to set up a webserver
block:
- name: Install {{ web_package }} package
yum:
name: "{{ web_package }}"
state: present
rescue:
- name: Install {{ db_package }} package
yum:
name: "{{ db_package }}"
state: present
always:
- name: Start {{ db_service }} service
service:
name: "{{ db_service }}"
state: started
8.1. Ejecute la guía. Fallará la tarea en el bloque que garantiza que esté instalado
web_package, lo que causará la ejecución de la tarea del bloque rescue. A
continuación, se ejecuta la tarea en el bloque always.
RH294-RHEL8.0-es-1-20200501 187
capítulo 5 | Implementación del control de tareas
8.2. Edite la guía y corrija el valor de la variable web_package para que diga httpd.
Esto hará que la tarea en el bloque se ejecute de manera correcta la próxima vez que
ejecute la guía.
vars:
web_package: httpd
db_package: mariadb-server
db_service: mariadb
8.3. Ejecute la guía nuevamente. Esta vez, la tarea en el bloque no fallará. Esto hace que
se ignore la tarea en la sección rescue. Se ejecutará la tarea en always.
9. Este paso explora el modo en que se controla la condición que hace que la tarea se informe
como “changed” (modificado) al host administrado.
9.1. Edite la guía para agregar dos tareas al inicio de la reproducción, antes del block. La
primera tarea usa el módulo command para ejecutar el comando date y registra el
resultado en la variable command_result. La segunda tarea usa el módulo debug
para imprimir la salida estándar del comando de la primera tarea.
tasks:
- name: Check local time
command: date
register: command_result
9.2. Ejecute la guía. Debería ver que la primera tarea, que ejecuta el módulo command,
informe changed (modificado), aun si no modificó el sistema remoto; solo recopiló
información acerca de la hora. Esto se debe a que el módulo command no puede
188 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Si ejecuta la guía nuevamente, la tarea Check local time (Verificar hora local)
informará changed (modificado) nuevamente.
9.3. Esa tarea command no debería informar changed (modificado) cada vez que se
ejecuta, ya que no modifica el host administrado. Dado que sabe que la tarea nunca
modificará un host administrado, agregue la línea changed_when: false a la tarea
para eliminar la modificación.
tasks:
- name: Check local time
command: date
register: command_result
changed_when: false
9.4. Ejecute la guía nuevamente para observar que la tarea ahora informe ok (correcto),
pero la tarea aún se está ejecutando y está guardando la hora en la variable.
RH294-RHEL8.0-es-1-20200501 189
capítulo 5 | Implementación del control de tareas
10. Como ejercicio final, edite la guía para explorar el modo en que la palabra clave
failed_when interactúa con las tareas.
- block:
- name: Install {{ web_package }} package
yum:
name: "{{ web_package }}"
state: present
failed_when: web_package == "httpd"
190 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Finalizar
En workstation, ejecute el script lab control-errors finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 191
capítulo 5 | Implementación del control de tareas
Trabajo de laboratorio
Resultados
Debe ser capaz de definir condicionales en Ansible Playbooks, configurar bucles que iteran
en elementos, definir manejadores en guías y manejar errores de tareas.
Andes De Comenzar
Inicie sesión como el usuario student en workstation y ejecute lab control-review
start. Este script garantiza que se pueda acceder al host administrado, serverb, en la red.
También garantiza que el archivo de configuración y el inventario Ansible correctos estén
instalados en el nodo de control.
• Una tarea para asegurar que el directorio especificado por la variable ssl_cert_dir
existe en el host remoto. Este directorio almacena los certificados del servidor web.
192 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
• Una tarea para copiar todos los archivos especificados por la variable
web_config_files al host remoto. Examine la estructura de la variable
web_config_files en el archivo vars.yml. Configure la tarea para copiar cada archivo
al destino correcto en el host remoto.
Esta tarea debe desencadenar el manejador restart web service si alguno de estos
archivos se modifica en el servidor remoto.
Además, se ejecuta una tarea de depuración si falla alguna de las dos tareas anteriores. En
este caso, la tarea imprime el mensaje: One or more of the configuration changes
failed, but the web service is still active..
Asegúrese de proporcionar un nombre adecuado para todas las tareas.
6. La guía configura el host remoto para escuchar las solicitudes de HTTPS estándares.
Agregue una sola tarea a la guía bajo el comentario #Configure the firewall para
configurar firewalld.
Esta tarea debe garantizar que el host remoto permita conexiones HTTP y HTTPS
estándares. Estos cambios de configuración deben ser efectivos de inmediato y persistir
después de reiniciar el sistema. Asegúrese de proporcionar un nombre adecuado para la
tarea.
7. Defina el manejador restart web service.
Cuando se desencadena, esta tarea debe reiniciar el servicio web determinado por la variable
web_service, definida en el archivo vars.yml.
8. Desde el directorio, ~/control-review, ejecute la guía playbook.yml. La guía debe
ejecutarse sin errores y desencadenar la ejecución de la tarea del manejador.
9. Verifique que el servidor web ahora responde a las solicitudes HTTPS, usando el certificado
autofirmado personalizado para cifrar la conexión. La respuesta del servidor web debe
coincidir con la cadena Configured for both HTTP and HTTPS.
Evaluación
En workstation, ejecute el comando lab control-review grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
Finalizar
Ejecute el comando lab control-review finish para la limpieza después del trabajo de
laboratorio.
RH294-RHEL8.0-es-1-20200501 193
capítulo 5 | Implementación del control de tareas
Solución
Resultados
Debe ser capaz de definir condicionales en Ansible Playbooks, configurar bucles que iteran
en elementos, definir manejadores en guías y manejar errores de tareas.
Andes De Comenzar
Inicie sesión como el usuario student en workstation y ejecute lab control-review
start. Este script garantiza que se pueda acceder al host administrado, serverb, en la red.
También garantiza que el archivo de configuración y el inventario Ansible correctos estén
instalados en el nodo de control.
tasks:
#Fail Fast Message
- name: Show Failed System Requirements Message
fail:
msg: "The {{ inventory_hostname }} did not meet minimum reqs."
when: >
ansible_memtotal_mb < min_ram_mb or
ansible_distribution != "RedHat"
194 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
3. Agregue una sola tarea a la guía bajo el comentario #Install all Packages para instalar
la última versión de cualquier paquete faltante. Los paquetes requeridos son especificados
por la variable packages, que se define en el archivo vars.yml.
El nombre de la tarea debe ser Ensure required packages are present.
La tarea completada coincide:
4. Agregue una sola tarea a la guía bajo el comentario #Enable and start services para
iniciar todos los servicios. Deben iniciarse y habilitarse todos los servicios especificados por
la variable services, que se define en el archivo vars.yml. Asegúrese de proporcionar un
nombre adecuado para la tarea.
La tarea completada coincide:
5. Agregue un bloque de tareas a la guía bajo el comentario #Block of config tasks. Este
bloque contiene dos tareas:
• Una tarea para asegurar que el directorio especificado por la variable ssl_cert_dir
existe en el host remoto. Este directorio almacena los certificados del servidor web.
• Una tarea para copiar todos los archivos especificados por la variable
web_config_files al host remoto. Examine la estructura de la variable
web_config_files en el archivo vars.yml. Configure la tarea para copiar cada archivo
al destino correcto en el host remoto.
Esta tarea debe desencadenar el manejador restart web service si alguno de estos
archivos se modifica en el servidor remoto.
Además, se ejecuta una tarea de depuración si falla alguna de las dos tareas anteriores. En
este caso, la tarea imprime el mensaje: One or more of the configuration changes
failed, but the web service is still active..
Asegúrese de proporcionar un nombre adecuado para todas las tareas.
El bloque de tareas completadas coincide con lo siguiente:
RH294-RHEL8.0-es-1-20200501 195
capítulo 5 | Implementación del control de tareas
state: directory
rescue:
- name: Configuration Error Message
debug:
msg: >
One or more of the configuration
changes failed, but the web service
is still active.
6. La guía configura el host remoto para escuchar las solicitudes de HTTPS estándares.
Agregue una sola tarea a la guía bajo el comentario #Configure the firewall para
configurar firewalld.
Esta tarea debe garantizar que el host remoto permita conexiones HTTP y HTTPS
estándares. Estos cambios de configuración deben ser efectivos de inmediato y persistir
después de reiniciar el sistema. Asegúrese de proporcionar un nombre adecuado para la
tarea.
La tarea completada coincide:
196 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
handlers:
- name: restart web service
service:
name: "{{ web_service }}"
state: restarted
---
- name: Playbook Control Lab
hosts: webservers
vars_files: vars.yml
tasks:
#Fail Fast Message
- name: Show Failed System Requirements Message
fail:
msg: "The {{ inventory_hostname }} did not meet minimum reqs."
when: >
ansible_memtotal_mb < min_ram_mb or
ansible_distribution != "RedHat"
RH294-RHEL8.0-es-1-20200501 197
capítulo 5 | Implementación del control de tareas
rescue:
- name: Configuration Error Message
debug:
msg: >
One or more of the configuration
changes failed, but the web service
is still active.
#Add handlers
handlers:
- name: restart web service
service:
name: "{{ web_service }}"
state: restarted
198 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
9. Verifique que el servidor web ahora responde a las solicitudes HTTPS, usando el certificado
autofirmado personalizado para cifrar la conexión. La respuesta del servidor web debe
coincidir con la cadena Configured for both HTTP and HTTPS.
Evaluación
En workstation, ejecute el comando lab control-review grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
Finalizar
Ejecute el comando lab control-review finish para la limpieza después del trabajo de
laboratorio.
RH294-RHEL8.0-es-1-20200501 199
capítulo 5 | Implementación del control de tareas
200 RH294-RHEL8.0-es-1-20200501
capítulo 5 | Implementación del control de tareas
Resumen
En este capítulo, aprendió lo siguiente:
• Los bucles se usan para iterar un conjunto de valores, por ejemplo, una simple lista de cadenas o
una lista de hashes o diccionarios.
• Los condicionales se pueden usar para ejecutar tareas o reproducciones únicamente cuando se
hayan cumplido ciertas condiciones.
• Los manejadores son tareas especiales que se ejecutan al final de una reproducción si otras
tareas los notifican.
• Los manejadores solo son notificados cuando una tarea informa que se cambió algo en un host
administrado.
• Las tareas se configuran para manejar condiciones de error ignorando una falla en las tareas,
forzando a los manejadores a ser invocados aun cuando la tarea haya fallado, marcar una tarea
como con errores cuando fue satisfactoria o reemplazar el comportamiento que hace que la
tarea se marque como modificada.
• Los bloques se usan para agrupar tareas como una unidad y ejecutar otras tareas dependiendo
de si todas las tareas en el bloque se realizaron satisfactoriamente.
RH294-RHEL8.0-es-1-20200501 201
202 RH294-RHEL8.0-es-1-20200501
capítulo 6
Implementación de archivos en
hosts administrados
Meta Implementar, administrar y ajustar archivos en
hosts administrados por Ansible.
RH294-RHEL8.0-es-1-20200501 203
capítulo 6 | Implementación de archivos en hosts administrados
Objetivos
Tras completar esta sección, deberá ser capaz de crear, instalar, editar y eliminar archivos en hosts
administrados, y administrar permisos, propiedad, contexto de SELinux y otras características de
esos archivos.
La librería de módulos Files incluye módulos que permiten realizar la mayoría de las tareas
relacionadas con la administración de archivos de Linux, como crear, copiar, editar y modificar
permisos y otros atributos de archivos. En la siguiente tabla, se proporciona una lista de los
módulos de administración de archivos de uso frecuente:
fetch Este módulo funciona como el módulo copy, pero a la inversa. Este
módulo se utiliza para recuperar archivos de máquinas remotas
al nodo de control y para almacenarlos en un árbol de archivos,
organizado por nombre de host.
204 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
synchronize Un contenedor alrededor del comando rsync para hacer que las
tareas comunes sean rápidas y fáciles. El módulo synchronize
no está destinado a proporcionar acceso a toda la potencia del
comando rsync, pero hace que las invocaciones más comunes sean
más fáciles de implementar. Es posible que aún necesite generar el
comando rsync directamente a través del módulo run command
según su caso de uso.
Resultado de ejemplo:
$ ls -l file
-rw-r----- user1 group1 0 Nov 25 08:00 file
$ ls -Z samba_file
-rw-r--r-- owner group unconfined_u:object_r:user_home_t:s0 samba_file
La siguiente tarea garantiza que el atributo de tipo de contexto SELinux del archivo samba_file
es el tipo samba_share_t deseado. Este comportamiento es similar al comando chcon de Linux.
RH294-RHEL8.0-es-1-20200501 205
capítulo 6 | Implementación de archivos en hosts administrados
Resultado de ejemplo:
$ ls -Z samba_file
-rw-r--r-- owner group unconfined_u:object_r:samba_share_t:s0 samba_file
nota
Los parámetros de atributos de archivo están disponibles en varios módulos
de administración de archivos. Ejecute los comandos ansible-doc file y
ansible-doc copy para obtener más información.
Resultado de ejemplo:
$ ls -Z samba_file
-rw-r--r-- owner group unconfined_u:object_r:samba_share_t:s0 samba_file
Importante
El módulo sefcontext actualiza el contexto predeterminado para el destino en la
política de SELinux, pero no cambia el contexto en los archivos existentes.
De forma predeterminada, este módulo supone que force: yes está configurado. Eso obliga
al módulo a sobrescribir el archivo remoto si existe, pero tiene un contenido diferente del archivo
que se está copiando. Si se configura force: no, solo copia el archivo al host administrado si no
existe.
206 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Para recuperar archivos de hosts administrados, use el módulo fetch. Esto puede usarse para
recuperar un archivo como una clave pública SSH de un sistema de referencia antes de distribuirlo
a otros hosts administrados.
Para asegurarse de que existe una línea de texto específica en un archivo existente, use el módulo
lineinfile:
nota
Al usar el módulo blockinfile, los marcadores de bloque comentados se insertan
al principio y al final del bloque para garantizar la idempotencia.
RH294-RHEL8.0-es-1-20200501 207
capítulo 6 | Implementación de archivos en hosts administrados
admiten otras opciones también. Es posible que el valor predeterminado pueda cambiar en algún
momento, pero quizás lo más importante es que facilita la comprensión del estado en el que debe
estar el sistema según su tarea.
El módulo stat devuelve un diccionario de hash de los valores que contienen datos de estado
del archivo, lo que le permite referirse a partes individuales de información mediante variables
separadas.
- debug
msg: "The checksum of the file is {{ result.stat.checksum }}"
La información sobre los valores devueltos por el módulo stat son registrados por ansible-
doc, o puede registrar una variable y visualizar su contenido para ver qué hay disponible:
tasks:
- name: stat /etc/passwd
stat:
path: /etc/passwd
register: results
208 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Hay muchas maneras de usar el módulo synchronize y sus diversos parámetros, incluida la
sincronización de directorios. Ejecute el comando ansible-doc synchronize para obtener
ejemplos de parámetros y de guía adicionales.
Referencias
Páginas del manual ansible-doc(1), chmod(1), chown(1), rsync(1), stat(1) and
touch(1)
Módulos de archivos
https://docs.ansible.com/ansible/latest/modules/list_of_files_modules.html
RH294-RHEL8.0-es-1-20200501 209
capítulo 6 | Implementación de archivos en hosts administrados
Ejercicio Guiado
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Crear guías que usen módulos comunes de administración de archivos como copy, file,
lineinfile y blockinfile.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
---
- name: Use the fetch module to retrieve secure log files
hosts: all
remote_user: root
210 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
tasks:
- name: Fetch the /var/log/secure log file from managed hosts
fetch:
src: /var/log/secure
dest: secure-backups
flat: no
playbook: secure_log_backups.yml
RH294-RHEL8.0-es-1-20200501 211
capítulo 6 | Implementación de archivos en hosts administrados
---
- name: Using the copy module
hosts: all
remote_user: root
2.2. Agregue una tarea para usar el módulo copy para copiar el archivo /home/
student/file-manage/files/users.txt en todos los hosts administrados. Use
el módulo copy para definir los siguientes parámetros para el archivo users.txt:
Parámetro Valores
src files/users.txt
dest /home/devops/users.txt
owner devops
group devops
mode u+rw,g-wx,o-rwx
setype samba_share_t
tasks:
- name: Copy a file to managed hosts and set attributes
copy:
src: files/users.txt
dest: /home/devops/users.txt
owner: devops
group: devops
mode: u+rw,g-wx,o-rwx
setype: samba_share_t
playbook: copy_file.yml
212 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
ok: [serverb.lab.example.com]
ok: [servera.lab.example.com]
2.5. Use un comando ad hoc para ejecutar el comando ls -Z como el usuario devops
para verificar los atributos del archivo users.txt en los hosts administrados.
nota
En un caso real, también debería editar copy_file.yml y eliminar la palabra clave
setype.
---
- name: Using the file module to ensure SELinux file context
hosts: all
remote_user: root
tasks:
- name: SELinux file context is set to defaults
file:
path: /home/devops/users.txt
seuser: _default
serole: _default
setype: _default
selevel: _default
RH294-RHEL8.0-es-1-20200501 213
capítulo 6 | Implementación de archivos en hosts administrados
playbook: selinux_defaults.yml
---
- name: Add text to an existing file
hosts: all
remote_user: devops
tasks:
- name: Add a single line of text to a file
lineinfile:
path: /home/devops/users.txt
line: This line was added by the lineinfile module.
state: present
214 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
playbook: add_line.yml
4.4. Use el módulo command con la opción cat, como el usuario devops, para verificar el
contenido del archivo users.txt en los hosts administrados.
---
- name: Add block of text to a file
hosts: all
remote_user: devops
tasks:
- name: Add a block of text to an existing file
blockinfile:
path: /home/devops/users.txt
RH294-RHEL8.0-es-1-20200501 215
capítulo 6 | Implementación de archivos en hosts administrados
block: |
This block of text consists of two lines.
They have been added by the blockinfile module.
state: present
playbook: add_block.yml
5.4. Use el módulo command con el comando cat para verificar el contenido del archivo /
home/devops/users.txt en el host administrado.
216 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
---
- name: Use the file module to remove a file
hosts: all
remote_user: devops
tasks:
- name: Remove a file from managed hosts
file:
path: /home/devops/users.txt
state: absent
playbook: remove_file.yml
6.4. Use un comando ad hoc para ejecutar el comando ls -l para confirmar que el
archivo users.txt ya no existe en los hosts administrados.
Finalizar
En workstation, ejecute el script lab file-manage finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 217
capítulo 6 | Implementación de archivos en hosts administrados
218 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Implementación de archivos
personalizados con plantillas Jinja2
Objetivos
Tras completar esta sección, deberá ser capaz de usar plantillas de Jinja2 para implementar
archivos personalizados en hosts administrados.
Una forma mucho más poderosa de administrar archivos es utilizar una plantilla. Con este método,
puede escribir un archivo de configuración de plantilla que se personaliza automáticamente para
el host administrado cuando se implementa el archivo, usando datos y variables de Ansible. Esto
puede ser más fácil de controlar y menos propenso a errores.
Introducción a Jinja2
Ansible usa el sistema de plantillas Jinja2 para los archivos de plantilla. Ansible también usa la
sintaxis de Jinja2 para hacer referencia a las variables de las guías, por lo que ya sabe un poco
cómo usarlo.
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 proporcionar 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.
En el siguiente ejemplo, la primera línea incluye un comentario que no se incluirá en el archivo final.
Las referencias a variables en la segunda línea se reemplazan con los valores de datos del sistema
a los que hacen referencia.
{# /etc/hosts line #}
{{ ansible_facts['default_ipv4']['address'] }} {{ ansible_facts['hostname'] }}
RH294-RHEL8.0-es-1-20200501 219
capítulo 6 | Implementación de archivos en hosts administrados
nota
Recuerde que la información asociada con un host administrado se puede obtener
usando el comando ansible system_hostname -i inventory_file -m
setup.
En el siguiente ejemplo, se muestra cómo crear una plantilla para /etc/ssh/sshd_config con
variables y datos recuperados por Ansible de los hosts administrados. Cuando la guía asociada se
ejecuta, los datos se reemplazan por sus valores en el host administrado que se está configurando.
nota
Un archivo que contiene una plantilla Jinja2 no necesita tener ninguna extensión de
archivo específica (por ejemplo, .j2). Sin embargo, proporcionar dicha extensión
de archivo puede hacer que sea más fácil recordar que es un archivo de plantilla.
# {{ ansible_managed }}
# DO NOT MAKE LOCAL MODIFICATIONS TO THIS FILE AS THEY WILL BE LOST
Port {{ ssh_port }}
ListenAddress {{ ansible_facts['default_ipv4']['address'] }}
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
PermitRootLogin {{ root_allowed }}
AllowGroups {{ groups_allowed }}
PasswordAuthentication {{ passwords_allowed }}
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UsePrivilegeSeparation sandbox
220 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Para utilizar el módulo template, use la siguiente sintaxis. El valor asociado con la clave src
especifica la plantilla Jinja2 de origen, y el valor asociado a la clave dest especifica el archivo que
debe crearse en los hosts de destino.
tasks:
- name: template render
template:
src: /tmp/j2-template.j2
dest: /tmp/dest-config-file.txt
nota
El módulo template también le permite especificar el propietario (el usuario
que posee el archivo), el grupo, los permisos y el contexto SELinux del archivo
implementado, al igual que el módulo file. También puede tomar una opción
validate para ejecutar un comando arbitrario (como visudo -c) con el fin de
verificar que la sintaxis de un archivo sea correcta antes de copiarlo en su lugar.
Una forma de hacer esto es usar la cadena “Administrado por Ansible” en la directiva
ansible_managed. Esta no es una variable normal, pero se puede usar como una en una plantilla.
La directiva ansible_managed se establece en el archivo ansible.cfg:
Para incluir la cadena ansible_managed dentro de una plantilla Jinja2, use la siguiente sintaxis:
{{ ansible_managed }}
Estructuras de control
Puede usar las estructuras de control Jinja2 en los archivos de plantilla para reducir la escritura
repetitiva, ingresar entradas para cada host en una reproducción de forma dinámica o insertar
texto condicionalmente en un archivo.
RH294-RHEL8.0-es-1-20200501 221
capítulo 6 | Implementación de archivos en hosts administrados
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 siguiente plantilla de ejemplo usa una sentencia for para ejecutar a través de todos los valores
en la variable users, y reemplaza myuser con cada valor, salvo cuando el valor es root.
{# for statement #}
{% for myuser in users if not myuser == "root" %}
User number {{ loop.index }} - {{ myuser }}
{% endfor %}
Como otro ejemplo, esta plantilla también usa la sentencia for y supone que se ha definido
una variable myhosts en el archivo de inventario que se utiliza. Esta variable contiene una lista
de hosts que deben gestionarse. 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. Supongamos que tiene la siguiente guía:
La siguiente plantilla templates/hosts.j2 de tres líneas crea el archivo de todos los hosts del
grupo all. (La línea media es extremadamente larga en la plantilla debido a la longitud de los
nombres de las variables.) Se repite en cada host del grupo para obtener tres datos para el archivo
/etc/hosts.
222 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
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.
{% if finished %}
{{ result }}
{% endif %}
Importante
Puede usar bucles y condicionales de Jinja2 en las plantillas de Ansible, pero no en
las guías de Ansible.
Filtros de variables
Jinja2 proporciona filtros que cambian el formato de salida de las expresiones de plantillas
(por ejemplo, a JSON). Existen filtros disponibles para lenguajes, como YAML y JSON. El filtro
to_json formatea el resultado de la expresión con JSON, y el filtro to_yaml formatea el
resultado de la expresión con YAML.
{{ output | to_json }}
{{ output | to_yaml }}
{{ output | to_nice_json }}
{{ output | to_nice_yaml }}
{{ output | from_json }}
{{ output | from_yaml }}
Pruebas de variables
Las expresiones usadas con cláusulas when en las guías Ansible son expresiones Jinja2. Las
pruebas incorporadas de Ansible que se usan para probar los valores recibidos incluyen failed,
RH294-RHEL8.0-es-1-20200501 223
capítulo 6 | Implementación de archivos en hosts administrados
changed, succeeded y skipped. La siguiente tarea muestra cómo se pueden usar las pruebas
dentro de las expresiones condicionales.
tasks:
...output omitted...
- debug: msg="the execution was aborted"
when: returnvalue is failed
Referencias
plantilla - envía un archivo como plantilla a un servidor remoto —
Documentación Ansible
https://docs.ansible.com/ansible/latest/modules/template_module.html
224 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Ejercicio Guiado
Implementación de archivos
personalizados con plantillas Jinja2
En este ejercicio, creará un archivo de plantilla simple que su guía usará para instalar un
archivo de Mensaje del Día personalizado en cada host administrado.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
nota
Todos los archivos usados durante este ejercicio están disponibles para
su referencia en workstation en el directorio /home/student/file-
template/files.
[webservers]
servera.lab.example.com
[workstations]
workstation.lab.example.com
2. Cree una plantilla para el Mensaje del día e inclúyalo en el archivo motd.j2 en el directorio
de trabajo actual. Incluya las siguientes variables y datos en la plantilla:
RH294-RHEL8.0-es-1-20200501 225
capítulo 6 | Implementación de archivos en hosts administrados
• ansible_facts['distribution'] y
ansible_facts['distribution_version'], para proporcionar información de
distribución.
• system_owner, para el correo electrónico del propietario del sistema. Esta variable
debe ser definida con un valor adecuado, en la sección vars de la plantilla de la guía.
---
- name: configure SOE
hosts: all
remote_user: devops
become: true
vars:
- system_owner: [email protected]
tasks:
- name: configure /etc/motd
template:
src: motd.j2
dest: /etc/motd
owner: root
group: root
mode: 0644
playbook: motd.yml
226 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Finalizar
Ejecute el comando lab file-template finish para limpiar después del ejercicio.
RH294-RHEL8.0-es-1-20200501 227
capítulo 6 | Implementación de archivos en hosts administrados
Trabajo de laboratorio
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
nota
Todos los archivos usados en este ejercicio están disponibles en
workstation en el directorio /home/student/file-review/files.
228 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
usuario root como propietario y grupo, y sus permisos son 0644. Con los módulos stat
y debug, cree tareas para verificar que /etc/motd exista en los hosts administrados y
muestre la información del archivo para /etc/motd. Use el módulo copy para colocar
files/issue en el directorio /etc/ del host administrado; use la misma propiedad y los
mismos permisos que /etc/motd. Use el módulo file para asegurarse de que /etc/
issue.net sea un enlace simbólico a /etc/issue en el host administrado. Configure la
guía para que use el usuario devops, y configure el parámetro become en true.
5. Ejecute la guía incluida en el archivo motd.yml.
6. Verifique que la guía incluida en el archivo motd.yml se haya ejecutado correctamente.
Evaluación
En workstation, ejecute el script lab file-review grade para confirmar que ha realizado
correctamente este ejercicio.
Finalizar
En workstation, ejecute el script lab file-review finish para limpiar después del trabajo
de laboratorio.
RH294-RHEL8.0-es-1-20200501 229
capítulo 6 | Implementación de archivos en hosts administrados
Solución
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
nota
Todos los archivos usados en este ejercicio están disponibles en
workstation en el directorio /home/student/file-review/files.
1.2. Cree el archivo inventory en el directorio actual. Este archivo configura un grupo
denominado servers. Incluya el sistema serverb.lab.example.com en el grupo
servers.
230 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
[servers]
serverb.lab.example.com
3. Cree una plantilla para el Mensaje del día, denominada motd.j2, en el actual directorio.
Cuando el usuario devops inicia sesión en serverb.lab.example.com, debe aparecer
un mensaje que muestra la memoria total del sistema y la cantidad de procesadores. Use los
datos ansible_facts['memtotal_mb'] y ansible_facts['processor_count']
para proporcionar la información de memoria para el mensaje.
---
- name: Configure system
hosts: all
remote_user: devops
become: true
tasks:
- name: Configure a custom /etc/motd
template:
src: motd.j2
dest: /etc/motd
RH294-RHEL8.0-es-1-20200501 231
capítulo 6 | Implementación de archivos en hosts administrados
owner: root
group: root
mode: 0644
playbook: motd.yml
232 RH294-RHEL8.0-es-1-20200501
capítulo 6 | Implementación de archivos en hosts administrados
Evaluación
En workstation, ejecute el script lab file-review grade para confirmar que ha realizado
correctamente este ejercicio.
Finalizar
En workstation, ejecute el script lab file-review finish para limpiar después del trabajo
de laboratorio.
RH294-RHEL8.0-es-1-20200501 233
capítulo 6 | Implementación de archivos en hosts administrados
Resumen
En este capítulo, aprendió lo siguiente:
• La biblioteca de módulos Files incluye módulos que le permiten realizar la mayoría de las
tareas relacionadas con la administración de archivos, como crear, copiar, editar y modificar
permisos y otros atributos de archivos.
• Puede usar plantillas Jinja2 para crear archivos dinámicamente para la implementación.
• Por lo general, una plantilla Jinja2 se compone de dos elementos: variables y expresiones. Estas
variables y expresiones se reemplazan con valores cuando se entrega la plantilla Jinja2.
• Los filtros en Jinja2 transforman las expresiones de las plantillas de un tipo o formato de datos a
otro.
234 RH294-RHEL8.0-es-1-20200501
capítulo 7
Administración de proyectos
grandes
Meta Escribir guías que estén optimizadas para
proyectos más grandes y complejos.
RH294-RHEL8.0-es-1-20200501 235
capítulo 7 | Administración de proyectos grandes
Objetivos
Después de completar esta sección, deberá ser capaz de escribir patrones de host sofisticados a
fin de seleccionar hosts de manera eficiente para una reproducción o un comando ad hoc.
Ya ha utilizado patrones de hosts en este curso. En una reproducción, la directiva hosts especifica
los hosts administrados respecto de los cuales se ejecutará la reproducción. Para un comando ad
hoc, debe proporcionar el patrón de host como un argumento de la línea de comandos al comando
ansible.
En general, es más fácil controlar a qué hosts apunta una reproducción usando cuidadosamente
patrones de hosts y teniendo grupos de inventario correctos en lugar de establecer condicionales
complejos en las tareas de la reproducción. Por lo tanto, es importante tener una comprensión
sólida de los patrones de host.
El siguiente ejemplo de inventario se usa en esta sección para ilustrar patrones de hosts.
[lab]
labhost1.example.com
labhost2.example.com
[test]
test1.example.com
test2.example.com
[datacenter1]
labhost1.example.com
test1.example.com
[datacenter2]
labhost2.example.com
test2.example.com
[datacenter:children]
datacenter1
datacenter2
236 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
[new]
192.168.2.1
192.168.2.2
Para demostrar cómo se resuelven los patrones de host, ejecutará una guía Ansible,
playbook.yml, utilizando diferentes patrones de host para identificar diferentes subconjuntos
de hosts administrados de este inventario de ejemplo.
Hosts administrados
El patrón más básico es el nombre para un solo host administrado detallado en el inventario.
Especifica que el host será el único en el inventario en el que se actuará mediante el comando
ansible.
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.
En el siguiente ejemplo, se muestra cómo se puede usar el patrón de host para hacer referencia a
una dirección IP contenida en un inventario.
nota
Un problema al hacer referencia a hosts administrados por medio de una
dirección IP en el inventario es que puede resultar difícil recordar qué dirección IP
corresponde a qué host para sus reproducciones y comandos ad hoc. Sin embargo,
es posible que deba especificar el host por dirección IP para fines de conexión si el
host no tiene un nombre de host que se pueda resolver.
ansible_host: 192.168.2.1
RH294-RHEL8.0-es-1-20200501 237
capítulo 7 | Administración de proyectos grandes
Recuerde que hay un grupo especial llamado all que coincide con todos los hosts administrados
en el inventario.
También hay un grupo especial llamado ungrouped que incluye todos los hosts administrados en
el inventario que no son miembros de ningún otro grupo:
238 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Importante
Algunos caracteres que se usan en los patrones de host también tienen significado
para la shell. Esto puede ser un problema al usar patrones de hosts para ejecutar
comandos ad hoc desde la línea de comandos con ansible. Es una práctica
recomendada colocar entre comillas simples los patrones de host usados en la línea
de comandos para protegerlos de una expansión de shell no deseada.
Del mismo modo, si usa caracteres comodín o de lista especiales en una Ansible
Playbook, debe colocar su patrón de host entre comillas simples para asegurarse de
que se analice correctamente.
---
hosts: '!test1.example.com,development'
El carácter de asterisco también se puede usar para que coincida con cualquier host administrado
o grupo que contenga una subcadena específica.
Por ejemplo, el siguiente patrón de host comodín coincide con todos los nombres de inventario
que finalizan en .example.com:
RH294-RHEL8.0-es-1-20200501 239
capítulo 7 | Administración de proyectos grandes
...output omitted...
[student@controlnode ~]$ ansible-playbook playbook.yml
El siguiente ejemplo usa un patrón de host comodín para coincidir con los nombres de hosts o
grupos de hosts que comienzan con 192.168.2.:
El siguiente ejemplo usa un patrón de host comodín para coincidir con los nombres de hosts o
grupos de hosts que comienzan con datacenter.
240 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Importante
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 hosts administrados separados por comas, se apuntará a todos
estos hosts administrados:
Si usted proporciona una lista de grupos separados por comas, se apuntará a todos estos hosts en
cualquiera de esos grupos:
RH294-RHEL8.0-es-1-20200501 241
capítulo 7 | Administración de proyectos grandes
...output omitted...
[student@controlnode ~]$ ansible-playbook playbook.yml
También puede combinar hosts administrados, grupos de hosts y comodines, como se muestra
más abajo:
nota
El carácter de dos puntos (:) puede usarse en lugar de una coma. Sin embargo, la
coma es el separador preferido, en especial, cuando se trabaja con direcciones IPv6
como nombres de hosts administrados. Puede ver la sintaxis de los dos puntos en
ejemplos anteriores.
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.
Por ejemplo, en nuestro ejemplo de inventario, el siguiente patrón de host coincidirá con las
máquinas en el grupo lab solo si también se encuentran en el grupo datacenter1:
242 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
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.
Este ejemplo coincide con todos los hosts definidos en el grupo datacenter, con la excepción de
test2.example.com, dado el inventario de ejemplo:
El último ejemplo muestra el uso de un patrón de host que coincide con todos los hosts del
inventario de prueba, con la excepción de los hosts administrados en el grupo datacenter1.
Referencias
Trabajo con patrones — Documentación de Ansible
https://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html
RH294-RHEL8.0-es-1-20200501 243
capítulo 7 | Administración de proyectos grandes
Ejercicio Guiado
Resultados
Podrá usar diferentes patrones de hosts para acceder a diversos hosts en un inventario.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
[student@workstation projects-host]$ ls
ansible.cfg inventory1 inventory2 playbook.yml
srv1.example.com
srv2.example.com
s1.lab.example.com
s2.lab.example.com
[web]
jupiter.lab.example.com
saturn.example.com
[db]
db1.example.com
db2.example.com
244 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
db3.example.com
[lb]
lb1.lab.example.com
lb2.lab.example.com
[boston]
db1.example.com
jupiter.lab.example.com
lb2.lab.example.com
[london]
db2.example.com
db3.example.com
file1.lab.example.com
lb1.lab.example.com
[dev]
web1.lab.example.com
db3.example.com
[stage]
file2.example.com
db2.example.com
[prod]
lb2.lab.example.com
db1.example.com
jupiter.lab.example.com
[function:children]
web
db
lb
city
[city:children]
boston
london
environments
[environments:children]
dev
stage
prod
new
[new]
172.25.252.23
172.25.252.44
172.25.252.32
RH294-RHEL8.0-es-1-20200501 245
capítulo 7 | Administración de proyectos grandes
workstation.lab.example.com
[london]
servera.lab.example.com
[berlin]
serverb.lab.example.com
[tokyo]
serverc.lab.example.com
[atlanta]
serverd.lab.example.com
[europe:children]
london
berlin
---
- name: Resolve host patterns
hosts:
tasks:
- name: Display managed host name
debug:
msg: "{{ inventory_hostname }}"
4. Con un comando ad hoc, use el grupo all para mostrar todos los hosts administrados en el
archivo de inventario inventory1.
246 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
5. Con un comando ad hoc, use el carácter asterisco (*) para enumerar todos los hosts que
terminan en .example.com en el archivo de inventario inventory1.
6. Como puede ver en la salida del comando anterior, hay 14 hosts en el dominio
*.example.com. Modifique el patrón de host en el comando ad hoc anterior para que se
ignoren los hosts del dominio *.lab.example.com.
RH294-RHEL8.0-es-1-20200501 247
capítulo 7 | Administración de proyectos grandes
db3.example.com
file2.example.com
srv1.example.com
srv2.example.com
7. Sin acceder a los grupos del archivo de inventario inventory1, use un comando ad hoc
para hacer una lista de estos tres hosts: lb1.lab.example.com, s1.lab.example.com
y db1.example.com.
8. Use un patrón de host comodín en un comando ad hoc para hacer una lista de hosts
que comiencen con una dirección IP 172.25. Dirección IP en el archivo de inventario
inventory1.
9. Use un patrón de host en un comando ad hoc para enumerar todos los hosts del archivo de
inventario inventory1 que comienzan con la letra "s".
10. Con una lista y un patrón de host comodín en un comando ad hoc, muestre todos los hosts
en el inventario inventory1 del grupo prod, todos los hosts cuya dirección IP comienza
con 172 y todos los hosts que contienen lab en su nombre.
248 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
db1.example.com
jupiter.lab.example.com
172.25.252.23
172.25.252.44
172.25.252.32
lb1.lab.example.com
file1.lab.example.com
web1.lab.example.com
s1.lab.example.com
s2.lab.example.com
11. Use un comando ad hoc para listar todos los hosts que pertenecen a los grupos db y
london.
12. Modifique el valor de hosts en el archivo playbook.yml para que todos los servidores
en el grupo london sean el objetivo. Ejecute la guía usando el archivo de inventario
inventory2.
...output omitted...
hosts: london
...output omitted...
13. Modifique el valor de hosts en el archivo playbook.yml para que todos los servidores en
el grupo anidado europe sean el objetivo. Ejecute la guía usando el archivo de inventario
inventory2.
...output omitted...
hosts: europe
...output omitted...
RH294-RHEL8.0-es-1-20200501 249
capítulo 7 | Administración de proyectos grandes
14. Modifique el valor de hosts en el archivo playbook.yml para que todos los servidores
que no pertenecen a ningún grupo sean el objetivo. Ejecute la guía usando el archivo de
inventario inventory2.
...output omitted...
hosts: ungrouped
...output omitted...
Finalizar
En workstation, ejecute el script lab projects-host finish para limpiar este ejercicio.
250 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Objetivos
Después de finalizar esta sección, será capaz de describir qué son los inventarios dinámicos, e
instalar y usar un script existente como fuente de inventario dinámico de Ansible.
La mayoría de los entornos de TI tienen sistemas que hacen un seguimiento de los hosts que
están disponibles y del modo en que están organizados. Por ejemplo, puede haber un servicio de
directorio externo mantenido por un sistema de monitoreo, como Zabbix, o en servidores FreeIPA
o Active Directory. Los servidores de instalación, como Cobbler, o los servicios de administración,
como Red Hat Satellite, pueden hacer un seguimiento de los sistemas sin sistema operativo (bare-
metal) implementados. De manera similar, los servicios de nube, como Amazon Web Services EC2,
o una implementación de OpenStack, o las infraestructuras de máquinas virtuales basadas en
VMware o Red Hat Virtualization pueden ser fuentes de información acerca de las instancias y las
máquinas virtuales que van y vienen.
Ansible admite scripts dynamic inventory que recuperan información actual de estos tipos de
fuentes siempre que se ejecuta Ansible, lo que permite que el inventario se actualice en tiempo
real. Estos scripts son programas ejecutables que recopilan información de algunas fuentes
externas y proporcionan el inventario en formato JSON.
Los scripts de inventario dinámico se usan igual que los archivos de texto de inventario estático.
La ubicación del inventario se especifica directamente en el archivo ansible.cfg actual, o con
la opción -i. Si el archivo de inventario es ejecutable, se trata como un programa de inventario
dinámico, y Ansible intenta ejecutarlo para generar el inventario. Si el archivo no es ejecutable, se
trata como un inventario estático.
nota
La ubicación del inventario se puede configurar en el archivo de configuración
ansible.cfg con el parámetro inventory. De forma predeterminada, se
configura en /etc/ansible/hosts.
Scripts aportados
La comunidad de código abierto aportó varios scripts de inventario dinámico existentes al
proyecto de Ansible. No están incluidos en el paquete ansible ni son admitidos oficialmente por
Red Hat. Estos scripts están disponibles en el sitio de Ansible GitHub en https://github.com/
ansible/ansible/tree/devel/contrib/inventory.
Algunas de las fuentes de datos o plataformas a las que apuntan los scripts de inventario dinámico
aportados incluyen las siguientes:
RH294-RHEL8.0-es-1-20200501 251
capítulo 7 | Administración de proyectos grandes
• Plataformas de nube pública, como Rackspace Cloud, Amazon Web Services EC2 o Google
Compute Engine.
• Herramientas de administración del ciclo de vida, como Foreman (con Red Hat Satellite 6 o
autónomo) y Spacewalk (innovación de Red Hat Satellite 5).
Cada script puede tener sus propias dependencias y sus propios requisitos para funcionar. Los
scripts aportados están escritos mayormente en Python, pero esto no es un requisito para los
scripts de inventario dinámico.
El comando ansible-inventory puede ser una herramienta útil para aprender a crear
inventarios de Ansible en formato JSON. Puede usar el comando ansible-inventory,
disponible desde Ansible 2.4, para ver un archivo de inventario en formato JSON.
Para mostrar el contenido del archivo de inventario en formato JSON, ejecute el comando
ansible-inventory --list. Puedes usar la opción -i para especificar la ubicación del
archivo de inventario para procesar, o simplemente usar el inventario predeterminado establecido
por la configuración actual de Ansible.
[webservers]
web1.lab.example.com
web2.lab.example.com
[databases]
db1.lab.example.com
db2.lab.example.com
252 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
}
},
"all": {
"children": [
"databases",
"ungrouped",
"webservers"
]
},
"databases": {
"hosts": [
"db1.lab.example.com",
"db2.lab.example.com"
]
},
"ungrouped": {
"hosts": [
"workstation1.lab.example.com"
]
},
"webservers": {
"hosts": [
"web1.lab.example.com",
"web2.lab.example.com"
]
}
}
Si desea escribir su propio script de inventario dinámico, puede encontrar más información
detallada en Desarrollo de fuentes de inventario dinámico [http://docs.ansible.com/ansible/
dev_guide/developing_inventory.html] dentro de la Guía para desarrolladores Ansible. A
continuación, se incluye una breve descripción general.
Inicie el script con una línea de intérprete adecuada (por ejemplo, #!/usr/bin/python) y
debería ser ejecutable para que lo pueda ejecutar Ansible.
Cuando se pase la opción --list, el script debe mostrar un diccionario/hash con codificación
JSON de todos los hosts y grupos en el inventario.
En su forma más simple, un grupo puede ser una lista de hosts administrados. En este ejemplo de
una salida con codificación JSON de un script de inventario, webservers es un grupo de hosts
que tiene web1.lab.example.com y web2.lab.example.com como hosts administrados
en el grupo. El grupo de hosts databases incluye los hosts db1.lab.example.com y
db2.lab.example.com como miembros.
De forma alternativa, el valor de cada grupo puede ser un diccionario/hash JSON que contenga
una lista de cada host administrado, los grupos secundarios y todas las variables de grupo que
se puedan establecer. El siguiente ejemplo muestra la salida con codificación JSON para un
RH294-RHEL8.0-es-1-20200501 253
capítulo 7 | Administración de proyectos grandes
inventario dinámico más complejo. El grupo boston tiene dos grupos secundarios (backup e
ipa), tres hosts administrados propios y una variable de grupo establecida (example_host:
false).
{
"webservers" : [
"web1.demo.example.com",
"web2.demo.example.com"
],
"boston" : {
"children" : [
"backup",
"ipa"
],
"vars" : {
"example_host" : false
},
"hosts" : [
"server1.demo.example.com",
"server2.demo.example.com",
"server3.demo.example.com"
]
},
"backup" : [
"server4.demo.example.com"
],
"ipa" : [
"server5.demo.example.com"
],
"_meta" : {
"hostvars" : {
"server5.demo.example.com": {
"ntpserver": "ntp.demo.example.com",
"dnsserver": "dns.demo.example.com"
}
}
}
}
El script también debe respaldar la opción --host managed-host. Dicha opción debe imprimir
un diccionario/hash JSON que consta de variables asociadas con ese host, o un diccionario/hash
JSON vacío.
254 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
nota
Cuando se lo llama con la opción --host hostname, el script debe imprimir un
diccionario/hash JSON de las variables para el host especificado. Se puede imprimir
un hash o diccionario JSON vacío si no se proporcionan variables.
Los archivos de inventario no dependen de otros archivos o scripts de inventario para resolverse.
Por ejemplo, si un archivo de inventario estático especifica que un grupo en particular debe ser
un elemento secundario de otro grupo, también debe tener una entrada de marcador de posición
para dicho grupo, aunque todos los miembros de ese grupo provengan del inventario dinámico.
Considere el grupo cloud-east en el siguiente ejemplo:
[cloud-east]
[servers]
test.demo.example.com
[servers:children]
cloud-east
Esto garantiza que sin importar el orden en que se analizan los archivos de inventario, todos ellos
son internamente consistentes.
nota
En la documentación no se especifica el orden en que se analizan los archivos de
inventario. Actualmente, cuando existen múltiples archivos de inventario, se los
analiza en orden alfabético. Si una fuente de inventario depende de la información
de otra fuente de inventario, entonces el orden en que se cargan puede determinar
si el archivo de inventario funciona como se espera o arroja un error. Por lo tanto,
es importante asegurarse de que todos los archivos sean coherentes para evitar
errores inesperados.
RH294-RHEL8.0-es-1-20200501 255
capítulo 7 | Administración de proyectos grandes
Referencias
Trabajo con inventario dinámico: Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html
256 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Ejercicio Guiado
Resultados
Usted podrá instalar y usar scripts de inventario dinámico existentes.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
[defaults]
inventory = inventory
RH294-RHEL8.0-es-1-20200501 257
capítulo 7 | Administración de proyectos grandes
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
hosts (0):
258 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
10. Ejecute el siguiente comando para verificar la lista de hosts en el grupo webservers. Se
produce un error porque el grupo webservers no está definido.
hosts (1):
servera.lab.example.com
11. Para evitar este problema, el inventario estático debe tener una entrada de marcador de
posición que define un grupo de hosts webservers vacío. Es importante que el inventario
RH294-RHEL8.0-es-1-20200501 259
capítulo 7 | Administración de proyectos grandes
estático defina el grupo de hosts al cual hace referencia, dado que es posible que pueda
desaparecer dinámicamente de la fuente externa, lo que podría provocar este error.
Edite el archivo /home/student/projects-inventory/inventory/hosts para que
incluya el siguiente contenido:
[webservers]
[servers:children]
webservers
Importante
Si el script de inventario dinámico que proporciona el grupo de hosts lleva un
nombre que hace que quede ordenado antes del inventario estático que hace
referencia a este, entonces no verá este error. Sin embargo, si en algún momento el
grupo de hosts desaparece del inventario dinámico, y usted no tiene un marcador
de posición, el inventario estático estará haciendo referencia a un grupo de hosts
faltante y el error interrumpirá el análisis del inventario.
12. Vuelva a ejecutar el siguiente comando para verificar la lista de hosts en el grupo
webservers. Debe funcionar sin errores.
Finalizar
En workstation, ejecute el comando lab projects-inventory finish para limpiar este
ejercicio.
260 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Objetivos
Después de finalizar esta sección, deberá ser capaz de ajustar la cantidad de conexiones
simultáneas que Ansible abre a los hosts administrados, así como la manera en que Ansible
procesa grupos de hosts administrados a través de las tareas de la reproducción.
En teoría, Ansible podría conectarse simultáneamente a todos los hosts en la reproducción para
cada tarea. Esto funciona bien para pequeñas listas de hosts. Sin embargo, si la reproducción se
dirige a cientos de hosts, esto puede suponer una gran carga para el nodo de control.
El número máximo de conexiones simultáneas que Ansible hace es controlado por el parámetro
forks en el archivo de configuración Ansible. Se establece en 5 de forma predeterminada, lo que
puede verificarse con uno de los siguientes.
Por ejemplo, suponga que un nodo de control de Ansible está configurado con el valor
predeterminado de cinco bifurcaciones y la reproducción tiene diez hosts administrados. Ansible
ejecutará la primera tarea en la reproducción en los primeros cinco hosts administrados, seguido
de una segunda ronda de ejecución de la primera tarea en los otros cinco hosts administrados.
Después de que la primera tarea se haya ejecutado en todos los hosts administrados, Ansible
procederá a ejecutar la siguiente tarea en todos los hosts administrados en grupos de cinco hosts
a la vez. Ansible hará esto con cada tarea por turno hasta que la reproducción termine.
El valor predeterminado para forks va a ser muy conservador. Si su nodo de control está
administrando hosts de Linux, la mayoría de las tareas se ejecutarán en los hosts administrados y
RH294-RHEL8.0-es-1-20200501 261
capítulo 7 | Administración de proyectos grandes
el nodo de control tendrá menos carga. En este caso, normalmente se puede configurar forks a
un valor mucho más alto, posiblemente más cercano a 100, y ver mejoras en el rendimiento.
Si sus guías ejecutan una gran cantidad de código en el nodo de control, entonces deberá
aumentar el límite de la bifurcación con sensatez. Si usa Ansible para administrar enrutadores
y switches de red, entonces la mayoría de esos módulos se ejecutan en el nodo de control y no
en el dispositivo de red. Debido a la mayor carga que esto impone sobre el nodo de control, su
capacidad para soportar aumentos en el número de bifurcaciones será significativamente menor
que para un nodo de control que solo administre hosts Linux.
Sin embargo, ejecutar todas las tareas en todos los hosts puede provocar un comportamiento
no deseado. Por ejemplo, si la reproducción actualiza un grupo de servidores web con carga
balanceada, es posible que tenga que poner fuera de servicio cada servidor web mientras se
realiza la actualización. Si todos los servidores se actualizan en la misma reproducción, todos
podrían estar fuera de servicio al mismo tiempo.
Una forma de evitar este problema es usar la palabra clave serial para ejecutar los hosts a través
de la reproducción en lotes. Cada lote de hosts se ejecutará durante toda la reproducción antes de
que se inicie el siguiente lote.
---
- name: Rolling update
hosts: webservers
serial: 2
tasks:
- name: latest apache httpd package is installed
yum:
name: httpd
state: latest
notify: restart apache
handlers:
- name: restart apache
service:
name: httpd
state: restarted
262 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Supongamos que el grupo webservers del ejemplo anterior contiene cinco servidores web
que residen detrás de un equilibrador de carga. Con el parámetro serial establecido en 2,
la reproducción ejecutará hasta dos servidores web a la vez. Por ende, la mayoría de los cinco
servidores web estarán siempre disponibles.
Importante
Para ciertos propósitos, cada lote de hosts cuenta como si fuera una reproducción
completa ejecutándose en un subconjunto de hosts. Esto significa que si falla un
lote completo, la reproducción falla, lo que hace que la ejecución de la guía falle.
La palabra clave serial también se puede especificar como un porcentaje. Este porcentaje
se aplica al número total de hosts en la reproducción para determinar el tamaño del lote de la
actualización sucesiva. Independientemente del porcentaje, el número de hosts por pase será
siempre 1 o mayor.
Referencias
Actualización continua del tamaño del lote — Delegación, Actualizaciones
continuas y Acciones locales — Documentación Ansible
http://docs.ansible.com/ansible/playbooks_delegation.html#rolling-update-batch-
size
RH294-RHEL8.0-es-1-20200501 263
capítulo 7 | Administración de proyectos grandes
Ejercicio Guiado
Resultados
Podrá ajustar las ejecuciones paralelas y en serie de una guía en múltiples hosts
administrados.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
1.1. Revise el contenido del archivo ansible.cfg. Tenga en cuenta que el archivo de
inventario se establece en inventory. Tenga en cuenta también que el parámetro
forks se establece en 4.
[defaults]
inventory=inventory
remote_user=devops
forks=4
...output omitted...
1.2. Revise el contenido del archivo inventory. Tenga en cuenta que contiene un grupo
de hosts, webservers, que contiene cuatro hosts.
[webservers]
servera.lab.example.com
serverb.lab.example.com
serverc.lab.example.com
serverd.lab.example.com
264 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
---
- name: Update web server
hosts: webservers
tasks:
- name: Lastest httpd package installed
yum:
name: httpd
state: latest
notify:
- Restart httpd
handlers:
- name: Restart httpd
service:
name: httpd
enabled: yes
state: restarted
---
- hosts: webservers
tasks:
- service:
name: httpd
enabled: no
state: stopped
- yum:
name: httpd
state: absent
2. Ejecute la guía playbook.yml, usando el comando time para determinar cuánto tarda
en ejecutarse la guía. Mire la guía mientras se ejecuta. Observe cómo Ansible realiza cada
tarea en los cuatro hosts al mismo tiempo.
...output omitted...
RH294-RHEL8.0-es-1-20200501 265
capítulo 7 | Administración de proyectos grandes
real 0m22.701s
user 0m23.275s
sys 0m2.637s
[defaults]
inventory=inventory
remote_user=devops
forks=1
...output omitted...
...output omitted...
real 0m37.853s
user 0m22.414s
sys 0m4.749s
266 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
[defaults]
inventory=inventory
remote_user=devops
forks=2
...output omitted...
---
- name: Update web server
hosts: webservers
serial: 2
9. Vuelva a ejecutar la guía playbook.yml. Mire la guía mientras se ejecuta. Observe cómo
Ansible ejecuta la reproducción completa en solo dos hosts antes de volver a ejecutar la
reproducción en los dos hosts restantes.
...output omitted...
...output omitted...
10. Ejecute la guía remove_apache.yml para detener y deshabilitar el servicio httpd y para
eliminar el paquete httpd.
RH294-RHEL8.0-es-1-20200501 267
capítulo 7 | Administración de proyectos grandes
[defaults]
inventory=inventory
remote_user=devops
forks=4
...output omitted...
---
- name: Update web server
hosts: webservers
serial: 3
13. Vuelva a ejecutar la guía playbook.yml. Mire la guía mientras se ejecuta. Observe cómo
Ansible ejecuta la reproducción completa en solo tres hosts y, luego, vuelve a ejecutar la
reproducción en el host restante.
...output omitted...
...output omitted...
Finalizar
En workstation, ejecute el comando lab projects-parallelism finish para limpiar
este ejercicio.
268 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
RH294-RHEL8.0-es-1-20200501 269
capítulo 7 | Administración de proyectos grandes
Objetivos
Tras finalizar esta sección, podrá administrar guías grandes importando o incluyendo otros guías o
tareas desde archivos externos, ya sea sin condiciones o sobre la base de una prueba condicional.
Cuando incluye contenido, es una operación dinámica. Los procesos de Ansible incluyeron
contenido durante la ejecución de la guía, a medida que se abordaba el contenido.
Cuando importa contenido, es una operación estática. Los preprocesos de Ansible importaron
contenido cuando se analizó inicialmente la guía, antes de que comience la ejecución.
Importación de guías
La palabra clave import_playbook le permite importar archivos externos que contienen listas
de reproducciones en una guía. En otras palabras, puede tener una guía maestra que importa una
o más guías adicionales.
Debido a que el contenido que se importa es una guía completa, la función import_playbook
solo se puede usar en el nivel superior de una guía y no se puede usar dentro de una reproducción.
Si importa varias guías, se importarán y ejecutarán en orden.
A continuación se muestra un ejemplo simple de una guía maestra que importa dos guías
adicionales:
270 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
- name: Play 1
hosts: localhost
tasks:
- debug:
msg: Play 1
---
- name: Install web server
hosts: webservers
tasks:
- import_tasks: webserver_tasks.yml
Cuando importa un archivo de tareas, las tareas de ese archivo se insertan directamente cuando
se analiza la guía. Debido a que import_tasks importa de forma estática las tareas cuando se
analiza la guía, hay algunos efectos sobre cómo funciona.
• Si usa una variable para especificar el nombre del archivo por importar, no puede usar una
variable de inventario de host o grupo.
RH294-RHEL8.0-es-1-20200501 271
capítulo 7 | Administración de proyectos grandes
---
- name: Install web server
hosts: webservers
tasks:
- include_tasks: webserver_tasks.yml
• No puede usar una declaración notify para desencadenar un nombre de controlador que
se encuentra en un archivo de tarea incluido. Puede desencadenar un controlador en la guía
principal que incluye un archivo de tareas completo, en cuyo caso se ejecutarán todas las tareas
en el archivo incluido.
nota
Puede encontrar un análisis más detallado de las diferencias de comportamiento
entre import_tasks e include_tasks cuando se usan condicionales
en "Condicionales" [https://docs.ansible.com/ansible/latest/user_guide/
playbooks_conditionals.html#applying-when-to-roles-imports-and-includes] en la
Guía del usuario Ansible.
• Si los servidores nuevos requieren una configuración completa, los administradores pueden
crear diferentes conjuntos de tareas para crear usuarios, instalar paquetes, configurar servicios,
configurar privilegios, configurar el acceso a un sistema de archivos compartido, reforzar los
servidores, instalar actualizaciones de seguridad e instalar un agente de monitoreo. Cada uno
de estos conjuntos de tareas se puede administrar a través de un archivo autónomo de tareas
separado.
272 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
• Si un grupo de servidores tiene que ejecutar una tarea o un conjunto de tareas en particular, las
tareas solo se pueden ejecutar en un servidor si este es parte de un grupo específico de hosts.
Por ejemplo, el siguiente archivo de tareas instala el paquete necesario para un servicio web y,
luego, habilita e inicia el servicio requerido.
---
- name: Install the httpd package
yum:
name: httpd
state: latest
- name: Start the httpd service
service:
name: httpd
enabled: true
state: started
---
- name: Install the {{ package }} package
yum:
name: "{{ package }}"
state: latest
- name: Start the {{ service }} service
service:
name: "{{ service }}"
enabled: true
state: started
RH294-RHEL8.0-es-1-20200501 273
capítulo 7 | Administración de proyectos grandes
Posteriormente, al incorporar el archivo de tareas en una guía, defina las variables que se usarán
para la ejecución de la tarea de la siguiente manera:
...output omitted...
tasks:
- name: Import task file and set variables
import_tasks: task.yml
vars:
package: httpd
service: service
Ansible hace que las variables transferidas estén disponibles para las tareas importadas desde el
archivo externo.
Puede usar la misma técnica para hacer que los archivos de reproducción sean más reutilizables. Al
incorporar un archivo de reproducción en una guía, se transfieren las variables que se usarán para
la ejecución de la reproducción de la siguiente manera:
...output omitted...
- name: Import play file and set the variable
import_playbook: play.yml
vars:
package: mariadb
Importante
Las versiones anteriores de Ansible usaban una función include para incluir guías
y archivos de tareas, según el contexto. Esta función está en desuso por varios
motivos.
Por esto, include fue reemplazado en Ansible 2.4 con nuevas directivas, como
include_tasks, import_tasks e import_playbook. Podría encontrar
ejemplos de include en guías más antiguas, pero debe evitar usarlo en otras más
nuevas.
Referencias
Inclusión e importación & mdash; Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_includes.html
274 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Ejercicio Guiado
Resultados
Será capaz de incluir archivos de guías y tareas en las guías.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
RH294-RHEL8.0-es-1-20200501 275
capítulo 7 | Administración de proyectos grandes
yum:
name: "{{ firewall_pkg }}"
state: latest
3. Revise el contenido del archivo test.yml en el subdirectorio plays. Este archivo contiene
una reproducción que prueba las conexiones a un servicio web.
---
- name: Test web service
hosts: localhost
become: no
tasks:
- name: connect to internet web server
uri:
url: "{{ url }}"
status_code: 200
---
- name: Configure web server
hosts: servera.lab.example.com
276 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Defina las variables necesarias para instalar el paquete httpd y para habilitar e iniciar el
servicio httpd. Importe el segundo conjunto de tareas del archivo de tareas tasks/
firewall.yml. Defina las variables necesarias para instalar el paquete firewalld a fin de
habilitar e iniciar el servicio firewalld, y permitir las conexiones http. Importe el tercer
conjunto de tareas desde el archivo de tareas tasks/placeholder.yml.
tasks:
- name: Include the environment task file and set the variables
include_tasks: tasks/environment.yml
vars:
package: httpd
service: httpd
when: ansible_facts['os_family'] == 'RedHat'
- name: Import the firewall task file and set the variables
import_tasks: tasks/firewall.yml
vars:
firewall_pkg: firewalld
firewall_svc: firewalld
rule:
- http
- https
- name: Import the placeholder task file and set the variable
import_tasks: tasks/placeholder.yml
vars:
file: /var/www/html/index.html
RH294-RHEL8.0-es-1-20200501 277
capítulo 7 | Administración de proyectos grandes
6.2. La guía deberá verse de la siguiente manera después de que se completen los
cambios:
---
- name: Configure web server
hosts: servera.lab.example.com
tasks:
- name: Include the environment task file and set the variables
include_tasks: tasks/environment.yml
vars:
package: httpd
service: httpd
when: ansible_facts['os_family'] == 'RedHat'
- name: Import the firewall task file and set the variables
import_tasks: tasks/firewall.yml
vars:
firewall_pkg: firewalld
firewall_svc: firewalld
rule:
- http
- https
- name: Import the placeholder task file and set the variable
import_tasks: tasks/placeholder.yml
vars:
file: /var/www/html/index.html
playbook: playbook.yml
278 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Finalizar
En workstation, ejecute el script lab projects-file finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 279
capítulo 7 | Administración de proyectos grandes
Trabajo de laboratorio
Resultados
Puede simplificar las referencias de host administradas en una guía especificando patrones
de host frente a un inventario dinámico. También debe ser capaz de reestructurar una guía
para que las tareas se importen desde archivos de tareas externos y ajustar la guía para
actualizaciones continuas.
Instrucciones
Ha heredado una guía del administrador anterior. La guía se usa para configurar el
servicio web en servera.lab.example.com, serverb.lab.example.com,
serverc.lab.example.com y serverd.lab.example.com. En la guía, también se
configura el firewall en los cuatro hosts administrados para permitir el tráfico web.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
Realice los siguientes cambios en el archivo de la guía playbook.yml para que sea más fácil de
administrar y ajústelo para que las ejecuciones futuras usen actualizaciones continuas a fin de
evitar que los cuatro servidores web estén no disponibles al mismo tiempo.
1. Simplifique la lista de hosts administrados en la guía usando un patrón de host comodín. Use
el script de inventario dinámico inventory/inventory.py para verificar el patrón de host
comodín.
2. Reestructure la guía para que las tres primeras tareas de la guía se guarden en un archivo de
tareas externo ubicado en tasks/web_tasks.yml. Use la función import_tasks para
incorporar este archivo de tareas en la guía.
3. Reestructure la guía para que la cuarta, quinta y sexta tareas en la guía se guarden en un
archivo de tareas externo ubicado en tasks/firewall_tasks.yml. Use la característica
import_tasks para incorporar este archivo de tareas en la guía.
4. Hay algunas tareas duplicadas entre los archivos tasks/web_tasks.yml y tasks/
firewall_tasks.yml. Mueva las tareas que instalan paquetes y habilitan servicios a un
archivo nuevo llamado tasks/install_and_enable.yml y actualícelos para que usen
280 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Evaluación
En workstation, ejecute el comando lab projects-review grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab projects-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 281
capítulo 7 | Administración de proyectos grandes
Solución
Resultados
Puede simplificar las referencias de host administradas en una guía especificando patrones
de host frente a un inventario dinámico. También debe ser capaz de reestructurar una guía
para que las tareas se importen desde archivos de tareas externos y ajustar la guía para
actualizaciones continuas.
Instrucciones
Ha heredado una guía del administrador anterior. La guía se usa para configurar el
servicio web en servera.lab.example.com, serverb.lab.example.com,
serverc.lab.example.com y serverd.lab.example.com. En la guía, también se
configura el firewall en los cuatro hosts administrados para permitir el tráfico web.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
Realice los siguientes cambios en el archivo de la guía playbook.yml para que sea más fácil de
administrar y ajústelo para que las ejecuciones futuras usen actualizaciones continuas a fin de
evitar que los cuatro servidores web estén no disponibles al mismo tiempo.
1. Simplifique la lista de hosts administrados en la guía usando un patrón de host comodín. Use
el script de inventario dinámico inventory/inventory.py para verificar el patrón de host
comodín.
282 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
...output omitted...
[student@workstation projects-review]$ ll
total 16
-rw-rw-r--. 1 student student 33 Dec 19 00:48 ansible.cfg
drwxrwxr-x. 2 student student 4096 Dec 18 22:35 files
drwxrwxr-x. 2 student student 4096 Dec 19 01:18 inventory
-rw-rw-r--. 1 student student 959 Dec 18 23:48 playbook.yml
[student@workstation projects-review]$ ll inventory/
total 4
-rwxrwxr-x. 1 student student 612 Dec 19 01:18 inventory.py
---
- name: Install and configure web service
hosts: server*.lab.example.com
...output omitted...
2. Reestructure la guía para que las tres primeras tareas de la guía se guarden en un archivo de
tareas externo ubicado en tasks/web_tasks.yml. Use la función import_tasks para
incorporar este archivo de tareas en la guía.
2.2. Coloque el contenido de las tres primeras tareas en la guía playbook.yml dentro del
archivo tasks/web_tasks.yml. El archivo de tareas deberá incluir lo siguiente:
RH294-RHEL8.0-es-1-20200501 283
capítulo 7 | Administración de proyectos grandes
---
- name: Install httpd
yum:
name: httpd
state: latest
2.3. Elimine las tres primeras tareas de la guía playbook.yml y coloque las siguientes
líneas en su lugar para importar el archivo de tareas tasks/web_tasks.yml.
3. Reestructure la guía para que la cuarta, quinta y sexta tareas en la guía se guarden en un
archivo de tareas externo ubicado en tasks/firewall_tasks.yml. Use la característica
import_tasks para incorporar este archivo de tareas en la guía.
3.1. Coloque el contenido de las tres tareas restantes en la guía playbook.yml dentro del
archivo tasks/firewall_tasks.yml. El archivo de tareas deberá incluir lo siguiente.
---
- name: Install firewalld
yum:
name: firewalld
state: latest
284 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
immediate: true
permanent: true
state: enabled
3.2. Elimine las tres tareas restantes de la guía playbook.yml y coloque las siguientes
líneas en su lugar para importar el archivo de tareas tasks/firewall_tasks.yml.
---
- name: Install httpd
yum:
name: httpd
state: latest
---
- name: Install {{ package }}
yum:
name: "{{ package }}"
state: latest
RH294-RHEL8.0-es-1-20200501 285
capítulo 7 | Administración de proyectos grandes
---
- name: Install and start httpd
import_tasks: install_and_enable.yml
vars:
package: httpd
service: httpd
---
- name: Install and start firewalld
import_tasks: install_and_enable.yml
vars:
package: firewalld
service: firewalld
5. Debido a que el controlador para reiniciar el servicio httpd podría desencadenarse si hay
cambios futuros en el archivo files/tune.conf, implemente la función de actualización
periódica en la guía playbook.yml y establezca el tamaño del lote de actualización
periódica en dos hosts.
---
- name: Install and configure web service
hosts: server*.lab.example.com
serial: 2
...output omitted...
6. Verifique que los cambios en la guía playbook.yml se hayan hecho correctamente y, luego,
ejecute la guía.
---
- name: Install and configure web service
hosts: server*.lab.example.com
serial: 2
tasks:
- name: Import the web_tasks.yml task file
import_tasks: tasks/web_tasks.yml
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
6.2. Ejecute la guía con ansible-playbook --syntax-check para verificar que la guía
no contiene errores de sintaxis. Si hay errores presentes, corríjalos antes de proceder.
286 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
6.3. Ejecute la guía. La guía debe ejecutarse contra el host como una actualización
periódica con un tamaño de lote de dos hosts administrados.
RH294-RHEL8.0-es-1-20200501 287
capítulo 7 | Administración de proyectos grandes
Evaluación
En workstation, ejecute el comando lab projects-review grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab projects-review finish para limpiar los recursos
creados en este trabajo de laboratorio.
288 RH294-RHEL8.0-es-1-20200501
capítulo 7 | Administración de proyectos grandes
Resumen
En este capítulo, aprendió lo siguiente:
• Los patrones de host se usan para especificar los hosts administrados a los que debe apuntar
una reproducción o un comando ad hoc.
• Los scripts de inventario dinámico se pueden usar para generar listas dinámicas de hosts
administrados desde servicios de directorio u otras fuentes externas a Ansible.
• El parámetro serial se puede usar para implementar actualizaciones periódicas en los hosts
administrados definiendo la cantidad de hosts administrados en cada lote de actualizaciones
periódicas.
• Puede usar las funciones include_tasks o import_tasks para incorporar archivos de tareas
externos a las guías.
RH294-RHEL8.0-es-1-20200501 289
290 RH294-RHEL8.0-es-1-20200501
capítulo 8
RH294-RHEL8.0-es-1-20200501 291
capítulo 8 | Simplificación de guías con roles
Objetivos
Después de completar esta sección, debe ser capaz de describir qué es un rol, cómo está
estructurado y cómo puede usarlo en una guía.
Pero en el mundo real, esa reproducción puede ser larga y complejo, con muchos archivos
incluidos o importados, y con tareas y controladores para gestionar diversas situaciones. Copiar
todo ese código en otra guía podría ser un trabajo no menor.
Los roles de Ansible le proporcionan una forma de hacer que sea más fácil volver a usar el
código de Ansible de forma genérica. Puede empaquetar, en una estructura de directorios
estandarizada, todas las tareas, variables, archivos, plantillas y otros recursos necesarios para
brindar infraestructura o implementar aplicaciones. Copie ese rol de proyecto a proyecto
simplemente copiando el directorio. A continuación, puede simplemente llamar a ese rol desde
una reproducción para ejecutarlo.
Un rol bien escrito le permitirá pasar variables al rol de la guía que ajusta su comportamiento,
configurando todos los nombres de host, direcciones IP, nombres de usuario, secretos o
detalles que necesitas, específicos para el sitio y de la ubicación. Por ejemplo, una función para
implementar un servidor de base de datos podría haber sido escrita para admitir variables que
configuran el nombre de host, el usuario administrador de la base de datos y la contraseña, y otros
parámetros que necesitan personalización para su instalación. El autor del rol también puede
garantizar que se establezcan valores predeterminados razonables para esas variables si elige no
establecerlas en la reproducción.
• 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
Además de escribir, usar, volver a usar y compartir sus propios roles, puede obtener roles de otras
fuentes. Algunos roles se incluyen como parte de Red Hat Enterprise Linux, en el paquete rhel-
system-roles. También puede obtener muchos roles respaldados por la comunidad del sitio web de
Ansible Galaxy. Más adelante en este capítulo, aprenderá más sobre estos roles.
292 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Subdirectorio Función
files Este directorio contiene archivos estáticos a los que hacen referencia
las tareas de los roles.
templates Este directorio contiene plantillas Jinja2 a las que hacen referencia las
tareas de los roles.
RH294-RHEL8.0-es-1-20200501 293
capítulo 8 | Simplificación de guías con roles
Subdirectorio Función
tests Este directorio puede contener un inventario y una guía test.yml que
se pueden utilizar para probar un rol.
Importante
Los roles no deben tener datos específicos del sitio en ellos. Definitivamente no
deben contener ningún secreto como contraseñas o claves privadas.
Esto se debe a que se supone que los roles son genéricos, reutilizables y se pueden
compartir libremente. Los detalles específicos del sitio no deben ser codificados en
ellos.
Los secretos deben proporcionarse al rol a través de otros medios. Esta es una de
las razones por las que puede querer establecer variables de rol al llamar a un rol.
Las variables de rol establecidas en la reproducción podrían proporcionar el secreto,
o apuntar a un archivo cifrado por Ansible Vault que contenga el secreto.
294 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
---
- hosts: remote.example.com
roles:
- role1
- role2
Por cada rol especificado, las tareas, los manejadores, las variables y las dependencias de los
roles se importarán a una guía, en ese orden. Cualquier tarea de copy, script, template, o
include_tasks/import_tasks en el rol puede hacer referencia a los archivos, plantillas o
tareas pertinentes en el rol sin nombres de ruta absolutos o relativos. Ansible los busca en los
subdirectorios files templates o tasks del rol, respectivamente.
Cuando usa una sección de roles para importar roles a una reproducción, los roles se ejecutarán
primero, antes que cualquier tarea que defina para esa reproducción.
En el siguiente ejemplo, se establecen valores para dos variables de rol de role2, var1 y var2.
Las variables defaults y vars se anulan cuando se usa role2.
---
- hosts: remote.example.com
roles:
- role: role1
- role: role2
var1: val1
var2: val2
Otra sintaxis de YAML equivalente que puede ver en este caso es:
---
- hosts: remote.example.com
roles:
- role: role1
- { role: role2, var1: val1, var2: val2 }
Hay situaciones en las que esto puede ser más difícil de leer, aunque sea más compacto.
Importante
Las variables de rol establecidas en línea (parámetros de rol), como en los ejemplos
anteriores, tienen precedencia muy alta. Anularán a la mayoría de las otras variables.
Tenga mucho cuidado de no volver a usar los nombres de las variables de rol que
establezca en línea en cualquier otro lugar de su reproducción, ya que los valores de
las variables de rol anularán las variables de inventario y las vars de la reproducción.
Cuando se agrega un rol a una reproducción, las tareas del rol se agregan al principio de la lista de
tareas. Si se incluye un segundo rol en una reproducción, su lista de tareas se agrega después del
primer rol.
RH294-RHEL8.0-es-1-20200501 295
capítulo 8 | Simplificación de guías con roles
Los manejadores de rol se agregan a las reproducciones de la misma manera que las tareas de
rol se agregan a las reproducciones. Cada reproducción define una lista de manejadores. Los
manejadores de rol se agregan primero a la lista de manejadores, seguidos de los manejadores
definidos en la sección handlers de la reproducción.
En ciertos escenarios, puede que algunas tareas de reproducción se deban ejecutar antes que
los roles. Para admitir tales escenarios, se puede configurar una sección pre_tasks en las
reproducciones. Todas las tareas detalladas en esta sección se ejecutan antes que los roles. Si
alguna de estas tareas notifica a un manejador, las tareas del manejador se ejecutan antes que los
roles o las tareas normales.
Las reproducciones también admiten una palabra clave post_tasks. Estas tareas se ejecutan
después de las tareas normales de la reproducción, y se ejecutan todos los manejadores que
notifican.
En el ejemplo anterior, una tarea debug se ejecuta en cada sección para notificar al manejador my
handler. La tarea my handler se ejecuta tres veces:
Los roles se pueden agregar a una reproducción con una tarea común, no solo incluyéndolos en la
sección roles de una reproducción. Use el módulo include_role para incluir dinámicamente
un rol y use el módulo import_role para importar estáticamente un rol.
La guía siguiente muestra cómo se puede incluir un rol usando una tarea con el módulo
include_role.
296 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
nota
El módulo include_role se agregó en Ansible 2.3, y el módulo import_role, en
Ansible 2.4.
Referencias
Roles — Documentación de Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
RH294-RHEL8.0-es-1-20200501 297
capítulo 8 | Simplificación de guías con roles
Cuestionario
4. ¿Qué archivo en la jerarquía de directorio de un rol debe contener los valores iniciales
de variables que se pueden usar como parámetros para el rol?
a. defaults/main.yml
b. meta/main.yml
c. vars/main.yml
d. El archivo del inventario del host.
298 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Solución
4. ¿Qué archivo en la jerarquía de directorio de un rol debe contener los valores iniciales
de variables que se pueden usar como parámetros para el rol?
a. defaults/main.yml
b. meta/main.yml
c. vars/main.yml
d. El archivo del inventario del host.
RH294-RHEL8.0-es-1-20200501 299
capítulo 8 | Simplificación de guías con roles
Objetivos
Tras haber completado esta sección, debe ser capaz de escribir guías que aprovechen los roles del
sistema de Red Hat Enterprise Linux para realizar operaciones estándares.
300 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Los roles del sistema apuntan a estandarizar la configuración de subsistemas de Red Hat
Enterprise Linux en varias versiones. Use los roles del sistema para configurar cualquier instancia
de Red Hat Enterprise Linux, versión 6.10 y posteriores.
Con los roles del sistema RHEL, los administradores ya no necesitan mantener los archivos de
configuración para ambos servicios. Los administradores pueden usar el rol rhel-system-
roles.timesync para configurar la sincronización de tiempo para hosts de Red Hat
Enterprise Linux 6 y 7. Un archivo YAML simplificado que contiene variables de roles define la
configuración de la sincronización de tiempo para ambos tipos de hosts.
Todos los roles del sistema están probados y son estables. Los roles de sistema totalmente
compatibles también tienen interfaces estables. Para cualquier rol de sistema totalmente
compatible , Red Hat se esforzará por garantizar que las variables del rol no se modifiquen en
futuras versiones. La refactorización de la guía debido a cambios en el rol del sistema debe ser
mínima.
Los roles de sistema Vista previa de tecnología pueden utilizar diferentes variables de rol
en versiones futuras. Se recomiendan pruebas de integración para guías que incorporan roles de
Vista previa de tecnología. Las guías pueden requerir refactorización si las variables de
rol cambian en una versión futura del rol.
Se están desarrollando otros roles en el proyecto de roles ascendentes de sistema de Linux, pero
aún no están disponibles a través de una suscripción de RHEL. Estos roles están disponibles a
través de Ansible Galaxy.
RH294-RHEL8.0-es-1-20200501 301
capítulo 8 | Simplificación de guías con roles
El nombre ascendente correspondiente de cada rol está vinculado al rol de sistema RHEL. Esto
permite que cualquiera de los dos nombres hagan referencia a un rol en una guía.
nota
Ansible podría no encontrar los roles de sistema si roles_path se ha anulado
en el archivo de configuración actual de Ansible, si la variable de entorno
ANSIBLE_ROLES_PATH está configurada o si hay otro rol con el mismo nombre en
un directorio listado anteriormente en roles_path.
El archivo README.md también describe las variables de rol que afectan el comportamiento del
rol. A menudo el archivo README.md contiene un fragmento de guía que muestra la configuración
de variables para un escenario de configuración común.
Algunos directorios de documentación de roles contienen ejemplos de guías. Cuando use un rol
por primera vez, revise las guías de ejemplo adicionales en el directorio de documentación.
302 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
La documentación de roles para los roles de sistema RHEL coincide con la documentación de
roles del sistema Linux. Use un navegador web para acceder a la documentación de roles para los
roles ascendentes en el sitio de Ansible Galaxy, https://galaxy.ansible.com.
Para configurar manualmente los servidores NTP, el rol tiene una variable llamada
timesync_ntp_servers. Se necesita una lista de servidores NTP para usarla. Cada ítem de la
lista se compone de uno o más atributos. A continuación se detallan los dos atributos clave:
atributos timesync_ntp_servers
Atributo Propósito
Dada esta información, el siguiente ejemplo es una reproducción que utiliza el rol rhel-system-
roles.timesync para configurar los hosts administrados a fin de obtener el tiempo de tres
servidores NTP utilizando la sincronización inicial rápida. Además, se ha agregado una tarea que
utiliza el módulo timezone para configurar la zona horaria de los hosts en UTC.
roles:
- rhel-system-roles.timesync
tasks:
RH294-RHEL8.0-es-1-20200501 303
capítulo 8 | Simplificación de guías con roles
nota
Si desea establecer una zona horaria diferente, puede utilizar el comando
tzselect para buscar otros valores aceptados. También puede usar el comando
timedatectl para comprobar la configuración actual del reloj.
Este ejemplo establece las variables de rol en una sección vars de la reproducción, pero una
mejor práctica sería configurarlas como variables de inventario para hosts o grupos de hosts.
Define las variables de sincronización temporal que anulan los valores predeterminados de rol
para los hosts en el grupo servers del inventario. A continuación se muestra un ejemplo de
cómo se vería este archivo:
timesync_ntp_servers:
- hostname: 0.rhel.pool.ntp.org
iburst: yes
- hostname: 1.rhel.pool.ntp.org
iburst: yes
- hostname: 2.rhel.pool.ntp.org
iburst: yes
timezone: UTC
Esta estructura separa claramente el rol, el código de la guía y los ajustes de configuración. El
código de la guía es simple, fácil de leer y no debe requerir una refactorización compleja. Red Hat
mantiene y admite el contenido del rol. Todas las configuraciones se manejan como variables de
inventario.
304 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Esta estructura también admite un entorno dinámico y heterogéneo. Los hosts con nuevos
requisitos de sincronización temporal se pueden colocar en un nuevo grupo de hosts. Las variables
apropiadas se definen en un archivo YAML y se colocan en el subdirectorio correspondiente
group_vars (o host_vars).
A continuación se detallan algunas de las tareas que puede realizar este rol:
RH294-RHEL8.0-es-1-20200501 305
capítulo 8 | Simplificación de guías con roles
selinux_state: enforcing
La variable selinux_booleans toma una lista de valores booleanos de SELinux para ajustarse.
Cada ítem de la lista es un hash/diccionario de variables: name del booleano, state (tanto en on
como en off), e independientemente de que el ajuste deba ser persistent en los reinicios.
selinux_booleans:
- name: 'httpd_enable_homedirs'
state: 'on'
persistent: 'yes'
En el siguiente ejemplo, se garantiza que 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.
selinux_fcontexts:
- target: '/srv/www(/.*)?'
setype: 'httpd_sys_content_t'
state: 'present'
selinux_restore_dirs:
- /srv/www
La variable selinux_ports toma una lista de puertos que deben tener un tipo específico de
SELinux.
selinux_ports:
- ports: '82'
setype: 'http_port_t'
proto: 'tcp'
state: 'present'
Existen otras variables y opciones para este rol. Consulte su archivo README.md para obtener más
información.
306 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Referencias
Roles de sistema de Red Hat Enterprise Linux (RHEL)
https://access.redhat.com/articles/3050101
RH294-RHEL8.0-es-1-20200501 307
capítulo 8 | Simplificación de guías con roles
Ejercicio Guiado
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
308 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
2. Instale los roles de sistema de Red Hat Enterprise Linux en el nodo de control,
workstation.lab.example.com. Verifique la ubicación de instalación de los roles en el
nodo de control.
2.1. Utilice el comando ansible-galaxy para verificar que no haya roles disponibles
inicialmente para su uso en el proyecto de guía.
• ./roles
• /usr/share/ansible/roles
• /etc/ansible/roles
2.3. Use el comando ansible-galaxy para verificar que los roles del sistema ahora
estén disponibles.
3. Cree una guía, configure_time.yml, con una reproducción orientada al grupo de hosts
database_servers. Incluya el rol rhel-system-roles.timesync en la sección
roles de la reproducción.
RH294-RHEL8.0-es-1-20200501 309
capítulo 8 | Simplificación de guías con roles
---
- name: Time Synchronization
hosts: database_servers
roles:
- rhel-system-roles.timesync
4. La documentación del rol contiene una descripción de cada variable del rol, incluido el valor
predeterminado de la variable. Determine las variables de rol que se anularán para cumplir
con los requisitos de sincronización temporal.
Coloque los valores de las variables de rol en un archivo denominado timesync.yml.
Debido a que los valores de estas variables se aplican a todos los hosts del inventario,
coloque el archivo timesync.yml en el subdirectorio group_vars/all.
4.1. Consulte la sección Variables de rol del archivo README.md para conocer el rol rhel-
system-roles.timesync.
...output omitted...
# List of NTP servers
timesync_ntp_servers:
- hostname: foo.example.com # Hostname or address of the server
minpoll: 4 # Minimum polling interval (default 6)
maxpoll: 8 # Maximum polling interval (default 10)
iburst: yes # Flag enabling fast initial synchronization
# (default no)
pool: no # Flag indicating that each resolved address
# of the hostname is a separate NTP server
# (default no)
...output omitted...
# Name of the package which should be installed and configured for NTP.
# Possible values are "chrony" and "ntp". If not defined, the currently active
# or enabled service will be configured. If no service is active or enabled, a
# package specific to the system and its version will be selected.
timesync_ntp_provider: chrony
...output omitted...
310 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
---
#rhel-system-roles.timesync variables for all hosts
timesync_ntp_provider: chrony
timesync_ntp_servers:
- hostname: classroom.example.com
iburst: yes
5. Agregue una tarea a configure_time.yml para establecer la zona horaria para cada
host. Asegúrese de que la tarea use el módulo timezone y se ejecute después del rol
rhel-system-roles.timesync.
Debido a que los hosts no pertenecen a la misma zona horaria, use una variable
(host_timezone) para el nombre de la zona horaria.
post_tasks:
- name: Set timezone
timezone:
name: "{{ host_timezone }}"
notify: restart crond
---
- name: Time Synchronization
hosts: database_servers
roles:
- rhel-system-roles.timesync
post_tasks:
- name: Set timezone
timezone:
RH294-RHEL8.0-es-1-20200501 311
capítulo 8 | Simplificación de guías con roles
handlers:
- name: restart crond
service:
name: crond
state: restarted
6. Para cada centro de datos, cree un archivo llamado timezone.yml con un valor apropiado
para la variable host_timezone. Use el comando timedatectl list-timezones para
encontrar la cadena de zona horaria válida para cada centro de datos.
6.1. Cree los subdirectorios group_vars para los grupos de hosts na_datacenter y
europe_datacenter.
7. Ejecute la guía.
...output omitted...
312 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
nota
Las zonas horarias reales enumeradas variarán según la época del año y si el horario
de verano está activo.
Cada servidor tiene una configuración de zona horaria basada en su ubicación geográfica.
Finalizar
Ejecute el comando lab role-system finish para limpiar el host administrado.
RH294-RHEL8.0-es-1-20200501 313
capítulo 8 | Simplificación de guías con roles
Creación de roles
Objetivos
Tras haber completado esta sección, deberá ser capaz de crear un rol en un directorio de proyecto
de guía y ejecutarlo como parte de una de las reproducciones de la guía.
Si Ansible no puede encontrar el rol allí, buscará en los directorios especificados por la
configuración de Ansible roles_path, en orden. Esta variable contiene una lista de directorios
separada por dos puntos para realizar la búsqueda. El valor predeterminado de esta variable es:
~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
Esto permite instalar roles en el sistema que se comparten entre varios proyectos. Por
ejemplo, puede tener sus propios roles instalados en su directorio de inicio en el subdirectorio
~/.ansible/roles, y el sistema puede tener roles instalados para todos los usuarios en el
directorio /usr/share/ansible/roles.
Cada rol tiene su propio directorio con una estructura de directorios estandarizada. Por ejemplo, la
siguiente estructura de directorio contiene los archivos que definen el rol motd.
314 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
│ └── main.yml
└── templates
└── motd.j2
README.md proporciona, en términos legibles para el ser humano, una descripción básica del
rol, documentación y ejemplos de cómo usarlo, y todos los requisitos ajenos a Ansible que podría
necesitar para funcionar. El subdirectorio meta contiene un archivo main.yml que especifica
información sobre el autor, la licencia, la compatibilidad y las dependencias del módulo. El
subdirectorio files contiene archivos de contenido fijo y el subdirectorio templates contiene
plantillas que se pueden implementar mediante el rol cuando se lo utiliza. Los otros subdirectorios
pueden contener los archivos main.yml que definen valores de variables predeterminados,
manejadores, tareas, metadatos de roles o variables, según el subdirectorio en el que se
encuentran.
Si existe un subdirectorio pero se encuentra vacío, como handlers en este ejemplo, es ignorado.
Si un rol no usa una característica, el subdirectorio se puede omitir por completo. Por ejemplo, el
subdirectorio vars se ha omitido en este ejemplo.
RH294-RHEL8.0-es-1-20200501 315
capítulo 8 | Simplificación de guías con roles
dest: /etc/motd
owner: root
group: root
mode: 0444
El siguiente comando muestra el contenido de la plantilla motd.j2 del rol motd. Menciona datos
de Ansible y una variable system_owner.
• Mantenga cada rol en su propio repositorio de control de versiones. Ansible funciona bien con
repositorios basados en git.
• Use ansible-galaxy init para iniciar su rol y elimine los directorios y archivos que no
necesite.
• Cree y mantenga los archivos README.md y meta/main.yml para documentar para qué sirve
su rol, quién lo escribió y cómo usarlo.
• Mantenga su rol enfocado en un propósito o una función específicos. En lugar de escribir un rol
que haga muchas cosas, puede escribir más de un rol.
• Reutilice y refactorice los roles a menudo. Evite crear nuevos roles para las configuraciones
perimetrales. Si un rol existente sirve para la mayoría de la configuración requerida, refactorice
el rol existente para integrar el nuevo escenario de configuración. Use técnicas de prueba
de integración y regresión para asegurarse de que el rol proporcione la nueva funcionalidad
requerida y que no cause problemas a las guías existentes.
316 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
---
dependencies:
- role: apache
port: 8080
- role: postgres
dbname: serverlist
admin_user: felix
Importante
Limite las dependencias del rol en otros roles. Las dependencias dificultan el
mantenimiento del rol, en especial si tiene muchas dependencias complejas.
Al ejecutarse la guía, las tareas realizadas por un rol se pueden identificar por el prefijo del nombre
del rol. En el siguiente ejemplo de salida, se muestra esto con el prefijo motd : en el nombre de la
tarea:
RH294-RHEL8.0-es-1-20200501 317
capítulo 8 | Simplificación de guías con roles
En el escenario anterior, se supone que el rol motd se encuentra en el directorio roles. Más
adelante en el curso, verá cómo usar un rol remoto en un repositorio de control de versiones.
• como una variable cuando se incluye el rol en la palabra clave roles de una reproducción
En el siguiente ejemplo, se muestra cómo usar el rol motd con un valor diferente para la variable
del rol system_owner. El valor especificado, [email protected], reemplazará a la
referencia de variable cuando se aplique el rol a un host administrado.
El siguiente ejemplo también muestra cómo usar el rol motd con un valor diferente para la variable
del rol system_owner. El valor especificado, [email protected], reemplazará
la referencia de variable independientemente de que esté definida en el directorio vars o
defaults del rol.
318 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
become: true
roles:
- role: motd
system_owner: [email protected]
Importante
La precedencia de variables puede causar confusión al trabajar con variables de rol
en una reproducción.
Referencias
Uso de roles — Documentación de Ansible
https://docs.ansible.com/ansible/latest/user_guide/
playbooks_reuse_roles.html#using-roles
RH294-RHEL8.0-es-1-20200501 319
capítulo 8 | Simplificación de guías con roles
Ejercicio Guiado
Creación de roles
En este ejercicio, creará un rol de Ansible que usa variables, archivos, plantillas, tareas y
manejadores para implementar un servicio de red.
Resultados
Debe ser capaz de crear un rol que use variables y parámetros.
El rol myvhost instala y configura el servicio Apache en un host. Se provee una plantilla
llamada vhost.conf.j2 que se usará para generar /etc/httpd/conf.d/vhost.conf.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
2. Cree la estructura de directorio para un rol denominado myvhost. El rol incluye archivos,
plantillas, tareas y manejadores corregidos.
3. Edite el archivo main.yml en el subdirectorio tasks del rol. El rol debe ejecutar las
siguientes tareas:
320 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
• Instalar el archivo de configuración del servidor web, con una plantilla proporcionada por
el rol
---
# tasks file for myvhost
3.3. Agregue otra estrofa para usar el módulo template a fin de crear /etc/httpd/
conf.d/vhost.conf en el host administrado. Debe invocar un manejador para
reiniciar el daemon httpd cuando se actualiza el archivo.
RH294-RHEL8.0-es-1-20200501 321
capítulo 8 | Simplificación de guías con roles
---
# handlers file for myvhost
6.2. Cree un archivo index.html debajo del directorio con el contenido: simple
index.
7.1. Escriba una guía que use el rol, denominada use-vhost-role.yml. Incluya una
tarea para copiar el contenido HTML de files/html/. Use el módulo copy e
incluya una barra oblicua final después del nombre del directorio fuente. Debe incluir
el siguiente contenido:
---
- name: Use myvhost role playbook
hosts: webservers
pre_tasks:
- name: pre_tasks message
debug:
msg: 'Ensure web server configuration.'
roles:
- myvhost
post_tasks:
- name: HTML content is installed
copy:
src: files/html/
dest: "/var/www/vhosts/{{ ansible_hostname }}"
322 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
playbook: use-vhost-role.yml
7.3. Ejecute la guía. Revise la salida para confirmar que Ansible realizó las acciones en el
servidor web, servera.
7.4. Ejecute los comandos ad hoc para confirmar que el rol funcionó. El paquete httpd
debe instalarse y el servicio httpd debe estar ejecutándose.
RH294-RHEL8.0-es-1-20200501 323
capítulo 8 | Simplificación de guías con roles
7.5. La configuración Apache debe estar instalada con las variables de plantilla ampliadas.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName servera.lab.example.com
ErrorLog logs/servera-error.log
CustomLog logs/servera-common.log common
DocumentRoot /var/www/vhosts/servera/
<Directory /var/www/vhosts/servera/>
Options +Indexes +FollowSymlinks +Includes
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
7.7. Use el módulo uri en un comando ad hoc para verificar que el contenido web esté
disponible localmente. Configure el parámetro return_content en true para
agregar el contenido de la respuesta del servidor a la salida. El contenido del servidor
debe ser la cadena "simple index\n".
324 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
"status": 200,
"url": "http://localhost"
}
7.8. Confirme que el contenido del servidor web esté disponible para clientes remotos.
Finalizar
Ejecute el comando lab role-create finish para limpiar el host administrado.
RH294-RHEL8.0-es-1-20200501 325
capítulo 8 | Simplificación de guías con roles
Objetivos
Tras haber completado esta sección, debe ser capaz de seleccionar y recuperar roles de Ansible
Galaxy u otras fuentes como un repositorio de Git, y usarlos en guías.
Además, el comando ansible-galaxy que utiliza para obtener y administrar roles de Ansible
Galaxy también se puede usar para obtener y administrar roles que sus proyectos necesitan de sus
propios repositorios Git.
326 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
nota
Puntuación de contenido [https://galaxy.ansible.com/docs/contributing/
content_scoring.html] en la documentación tiene más información sobre la
puntuación de los roles de Ansible Galaxy.
Ansible Galaxy informa la cantidad de veces que se ha descargado cada rol de Ansible Galaxy.
Además, Ansible Galaxy también informa la cantidad de visualizaciones, bifurcaciones y estrellas
que tiene el repositorio de GitHub del rol. Los usuarios pueden usar esta información para ayudar
a determinar qué tan activo es el desarrollo para un rol y qué tan popular es en la comunidad.
En la siguiente figura, se muestran los resultados de la búsqueda que Ansible Galaxy mostró
después de buscar la palabra clave redis. El primer resultado tiene una puntuación de Mejor
coincidencia de 0,9009.
RH294-RHEL8.0-es-1-20200501 327
capítulo 8 | Simplificación de guías con roles
El menú desplegable Filters (Filtros) a la derecha del cuadro de búsqueda permite realizar
búsquedas por palabras clave, ID de autor, plataforma y etiquetas. Los posibles valores de
la plataforma incluyen EL para Red Hat Enterprise Linux (y distribuciones estrechamente
relacionadas como CentOS) y Fedora, entre otros.
Las etiquetas son cadenas arbitrarias de una palabra establecidas por el autor del rol que
describen y categorizan el rol. Los usuarios pueden usar etiquetas para encontrar roles relevantes.
Los posibles valores de las etiquetas incluyen system, development, web, monitoring y otros.
Un rol puede tener hasta 20 etiquetas en Ansible Galaxy.
Importante
En la interfaz de búsqueda de Ansible Galaxy, las búsquedas por palabra clave
coinciden con las palabras o frases del archivo README, el nombre del contenido o
la descripción del contenido. Las búsquedas por etiqueta, por el contrario, coinciden
específicamente con los valores de las etiquetas establecidos por el autor para el
rol.
328 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Name Description
---- -----------
1it.sudo Ansible role for managing sudoers
AerisCloud.librato Install and configure the Librato Agent
AerisCloud.redis Installs redis on a server
AlbanAndrieu.java Manage Java installation
andrewrothstein.redis builds Redis from src and installs
...output omitted...
geerlingguy.php-redis PhpRedis support for Linux
geerlingguy.redis Redis for Linux
gikoluo.filebeat Filebeat for Linux.
...output omitted...
Role: geerlingguy.redis
description: Redis for Linux
active: True
...output omitted...
download_count: 146209
forks_count: 82
github_branch: master
github_repo: ansible-role-redis
github_user: geerlingguy
...output omitted...
license: license (BSD, MIT)
min_ansible_version: 2.4
modified: 2018-11-19T14:53:29.722718Z
open_issues_count: 11
path: [u'/etc/ansible/roles', u'/usr/share/ansible/roles']
role_type: ANS
stargazers_count: 98
...output omitted...
De manera predeterminada, los roles se instalan en el primer directorio que se puede escribir en
el roles_path del usuario. Según el roles_path predeterminado configurado para Ansible,
normalmente el rol se instalará en el directorio ~/.ansible/roles del usuario. El roles_path
predeterminado puede ser anulado por el archivo de configuración actual de Ansible o por la
RH294-RHEL8.0-es-1-20200501 329
capítulo 8 | Simplificación de guías con roles
También puede especificar un directorio específico para instalar el rol utilizando la opción -p
DIRECTORY.
- src: geerlingguy.redis
version: "1.5.0"
El atributo src especifica la fuente del rol, en este caso, el rol geerlingguy.redis de Ansible
Galaxy. El atributo version es opcional y especifica la versión del rol que se instalará, en este
caso, 1.5.0.
Importante
Debe especificar la versión del rol en su archivo requirements.yml, en especial
para las guías 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:
330 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Puede usar ansible-galaxy para instalar roles que no están en Ansible Galaxy. Puede alojar
sus propios roles internos o propietarios en un repositorio privado de Git o en un servidor web.
En el siguiente ejemplo, se muestra cómo configurar un archivo de requisitos con una variedad de
fuentes remotas.
# from Ansible Galaxy, overriding the name and using a specific version
- src: geerlingguy.redis
version: "1.5.0"
name: redis_prod
La palabra clave src especifica el nombre de rol de Ansible Galaxy. Si el rol no está alojado en
Ansible Galaxy, la palabra clave src indica la URL del rol.
La palabra clave name se utiliza para anular el nombre local del rol. La palabra clave version se
utiliza para especificar la versión de un rol. La palabra clave version puede tener cualquier valor
que corresponda a una bifurcación, etiqueta o hash de confirmación del repositorio de software
del rol.
Para instalar los roles asociados con un proyecto de guía, ejecute el comando ansible-galaxy
install:
RH294-RHEL8.0-es-1-20200501 331
capítulo 8 | Simplificación de guías con roles
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 en
uno de esos directorios; se usará la primera coincidencia. La siguiente guía use-role.yml hace
referencia a los roles redis_prod y geerlingguy.redis:
332 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Esta guía hace que diferentes versiones del rol geerlingguy.redis se apliquen a los servidores
de producción y desarrollo. De esta manera, los cambios en el rol se pueden probar e integrar
sistemáticamente antes de la implementación en los servidores de producción. Si un cambio
reciente en un rol causa problemas, usar el control de versiones para desarrollar el rol permite
revertirlo a una versión anterior y estable.
Referencias
Ansible Galaxy — Documentación Ansible
https://docs.ansible.com/ansible/latest/reference_appendices/galaxy.html
RH294-RHEL8.0-es-1-20200501 333
capítulo 8 | Simplificación de guías con roles
Ejercicio Guiado
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• crear un archivo de roles para especificar las dependencias de roles para una guía
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
2. Para probar el rol de Ansible que configura los archivos de esqueleto, agregue la
especificación de rol a un archivo de roles.
Ejecute su editor de texto favorito y cree un archivo denominado
requirements.yml en el subdirectorio roles. La URL del repositorio Git del rol es:
[email protected]:student/bash_env. Para ver cómo el rol
afecta el comportamiento de los hosts de producción, use la bifurcación master del
repositorio. Establezca el nombre local del rol en student.bash_env.
roles/requirements.yml ahora incluye el siguiente contenido:
334 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
---
# requirements.yml
- src: [email protected]:student/bash_env
scm: git
version: master
name: student.bash_env
3. Use el comando ansible-galaxy para procesar el archivo de roles que recién creó e
instalar el rol student.bash_env.
3.1. Para comparar, muestre el contenido del subdirectorio roles antes de que se instale
el rol.
3.2. Use Ansible Galaxy para descargar e instalar los roles enumerados en el archivo
roles/requirements.yml. Asegúrese de que los roles descargados se almacenen
en el subdirectorio roles.
3.3. Exhiba el subdirectorio roles después de que se haya instalado el rol. Confirme que
tiene un nuevo subdirectorio, denominado student.bash_env, que coincide con el
valor de name especificado en el archivo YAML.
3.4. Intente usar el comando ansible-galaxy, sin ninguna opción, para enumerar los
roles del proyecto:
RH294-RHEL8.0-es-1-20200501 335
capítulo 8 | Simplificación de guías con roles
nota
El directorio /home/student/.ansible/roles está en el roles_path
predeterminado, pero como no ha intentado instalar un rol sin usar la opción -p,
ansible-galaxy aún no ha creado el directorio.
---
- name: use student.bash_env role playbook
hosts: devservers
vars:
default_prompt: '[\u on \h in \W dir]\$ '
pre_tasks:
- name: Ensure test user does not exist
user:
name: student2
state: absent
force: yes
remove: yes
roles:
- student.bash_env
post_tasks:
- name: Create the test user
user:
name: student2
state: present
password: "{{ 'redhat' | password_hash('sha512', 'mysecretsalt') }}"
Para ver los efectos del cambio de configuración, se debe crear una nueva cuenta de
usuario. Las secciones pre_tasks y post_tasks de la guía garantizan que la cuenta de
usuario student2 se crea cada vez que se ejecuta la guía. Después de la ejecución de la
guía, se accede a la cuenta student2 con la contraseña redhat.
nota
La contraseña de user2 se genera con un filtro. Los filtros toman datos y
los modifican; aquí, la cadena redhat se modifica al pasarla por el módulo
password_hash. Los filtros son un tema avanzado que no se trata en este curso.
336 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
RH294-RHEL8.0-es-1-20200501 337
capítulo 8 | Simplificación de guías con roles
---
# requirements.yml
- src: [email protected]:student/bash_env
scm: git
version: dev
name: student.bash_env
7.2. Use el comando ansible-galaxy install para instalar el rol con el archivo
de roles actualizado. Use la opción --force para sobrescribir la versión master
existente del rol con la versión dev del rol.
---
- name: use student.bash_env role playbook
hosts: devservers
vars:
prompt_color: blue
default_prompt: '[\u on \h in \W dir]\$ '
pre_tasks:
...output omitted...
338 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
changed: [servera.lab.example.com]
# .bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
Guarde el archivo.
RH294-RHEL8.0-es-1-20200501 339
capítulo 8 | Simplificación de guías con roles
ok: [servera.lab.example.com]
Los pasos anteriores demuestran que la versión de desarrollo del rol student.bash_env es
defectuosa. Sobre la base de los resultados de las pruebas, los desarrolladores realizarán las
correcciones necesarias en la bifurcación de desarrollo del rol. Cuando la bifurcación de desarrollo
pasa los controles de calidad requeridos, los desarrolladores combinan las características de la
bifurcación de desarrollo en la bifurcación master.
La confirmación de cambios de rol en un repositorio Git está fuera del alcance de este curso.
Importante
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.
Finalizar
Ejecute el comando lab role-galaxy finish para limpiar el host administrado.
340 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Trabajo de laboratorio
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Cree roles de Ansible que utilicen variables, archivos, plantillas, tareas y manejadores para
configurar un servidor web de desarrollo.
• La configuración del servidor de desarrollo debe coincidir con la configuración del servidor
de producción. El servidor de producción se debe configurar mediante un rol Ansible,
desarrollado por el equipo de infraestructura de la organización.
Su guía:
• Usará un rol para configurar directorios y puertos para cada desarrollador del servidor web.
Debe escribir este rol.
Este rol depende de un rol escrito por la organización para configurar Apache. Debe definir
la dependencia con la versión v1.4 del rol organizativo. La URL del repositorio de la
dependencia es: [email protected]:infra/apache
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
RH294-RHEL8.0-es-1-20200501 341
capítulo 8 | Simplificación de guías con roles
342 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Evaluación
Evalúe su trabajo ejecutando el comando lab role-review grade de su máquina
workstation. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un
resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab role-review finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 343
capítulo 8 | Simplificación de guías con roles
Solución
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Cree roles de Ansible que utilicen variables, archivos, plantillas, tareas y manejadores para
configurar un servidor web de desarrollo.
• La configuración del servidor de desarrollo debe coincidir con la configuración del servidor
de producción. El servidor de producción se debe configurar mediante un rol Ansible,
desarrollado por el equipo de infraestructura de la organización.
Su guía:
• Usará un rol para configurar directorios y puertos para cada desarrollador del servidor web.
Debe escribir este rol.
Este rol depende de un rol escrito por la organización para configurar Apache. Debe definir
la dependencia con la versión v1.4 del rol organizativo. La URL del repositorio de la
dependencia es: [email protected]:infra/apache
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
344 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
2. Cree una guía llamada web_dev_server.yml con una sola reproducción denominada
Configure Dev Web Server (Configurar servidor web de desarrollo). Configure la
reproducción para apuntar al grupo de hosts dev_webserver. No agregue ningún rol ni
tarea a la reproducción todavía.
Asegúrese de que la reproducción obligue a los manejadores a ejecutarse, ya que puede
encontrar un error al desarrollar la guía.
Una vez terminada, la guía /home/student/role-review/web_dev_server.yml
contiene lo siguiente:
---
- name: Configure Dev Web Server
hosts: dev_webserver
force_handlers: yes
playbook: web_dev_server.yml
[student@workstation role-review]$ ansible-playbook web_dev_server.yml
PLAY [Configure Dev Web Server] **********************************************
RH294-RHEL8.0-es-1-20200501 345
capítulo 8 | Simplificación de guías con roles
- name: infra.apache
src: [email protected]:infra/apache
scm: git
version: v1.4
4.4. Instale el paquete RHEL System Roles, si no está instalado. Esto se instaló en un
ejercicio anterior.
5.1. Use ansible-galaxy init para crear un esqueleto de rol para el rol
apache.developer_configs.
346 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
dependencies:
- name: infra.apache
src: [email protected]:infra/apache
scm: git
version: v1.4
---
web_developers:
- username: jdoe
name: John Doe
user_port: 9081
- username: jdoe2
name: Jane Doe
user_port: 9082
RH294-RHEL8.0-es-1-20200501 347
capítulo 8 | Simplificación de guías con roles
---
- name: Configure Dev Web Server
hosts: dev_webserver
force_handlers: yes
roles:
- apache.developer_configs
playbook: web_dev_server.yml
[student@workstation role-review]$ ansible-playbook web_dev_server.yml
...output omitted...
...output omitted...
348 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
9. Apache HTTPD no pudo reiniciarse en el paso anterior porque los puertos de red que utiliza
para sus desarrolladores están etiquetados con los contextos de SELinux incorrectos. Se
le ha proporcionado un archivo de variables, selinux.yml, que se puede utilizar con el rol
rhel-system-roles.selinux para corregir el problema.
Cree una sección pre_tasks para su reproducción en la guía web_dev_server.yml.
En esa sección, use una tarea para incluir el rol rhel-system-roles.selinux en una
estructura block/rescue para que se lo aplique correctamente. Revise la conferencia o la
documentación de este rol para ver cómo hacer esto.
Inspeccione el archivo selinux.yml. Muévalo a la ubicación correcta, de modo que sus
variables se configuren para el grupo de hosts dev_webserver.
pre_tasks:
- name: Check SELinux configuration
block:
- include_role:
name: rhel-system-roles.selinux
rescue:
# Fail if failed for a different reason than selinux_reboot_required.
- name: Check for general failure
fail:
msg: "SELinux role failed."
when: not selinux_reboot_required
selinux_policy: targeted
selinux_state: enforcing
selinux_ports:
- ports:
- "9081"
RH294-RHEL8.0-es-1-20200501 349
capítulo 8 | Simplificación de guías con roles
- "9082"
proto: 'tcp'
setype: 'http_port_t'
state: 'present'
playbook: web_dev_server.yml
---
- name: Configure Dev Web Server
hosts: dev_webserver
force_handlers: yes
roles:
- apache.developer_configs
pre_tasks:
- name: Check SELinux configuration
block:
- include_role:
name: rhel-system-roles.selinux
rescue:
# Fail if failed for a different reason than selinux_reboot_required.
- name: Check for general failure
fail:
msg: "SELinux role failed."
when: not selinux_reboot_required
nota
Para ansible-playbook, no tiene importancia que pre_tasks esté al final de
la reproducción o en la posición "correcta" en cuanto al orden de ejecución en el
archivo de guía. Aun así ejecutará las tareas de la reproducción en el orden correcto.
350 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
...output omitted...
...output omitted...
12. Pruebe la configuración del servidor web de desarrollo. Verifique que todos los extremos
sean accesibles y proporcionen el contenido de cada desarrollador.
Evaluación
Evalúe su trabajo ejecutando el comando lab role-review grade de su máquina
workstation. Corrija los errores informados y vuelva a ejecutar el script hasta obtener un
resultado satisfactorio.
Finalizar
En workstation, ejecute el script lab role-review finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 351
capítulo 8 | Simplificación de guías con roles
352 RH294-RHEL8.0-es-1-20200501
capítulo 8 | Simplificación de guías con roles
Resumen
En este capítulo, aprendió lo siguiente:
Roles de Ansible
• Los roles organizan el código de Ansible de manera que permita la reutilización y el intercambio.
• Los roles de Red Hat Enterprise Linux son una colección de roles probados y admitidos,
diseñados para ayudarlo a configurar los subsistemas de host en las versiones de Red Hat
Enterprise Linux.
• Ansible Galaxy [https://galaxy.ansible.com] es una librería pública de roles de Ansible, escrita
por usuarios de Ansible. El comando ansible-galaxy puede buscar, instalar, enumerar,
eliminar o iniciar roles, así como mostrar información acerca de ellos.
• Los roles externos que necesita una guía se pueden definir en el archivo roles/
requirements.yml. El comando ansible-galaxy install -r roles/
requirements.yml usa este archivo para instalar los roles en el nodo de control.
RH294-RHEL8.0-es-1-20200501 353
354 RH294-RHEL8.0-es-1-20200501
capítulo 9
Resolución de problemas de
Ansible
Meta Resolver problemas de guías y hosts
administrados.
RH294-RHEL8.0-es-1-20200501 355
capítulo 9 | Resolución de problemas de Ansible
Objetivos
Después de completar esta sección, debe ser capaz de solucionar problemas genéricos con una
nueva guía y repararlos.
Si configura Ansible para escribir archivos de registro en /var/log, Red Hat recomienda que
configure logrotate para gestionar los archivos de registro de Ansible.
Los siguientes ejemplos usan las configuraciones msg y var dentro de las tareas debug. El primer
ejemplo muestra el valor en el tiempo de ejecución del dato ansible_facts['memfree_mb']
como parte de un mensaje impreso en el resultado de ansible-playbook. El segundo ejemplo
muestra el valor de la variable output.
Gestión de errores
Muchos problemas pueden ocurrir durante la ejecución de una guía, principalmente relacionados
con la sintaxis de la guía o de cualquiera de las plantillas que utiliza, o debido a problemas
de conectividad con los hosts administrados (por ejemplo, un error en el nombre del host
administrado en el archivo de inventario). Estos errores se emiten por el comando ansible-
playbook al momento de la ejecución.
356 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
También puede usar la opción --step para recorrer una guía una tarea a la vez. El comando
ansible-playbook --step solicita de forma interactiva la confirmación de que desea que se
ejecute cada tarea.
La opción --start-at-task le permite iniciar la ejecución de una guía desde una tarea
específica. Toma como argumento el nombre de la tarea en la que se debe comenzar.
Depuración
La salida dada por la ejecución de una guía con el comando ansible-playbook es un buen
punto de partida para la solución de problemas relacionados con hosts administrados por Ansible.
Considere el siguiente resultado de la ejecución de una guía:
El resultado anterior muestra el encabezado PLAY con el nombre de la reproducción que debe
ejecutarse, seguido de uno o más encabezados TASK. Cada uno de estos encabezados representa
su tarea relacionada en la guía y se ejecuta en todos los hosts administrados que pertenecen al
grupo incluido en la guía en el parámetro hosts.
A medida que cada host administrado ejecuta cada una de las tareas de reproducción, se muestra
el nombre del host administrado debajo del encabezado TASK correspondiente, junto con el
estado de la tarea en ese host administrado. Los estados de tarea pueden aparecer como ok,
fatal, changed o skipping.
En la parte inferior de los resultados de cada reproducción, la sección PLAY RECAP muestra la
cantidad de tareas ejecutadas para cada host administrado.
RH294-RHEL8.0-es-1-20200501 357
capítulo 9 | Resolución de problemas de Ansible
Configuración de detalle
Opción Descripción
• Use una descripción concisa del propósito de la reproducción o tarea para nombrar las
reproducciones y las tareas. El nombre de la reproducción o tarea se muestra cuando se ejecuta
la guía. Esto también ayuda a documentar lo que se supone que debe lograr cada reproducción
o tarea, y posiblemente por qué se necesita.
• Haga un uso eficaz del espacio en blanco vertical. En general, organice los atributos de las
tareas verticalmente para que sean más fáciles de leer.
• Una sangría horizontal consistente es fundamental. Use espacios, no tabulaciones, para evitar
errores de sangría. Configure su editor de texto para insertar espacios cuando presione la tecla
Tab para hacer esto más fácil.
• Intente mantener la guía lo más simple posible. Solo use las funciones que necesita.
Referencias
Configuración de Ansible; documentación Ansible
https://docs.ansible.com/ansible/latest/installation_guide/intro_configuration.html
358 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Ejercicio Guiado
Resultados
Debe ser capaz de solucionar problemas y resolver problemas en las guías.
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student.
[defaults]
log_path = /home/student/troubleshoot-playbook/ansible.log
inventory = /home/student/troubleshoot-playbook/inventory
RH294-RHEL8.0-es-1-20200501 359
capítulo 9 | Resolución de problemas de Ansible
install_state: installed
random_var: This is colon: test
^ here
install_state: installed
random_var: This is colon: test
^ here
5. Edite la guía y corrija el error agregando comillas a todo el valor que se está asignando a
random_var. La versión corregida de samba.yml debería incluir el siguiente contenido:
...output omitted...
vars:
install_state: installed
random_var: "This is colon: test"
...output omitted...
360 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
7. Edite la guía y elimine el espacio adicional para todas las líneas en esa tarea. La guía
corregida debe aparecer de la siguiente manera:
...output omitted...
- name: configure firewall for samba
firewalld:
state: enabled
permanent: true
immediate: true
service: samba
name: samba
state: {{ install_state }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
with_items:
- "{{ foo }}"
RH294-RHEL8.0-es-1-20200501 361
capítulo 9 | Resolución de problemas de Ansible
...output omitted...
tasks:
- name: install samba
yum:
name: samba
state: "{{ install_state }}"
...output omitted...
10. Ejecute la guía usando la opción --syntax-check. Ahora debería mostrar errores de
sintaxis adicionales.
playbook: samba.yml
362 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
14. Vuelva a ejecutar la guía con -vvvv para obtener más información acerca de la
ejecución. Se emite un error, ya que no se puede acceder al host administrado
servera.lab.example.com.
RH294-RHEL8.0-es-1-20200501 363
capítulo 9 | Resolución de problemas de Ansible
"unreachable": true
}
...output omitted...
PLAY RECAP ***************************************************************
servera.lab.exammple.com : ok=0 changed=0 unreachable=1 failed=0
15. Al aplicar el mayor nivel de detalle con Ansible, el archivo de registro de Ansible es una
mejor opción para verificar el resultado que la consola. Revise el resultado del comando
anterior en el archivo /home/student/troubleshoot-playbook/ansible.log.
364 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
...output omitted...
[samba_servers]
servera.lab.example.com
...output omitted...
17. Ejecute la guía nuevamente. La tarea debug install_state variable devuelve el mensaje The
state for the samba service is installed. Esta tarea hace uso del módulo debug y muestra
el valor de la variable install_state. Un error también se muestra en la tarea deliver samba
config, ya que no se dispone de ningún archivo samba.j2 en el directorio de trabajo, /
home/student/troubleshoot-playbook/.
18. Edite la guía y corrija el parámetro src en la tarea deliver samba config para que sea
samba.conf.j2. Al finalizar, debería verse de la siguiente manera:
...output omitted...
- name: deliver samba config
template:
src: samba.conf.j2
dest: /etc/samba/smb.conf
owner: root
...output omitted...
RH294-RHEL8.0-es-1-20200501 365
capítulo 9 | Resolución de problemas de Ansible
19. Ejecute la guía nuevamente. Ejecute la guía usando la opción --step. Debería ejecutarse
sin errores.
Finalizar
En workstation, ejecute el script lab troubleshoot-playbook finish para limpiar este
ejercicio.
366 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Objetivos
Después de completar esta sección, debe ser capaz de solucionar las fallas en los hosts
administrados cuando ejecutan una guía.
nota
El comando ansible-playbook --check podría no funcionar correctamente si
las tareas usan condicionales.
También puede controlar si las tareas individuales se ejecutan en el modo de verificación con el
ajuste check_mode. Si una tarea tiene configurado check_mode: yes, siempre se ejecuta en
modo de verificación, independientemente de que haya pasado la opción --check a ansible-
playbook. Del mismo modo, si una tarea tiene configurado check_mode: no, siempre se
ejecuta normalmente, incluso si pasa --check a ansible-playbook.
tasks:
- name: task always in check mode
shell: uname -a
check_mode: yes
La siguiente tarea siempre se ejecuta normalmente, incluso cuando se inicia con ansible-
playbook --check.
tasks:
- name: task always runs even in check mode
shell: uname -a
check_mode: no
Esto puede ser útil porque puede ejecutar la mayor parte de una guía normalmente mientras
prueba tareas individuales con check_mode: yes. Del mismo modo, puede hacer que las
RH294-RHEL8.0-es-1-20200501 367
capítulo 9 | Resolución de problemas de Ansible
Una tarea puede determinar si la guía se está ejecutando en modo de verificación probando el
valor de la variable mágica ansible_check_mode. Esta variable booleana se establece en true
si la guía se está ejecutando en modo de verificación.
Advertencia
Las tareas que tienen configurado check_mode: no se ejecutarán incluso cuando
la guía se ejecute con ansible-playbook --check. Por lo tanto, no se puede
confiar en que la opción --check no realizará cambios en los hosts administrados,
sin confirmar que este sea el caso al inspeccionar la guía y los roles o tareas
asociados con este.
nota
Si tiene guías más antiguas que usan always_run: yes para forzar a las tareas a
ejecutarse normalmente, incluso en el modo de verificación, tendrá que reemplazar
ese código con check_mode: no en Ansible 2.6 y posteriores.
El comando ansible-playbook también proporciona una opción --diff. Esta opción informa
los cambios realizados a los archivos de plantillas en hosts administrados. Si se usan con la opción
--check, estos cambios se muestran en la salida del comando, pero no se realizan.
• El módulo uri aporta una forma de verificar que una RESTful API esté devolviendo el contenido
requerido.
tasks:
- uri:
url: http://api.myapp.com
return_content: yes
register: apiresponse
- fail:
msg: 'version was not provided'
when: "'version' not in apiresponse.content"
368 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
tasks:
- script: check_free_memory
• 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. Si el archivo no existe, la tarea stat no fallará, pero su
variable registrada informará false para *.stat.exists.
tasks:
- name: Check if /var/run/app.lock exists
stat:
path: /var/run/app.lock
register: lock
• 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.
tasks:
- name: Check if /var/run/app.lock exists
stat:
path: /var/run/app.lock
register: lock
RH294-RHEL8.0-es-1-20200501 369
capítulo 9 | Resolución de problemas de Ansible
ingresando la contraseña sudo correcta y que sudo en el host administrado esté configurado
correctamente.
Un problema más sutil tiene que ver con la configuración del inventario. Para un servidor complejo
con varias direcciones de red, es posible que deba usar una dirección particular o un nombre
DNS al conectarse a ese sistema. Es posible que no desee utilizar esa dirección como nombre de
inventario de la máquina para una mejor legibilidad. Puede configurar una variable de inventario
de host, ansible_host, que anulará el nombre del inventario con un nombre o una dirección IP
diferente y será usado por Ansible para conectarse a ese host. Esta variable podría configurarse en
el archivo o directorio host_vars para ese host o en el propio archivo de inventario.
Por ejemplo, la siguiente entrada de inventario configura Ansible para conectarse a 192.0.2.4
al procesar el host web4.phx.example.com:
web4.phx.example.com ansible_host=192.0.2.4
Esta es una forma útil de controlar cómo Ansible se conecta a los hosts administrados. Sin
embargo, también puede causar problemas si el valor de ansible_host es incorrecto.
Ha usado el módulo ping para probar si puede conectarse a hosts gestionados. Dependiendo
de las opciones que pase, también puede usarlo para probar si la escalada de privilegios y las
credenciales están configuradas correctamente.
Este ejemplo devuelve el espacio actualmente disponible en los discos configurados en el host
administrado demohost. Eso puede ser útil para confirmar que el sistema de archivos en el host
administrado no está lleno.
370 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Debido a esto, normalmente no hay necesidad de verificar si el resultado de una tarea gestionada
por Ansible se aplicó correctamente en los hosts administrados. Tiene sentido sumar algunas
verificaciones de salud a las guías, o ejecutarlas directamente como comandos ad hoc, cuando
se requiere una resolución de problemas directa. Sin embargo, debe tener cuidado de no agregar
demasiada complejidad a sus tareas y reproducciones en un esfuerzo por verificar dos veces las
pruebas realizadas por los módulos.
Referencias
Modo de verificación ("Ejecución práctica") -- Documentación Ansible
https://docs.ansible.com/ansible/latest/user_guide/playbooks_checkmode.html
RH294-RHEL8.0-es-1-20200501 371
capítulo 9 | Resolución de problemas de Ansible
Ejercicio Guiado
Resultados
Debería poder solucionar problemas de los hosts administrados.
Andes De Comenzar
Iniciar sesión en workstation como student con la contraseña student.
372 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
...output omitted...
PLAY RECAP *********************************************************************
servera.lab.example.com : ok=6 changed=3 unreachable=0 failed=1
La tarea verify main.cf file exists usa el módulo stat. Confirmó que main.cf existe en
servera.lab.example.com.
Falló la tarea email notification of always_bcc config. No recibió el resultado de la tarea
check for always_bcc porque la guía se ejecutó usando el modo de verificación.
RH294-RHEL8.0-es-1-20200501 373
capítulo 9 | Resolución de problemas de Ansible
Ahora comienza con una línea que contiene la cadena, “Ansible managed”. El archivo se
actualizó y ahora está gestionado por Ansible.
7. Ejecute la guía. La tarea postfix firewalld config debería haberse ejecutado sin
errores.
8. Usando un comando ad hoc, verifique que ahora el servicio smtp esté configurado en el
firewall en servera.lab.example.com.
9. Use telnet para probar si el servicio SMTP está escuchando en el puerto TCP/25 en
servera.lab.example.com. Desconéctese cuando haya terminado.
374 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Finalizar
En workstation, ejecute el script lab troubleshoot-host finish para limpiar este
ejercicio.
RH294-RHEL8.0-es-1-20200501 375
capítulo 9 | Resolución de problemas de Ansible
Trabajo de laboratorio
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student. Ejecute el
comando lab troubleshoot-review start.
376 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Evaluación
En workstation, ejecute el script lab troubleshoot-review grade para confirmar que ha
realizado correctamente este ejercicio.
Finalizar
En workstation, ejecute el script lab troubleshoot-review finish para limpiar este
trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 377
capítulo 9 | Resolución de problemas de Ansible
Solución
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
Inicie sesión en workstation como student con la contraseña student. Ejecute el
comando lab troubleshoot-review start.
1.2. Verifique la sintaxis de la guía secure-web.yml. Esta guía configura Apache HTTPD
con TLS/SSL para los hosts del grupo webservers cuando todo es correcto.
378 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
vars:
random_var: This is colon: test
^ here
...output omitted...
vars:
random_var: "This is colon: test"
...output omitted...
2.2. Corrija los problemas de sintaxis en la sangría. Quite el espacio adicional al comienzo
de los elementos de la tarea start and enable web services. El cambio resultante debe
aparecer de la siguiente manera:
...output omitted...
args:
creates: /etc/pki/tls/certs/serverb.lab.example.com.crt
RH294-RHEL8.0-es-1-20200501 379
capítulo 9 | Resolución de problemas de Ansible
copy:
dest: /var/www/vhosts/serverb-secure
src: html/
...output omitted...
3. Verifique la sintaxis de la guía secure-web.yml por tercera vez. Solucione el problema que
se informa.
yum:
name: {{ item }}
^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes. Always quote template expression brackets when they
start a value. For instance:
with_items:
- {{ foo }}
with_items:
- "{{ foo }}"
3.2. Corrija la variable item en la tarea install web server packages. Agregue
comillas dobles a {{ item }}. El cambio resultante debe aparecer de la siguiente
manera:
...output omitted...
- name: install web server packages
yum:
name: "{{ item }}"
state: latest
notify:
- restart services
loop:
- httpd
- mod_ssl
...output omitted...
380 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
4. Verifique la sintaxis de la guía secure-web.yml por cuarta vez. No debería mostrar errores
de sintaxis.
playbook: secure-web.yml
[webservers]
serverb.lab.example.com
RH294-RHEL8.0-es-1-20200501 381
capítulo 9 | Resolución de problemas de Ansible
6.2. Edite la guía secure-web.yml para asegurarse de que devops sea el remote_user
para la reproducción. Las primeras líneas de la guía deberían aparecer de la siguiente
manera:
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
...output omitted...
7. Ejecute la guía secure-web.yml por tercera vez. Solucione el problema que se informa.
382 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
---
# start of secure web server playbook
- name: create secure web service
hosts: webservers
remote_user: devops
become: true
...output omitted...
8. Ejecute la guía secure-web.yml una vez más. Se debe completar correctamente. Use un
comando ad hoc para verificar que el servicio httpd esté funcionando.
8.2. Use un comando ad hoc para determinar el estado del servicio httpd en
serverb.lab.example.com. El servicio httpd ahora debe ejecutarse en
serverb.lab.example.com.
RH294-RHEL8.0-es-1-20200501 383
capítulo 9 | Resolución de problemas de Ansible
Evaluación
En workstation, ejecute el script lab troubleshoot-review grade para confirmar que ha
realizado correctamente este ejercicio.
Finalizar
En workstation, ejecute el script lab troubleshoot-review finish para limpiar este
trabajo de laboratorio.
384 RH294-RHEL8.0-es-1-20200501
capítulo 9 | Resolución de problemas de Ansible
Resumen
En este capítulo, aprendió lo siguiente:
• El módulo debug brinda información adicional de depuración al tiempo que ejecuta la guía (por
ejemplo, el valor actual para una variable).
• La opción --check habilita los módulos de Ansible con soporte de modo de verificación para
que se muestren los cambios que se deben realizar, en lugar de aplicar estos cambios a los hosts
administrados.
RH294-RHEL8.0-es-1-20200501 385
386 RH294-RHEL8.0-es-1-20200501
capítulo 10
Automatización de tareas de
administración de Linux
Meta Automatizar las tareas de administración comunes
del sistema Linux con Ansible.
RH294-RHEL8.0-es-1-20200501 387
capítulo 10 | Automatización de tareas de administración de Linux
Administración de software y
suscripciones
Objetivos
Tras finalizar esta sección, debe poder suscribir sistemas, configurar canales de software y
repositorios, y gestionar paquetes RPM en hosts administrados.
---
- name: Install the required packages on the web server
hosts: servera.lab.example.com
tasks:
- name: Install the httpd packages
yum:
name: httpd
state: present
present
Ansible instala el paquete si aún no está instalado.
absent
Ansible elimina el paquete si está instalado.
latest
Ansible actualiza el paquete si aún no está en la versión más reciente disponible. Si el
paquete no está instalado, Ansible lo instala.
La tabla siguiente compara algunos usos del módulo de Ansible yum con el comando equivalente
yum.
yum install
- name: Install httpd
httpd
yum:
name: httpd
state: present
388 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
yum update
- name: Install or update httpd
httpd o yum
yum:
install httpd si
name: httpd
el paquete aún no
state: latest
está instalado.
yum update
- name: Update all packages
yum:
name: '*'
state: latest
yum remove
- name: Remove httpd
httpd
yum:
name: httpd
state: absent
yum group
- name: Install Development Tools
install
yum:
"Development
name: '@Development Tools'
Tools"
state: present
yum group
- name: Remove Development Tools
remove
yum:
"Development
name: '@Development Tools'
Tools"
state: absent
yum module
- name: Inst perl AppStream module
install
yum:
perl:5.26/
name: '@perl:5.26/minimal'
minimal
state: present
RH294-RHEL8.0-es-1-20200501 389
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Install the required packages on the web server
hosts: servera.lab.example.com
tasks:
- name: Install the packages
yum:
name:
- httpd
- mod_ssl
- httpd-tools
state: present
Con esta sintaxis, Ansible instala los paquetes en una sola transacción de Yum. Esto es equivalente
a ejecutar el comando yum install httpd mod_ssl httpd-tools.
Una versión más común pero menos eficiente y más lenta de esta tarea es usar un bucle.
---
- name: Install the required packages on the web server
hosts: servera.lab.example.com
tasks:
- name: Install the packages
yum:
name: "{{ item }}""
state: present
loop:
- httpd
- mod_ssl
- httpd-tools
Evite usar este método, ya que requiere que el módulo realice tres transacciones individuales, una
para cada paquete.
La guía siguiente llama al módulo package_facts, al módulo debug para visualizar el contenido
de la variable ansible_facts.packages, y al módulo debug de nuevo para ver la versión del
paquete NetworkManager instalado.
---
- name: Display installed packages
hosts: servera.lab.example.com
tasks:
- name: Gather info on installed packages
package_facts:
manager: auto
390 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Cuando se ejecuta, la guía muestra la lista de paquetes y la versión del paquete NetworkManager:
RH294-RHEL8.0-es-1-20200501 391
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Install the required packages on the web servers
hosts: webservers
tasks:
- name: Install httpd on RHEL
yum:
name: httpd
state: present
when: "ansible_distribution == 'RedHat'"
---
- name: Install the required packages on the web servers
hosts: webservers
tasks:
- name: Install httpd
package:
name: httpd
state: present
Sin embargo, tenga en cuenta que el módulo package no es compatible con todas las funciones
que proporcionan los módulos más especializados. Además, los sistemas operativos a menudo
tienen nombres diferentes para los paquetes que proporcionan. Por ejemplo, el paquete que
instala el servidor HTTP Apache es httpd en Red Hat Enterprise Linux y apache2 en Ubuntu. En
ese caso, aún necesita un condicional para seleccionar el nombre correcto del paquete en función
del sistema operativo del host administrado.
392 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
La palabra clave state establecida en present indica que el sistema debe registrarse y
suscribirse. Cuando se establece en absent, el módulo anula el registro del sistema.
Recuerde que puede enumerar los repositorios disponibles con el comando subscription-
manager repos --list.
RH294-RHEL8.0-es-1-20200501 393
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Configure the company Yum repositories
hosts: servera.lab.example.com
tasks:
- name: Ensure Example Repo exists
yum_repository:
file: example
name: example-internal
description: Example Inc. Internal YUM repo
baseurl: http://materials.example.com/yum/repository/
enabled: yes
gpgcheck: yes
state: present
La palabra clave file da el nombre del archivo que se creará en el directorio /etc/
yum.repos.d/. El módulo agrega automáticamente la extensión .repo a ese nombre.
Por lo general, los proveedores de software firman digitalmente paquetes RPM con claves
GPG. Al establecer la palabra clave gpgcheck en yes (sí), el sistema RPM verifica la
integridad del paquete al confirmar que el paquete fue firmado por la clave GPG apropiada.
Rechaza la instalación de un paquete si la firma GPG no coincide. Use el módulo de Ansible
rpm_key, descrito más adelante, para instalar la clave GPG pública requerida.
Al configurar la palabra clave state en present, Ansible crea o actualiza el archivo .repo.
Al configurar state en absent, Ansible elimina el archivo.
[example-internal]
baseurl = http://materials.example.com/yum/repository/
enabled = 1
gpgcheck = 1
name = Example Inc. Internal YUM repo
394 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
nota
Algunos repositorios de terceros proporcionan el archivo de configuración y la
clave pública de GPG como parte del paquete de RPM que puede descargarse e
instalarse con el comando yum install. Por ejemplo, el proyecto Extra Packages
for Enterprise Linux (EPEL) proporciona el paquete https://dl.fedoraproject.org/
pub/epel/epel-release-latest-VER.noarch.rpm que implementa el archivo de
configuración /etc/yum.repos.d/epel.repo. Para este repositorio, use
el módulo de Ansible yum para instalar el paquete EPEL en lugar del módulo
yum_repository.
---
- name: Configure the company Yum repositories
hosts: servera.lab.example.com
tasks:
- name: Deploy the GPG public key
rpm_key:
key: http://materials.example.com/yum/repository/RPM-GPG-KEY-example
state: present
RH294-RHEL8.0-es-1-20200501 395
capítulo 10 | Automatización de tareas de administración de Linux
Referencias
Páginas del manual: yum(8), yum.conf(5), subscription-manager(8)
396 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Ejercicio Guiado
Administración de software y
suscripciones
En este ejercicio, configurará un nuevo repositorio de Yum y, desde allí, instalará paquetes en
sus hosts administrados.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Andes De Comenzar
En workstation, ejecute el script de inicio del trabajo de laboratorio a fin de confirmar que
el entorno esté listo para que comience el trabajo de laboratorio. El script crea el directorio
de trabajo, denominado system-software, y lo completa con un archivo de configuración
Ansible, un inventario de hosts y archivos de laboratorio.
Tiene la tarea de escribir una guía para asegurarse de que el paquete example-motd esté instalado
en el host remoto. La guía debe garantizar la configuración del repositorio interno de Yum.
RH294-RHEL8.0-es-1-20200501 397
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Repository Configuration
hosts: all
vars:
custom_pkg: example-motd
tasks:
3.1. Agregue la primera tarea a la guía. Configure la palabra clave manager del módulo
package_facts con un valor auto. La primera tarea contiene lo siguiente:
3.2. Agregue una segunda tarea a la guía que usa el módulo depurar para mostrar el
valor de la variable ansible_facts.packages[custom_pkg]. Agregue una
cláusula cuando a la tarea para comprobar si el valor de la variable custom_pkg está
contenida en la variable ansible_facts.packages. La segunda tarea contiene lo
siguiente:
398 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
4. Agregue una tercera tarea que use el módulo yum_repository para asegurar la
configuración del repositorio yum interno en el host remoto. Asegúrese de lo siguiente:
5. Agregue una cuarta tarea a la guía que use el módulo rpm_key para asegurarse de que la
clave pública del repositorio esté presente en el host remoto. La URL de la clave pública del
repositorio es http://materials.example.com/yum/repository/RPM-GPG-KEY-
example.
La cuarta tarea aparece de la siguiente manera:
6. Agregue una quinta tarea para asegurarse de que el paquete al que hace referencia la
variable custom_pkg esté instalado en el host remoto.
La quinta tarea aparece de la siguiente manera:
RH294-RHEL8.0-es-1-20200501 399
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Repository Configuration
hosts: all
vars:
custom_pkg: example-motd
tasks:
- name: Gather Package Facts
package_facts:
manager: auto
400 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Repository Configuration
hosts: all
vars:
custom_pkg: example-motd
tasks:
- name: Gather Package Facts
package_facts:
manager: auto
RH294-RHEL8.0-es-1-20200501 401
capítulo 10 | Automatización de tareas de administración de Linux
9.1. Para quitar el paquete example-motd de todos los hosts, utilice el comando ansible
all con las opciones -m yum y -a 'name=example-motd state=absent'
402 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
ok: [servera.lab.example.com]
...output omitted...
Finalizar
En workstation, ejecute el script lab system-software finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 403
capítulo 10 | Automatización de tareas de administración de Linux
Administración de usuarios y
autenticación
Objetivos
Tras finalizar esta sección, usted deberá ser capaz de realizar lo siguiente:
El parámetro name es el único requisito en el módulo user y suele ser la cuenta de servicio o
la cuenta de usuario.
El parámetro shell establece la shell del usuario de manera opcional. En otros sistemas
operativos, la shell predeterminada se decide por la herramienta que se usa.
El parámetro groups, junto con el parámetro append, le indica a la máquina que queremos
adjuntar los grupos sys_admins y developers con este usuario. Si no usa el parámetro append,
los grupos se sobrescribirán en su lugar.
404 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
nota
El módulo user también ofrece algunos valores de retorno. Los módulos de Ansible
pueden tomar un valor de retorno y registrarlos en una variable. Obtenga más
información con ansible-doc y en el sitio principal de documentos.
Parámetro Comentarios
create_home (crear inicio) Toma un valor booleano de yes o no. Se creará un directorio
de inicio para el usuario si el valor se establece en yes.
El módulo group
El módulo group permite administrar (agregar, eliminar, modificar) grupos en los hosts
administrados. Debe tener groupadd, groupdel o groupmod. Para los objetivos de Windows,
use el módulo win_group.
Parámetro Comentarios
RH294-RHEL8.0-es-1-20200501 405
capítulo 10 | Automatización de tareas de administración de Linux
Parámetro Comentarios
406 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Referencias
Documentación de Ansible del módulo users
http://docs.ansible.com/ansible/latest/modules/user_module.html#user-module
¿Cómo genero contraseñas cifradas para el módulo user?
https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-
generate-crypted-passwords-for-the-user-module
Documentación de Ansible del módulo group
https://docs.ansible.com/ansible/latest/modules/group_module.html#group-
module
Documentación de Ansible del módulo SSH known hosts
https://docs.ansible.com/ansible/latest/modules/
known_hosts_module.html#known-hosts-module
Documentación de Ansible del módulo authorized_key
https://docs.ansible.com/ansible/latest/modules/
authorized_key_module.html#authorized-key-module
Documentación de Ansible del complemento (plug-in) lookup
https://docs.ansible.com/ansible/latest/plugins/lookup.html?highlight=lookup
RH294-RHEL8.0-es-1-20200501 407
capítulo 10 | Automatización de tareas de administración de Linux
Ejercicio Guiado
Administración de usuarios y
autenticación
En este ejercicio, creará múltiples usuarios en sus hosts administrados y llenará las claves
SSH autorizadas para ellos.
Resultados
Deberá poder realizar lo siguiente:
Andes De Comenzar
En workstation, ejecute el script de inicio del trabajo de laboratorio a fin de confirmar que
el entorno esté listo para que comience el trabajo de laboratorio. El script crea el directorio
de trabajo, denominado system-users, y lo completa con un archivo de configuración
Ansible, un inventario de hosts y algunos archivos de laboratorio.
Tiene la tarea de escribir una guía para asegurarse de que los usuarios y el grupo de usuarios estén
presentes en el host remoto. La guía debe garantizar que los usuarios puedan iniciar sesión con la
clave SSH autorizada, así como usar sudo sin especificar una contraseña, y que el usuario root no
pueda iniciar sesión directamente usando SSH.
408 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
3. Empiece a escribir la guía users.yml. Defina una sola jugada en la guía que se dirija al
grupo de hosts webservers. Agregue una cláusula vars_files que defina la ubicación
del nombre de archivo vars/users_vars.yml, que se ha creado para usted y que
contiene todos los nombres de usuario necesarios para este ejercicio. Agregue la cláusula
tasks a la guía.
Use un editor de texto para crear la guía users.yml. La guía debe contener lo siguiente:
---
- name: Create multiple local users
hosts: webservers
vars_files:
- vars/users_vars.yml
tasks:
4.2. Agregue una segunda tarea a la guía que usa el módulo user para crear los usuarios.
Agregue una cláusula loop: "{{ users }}" a la tarea para recorrer en bucle el
archivo de variables para cada nombre de usuario encontrado en el archivo vars/
users_vars.yml. Como name: para los usuarios, use el nombre de variable
item.username. Esto permite que el archivo de variables contenga información
RH294-RHEL8.0-es-1-20200501 409
capítulo 10 | Automatización de tareas de administración de Linux
adicional que puede ser útil para crear los usuarios, como los grupos a los que
deberían pertenecer. La segunda tarea contiene lo siguiente:
5. Agregue una tercera tarea que use el módulo authorized_key para garantizar que las
claves públicas SSH se hayan distribuido correctamente en el host remoto. En el directorio
files, cada uno de los usuarios tiene un único archivo de clave pública SSH. El módulo
recorre en bucle la lista de usuarios, encuentra la clave apropiada usando la variable
username y envía la clave al host remoto.
La tercera tarea contiene lo siguiente:
6. Agregue una cuarta tarea a la reproducción que use el módulo copy para modificar el
archivo de configuración sudo y permitir a los miembros del grupo webadmin usar sudo
sin una contraseña en el host remoto.
410 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
- name: Modify sudo config to allow webadmin users sudo without a password
copy:
content: "%webadmin ALL=(ALL) NOPASSWD: ALL"
dest: /etc/sudoers.d/webadmin
mode: 0440
7. Agregue una quinta tarea para asegurarse de que el usuario root no tenga permitido
iniciar sesión usando SSH directamente. Use notify: "Restart sshd" para
desencadenar un manejador para reiniciar SSH.
La quinta tarea aparece como sigue:
8. En la primera línea después de la ubicación del archivo de variables, agregue una nueva
definición de manejador. Asígnele el nombre de Restart sshd.
...output omitted...
- vars/users_vars.yml
handlers:
- name: Restart sshd
service:
name: sshd
state: restarted
---
- name: Create multiple local users
hosts: webservers
vars_files:
- vars/users_vars.yml
handlers:
- name: Restart sshd
service:
name: sshd
state: restarted
tasks:
RH294-RHEL8.0-es-1-20200501 411
capítulo 10 | Automatización de tareas de administración de Linux
- name: Modify sudo config to allow webadmin users sudo without a password
copy:
content: "%webadmin ALL=(ALL) NOPASSWD: ALL"
dest: /etc/sudoers.d/webadmin
mode: 0440
412 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
TASK [Modify sudo config to allow webadmin users sudo without a password] ***
changed: [servera.lab.example.com]
9. Como el usuario user1, inicie sesión en el servidor servera usando SSH. Una vez iniciada
la sesión, use el comando sudo su - para cambiar la identidad al usuario root .
9.1. Use SSH como usuario user1 e inicie sesión en el servidor servera.
[user1@servera ~]$
10. Intente iniciar sesión en el servidor servera, como el usuario root directamente. Este
paso debería fallar, ya que la configuración de SSH se modificó para no permitir inicios de
sesión directos del usuario root.
10.1. Desde workstation utilice SSH como root para iniciar sesión en el servidor
servera.
RH294-RHEL8.0-es-1-20200501 413
capítulo 10 | Automatización de tareas de administración de Linux
Esto confirma que la configuración SSH denegó el acceso directo al sistema para el
usuario root.
Finalizar
En workstation, ejecute el script lab system-users finish para limpiar los recursos creados
en este ejercicio.
414 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Objetivos
Tras finalizar esta sección, deberá ser capaz de administrar el inicio del servicio, programar
procesos con at, cron y systemd, reiniciar y controlar el destino de inicio predeterminado en los
hosts administrados.
Parámetros
RH294-RHEL8.0-es-1-20200501 415
capítulo 10 | Automatización de tareas de administración de Linux
Esta reproducción usa el comando cache:clear de una empresa para limpiar inmediatamente la
memoria caché de Bolt, eliminando los archivos almacenados en caché y la memoria caché de
directories.flushes del servidor de CMS todas las mañanas a las 11:45.
Ansible escribirá la reproducción en crontab con la sintaxis correcta, como lo indicó el usuario.
Parámetros
416 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
nota
El daemon init se reemplazó por systemd. Por eso, en muchos casos, systemd será
la mejor opción.
Para sanear cualquier variable, se sugiere que use “{{ var | quote }}” en lugar de solo
“{{ var }}”
RH294-RHEL8.0-es-1-20200501 417
capítulo 10 | Automatización de tareas de administración de Linux
nota
El módulo command se considera más seguro porque no se ve afectado por el
entorno de los usuarios.
La recopilación de datos en el host administrado le permitirá acceder a las variables del entorno.
Hay una sublista llamada ansible_env que tiene todas las variables de entorno dentro de ella.
---
- name:
hosts: webservers
vars:
local_shell: "{{ ansible_env }}"
tasks:
- name: Printing all the environment variables in Ansible
debug:
msg: "{{ local_shell }}"
Puede aislar la variable que desea devolver usando el complemento (plug-in) de búsqueda.
msg: "{{ lookup('env', 'USER', 'HOME', 'SHELL') }}"
Referencias
at: Programar la ejecución de un comando o archivo de script mediante el
comando at — Documentación de Ansible
https://docs.ansible.com/ansible/latest/modules/at_module.html
418 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Ejercicio Guiado
Resultados
Debe ser capaz de usar una guía para:
Andes De Comenzar
Desde workstation, ejecute el script lab system-process start para configurar el
entorno para el ejercicio. El script crea el directorio de trabajo system-process y descarga
el archivo de configuración de Ansible y el archivo de inventario del host necesarios para el
ejercicio.
2.1. Cree una nueva guía, create_crontab_file.yml, y agregue las líneas necesarias
para iniciar la reproducción. Debe apuntar a los hosts administrados del grupo
webservers y habilitar el escalamiento de privilegios.
RH294-RHEL8.0-es-1-20200501 419
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Recurring cron job
hosts: webservers
become: true
2.2. Defina una tarea que use el módulo cron para programar un trabajo cron recurrente.
nota
El módulo cron proporciona una opción name para describir de forma única la
entrada del archivo crontab y garantizar los resultados esperados. La descripción
se agrega al archivo crontab. Por ejemplo, se requiere la opción name para eliminar
una entrada de crontab usando state=absent. Además, la opción name evita
que se cree siempre una nueva entrada de crontab cuando se configura el estado
predeterminado, state=present.
tasks:
- name: Crontab file exists
cron:
name: Add date and time to a file
2.3. Configure el trabajo para que se ejecute cada dos minutos entre las 09:00 y las
16:59 de lunes a viernes.
minute: "*/2"
hour: 9-16
weekday: 1-5
user: devops
job: date >> /home/devops/my_date_time_cron_job
cron_file: add-date-time
state: present
2.5. Cuando se complete, la guía debe verse de la siguiente forma. Revise la guía para
comprobar la precisión.
---
- name: Recurring cron job
hosts: webservers
become: true
tasks:
- name: Crontab file exists
cron:
name: Add date and time to a file
420 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
minute: "*/2"
hour: 9-16
weekday: 1-5
user: devops
job: date >> /home/devops/my_date_time_cron_job
cron_file: add-date-time
state: present
playbook: create_crontab_file.yml
2.8. Ejecute un comando ad hoc para verificar que el archivo cron /etc/cron.d/add-
date-time existe y su contenido es correcto.
3.1. Cree una guía nueva remove_cron_job.yml y agregue las siguientes líneas:
---
- name: Remove scheduled cron job
hosts: webservers
become: true
RH294-RHEL8.0-es-1-20200501 421
capítulo 10 | Automatización de tareas de administración de Linux
tasks:
- name: Cron job removed
cron:
name: Add date and time to a file
user: devops
cron_file: add-date-time
state: absent
playbook: remove_cron_job.yml
3.4. Ejecute un comando ad hoc para verificar que el archivo cron /etc/cron.d/add-
date-time siga existiendo, pero que el trabajo cron se haya eliminado.
4.1. Cree una guía nueva schedule_at_task.yml y agregue las siguientes líneas:
---
- name: Schedule at task
hosts: webservers
become: true
become_user: devops
422 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
tasks:
- name: Create date and time file
at:
command: "date > ~/my_at_date_time\n"
count: 1
units: minutes
unique: yes
state: present
playbook: schedule_at_task.yml
4.4. Después de esperar un minuto hasta que se complete el comando at, ejecute
comandos ad hoc para verificar que el archivo /home/devops/my_at_date_time
existe y tiene el contenido correcto.
RH294-RHEL8.0-es-1-20200501 423
capítulo 10 | Automatización de tareas de administración de Linux
nota
En el siguiente módulo file, el vínculo simbólico hace referencia al valor del
parámetro src. El valor del parámetro dest es el vínculo simbólico.
---
- name: Change default boot target
hosts: webservers
become: true
tasks:
- name: Default boot target is graphical
file:
src: /usr/lib/systemd/system/graphical.target
dest: /etc/systemd/system/default.target
state: link
playbook: set_default_boot_target_graphical.yml
5.3. Antes de ejecutar la guía, ejecute un comando ad hoc para verificar que el destino de
arranque predeterminado actual sea multi-user.target:
424 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
5.5. Ejecute un comando ad hoc para verificar que el destino de arranque predeterminado
ahora sea graphical.target.
6.1. Cree una guía nueva reboot_hosts.yml y agregue las siguientes líneas:
---
- name: Reboot hosts
hosts: webservers
become: true
tasks:
- name: Hosts are rebooted
reboot:
playbook: reboot_hosts.yml
6.3. Antes de ejecutar la guía, ejecute un comando ad hoc para determinar el sello de hora
del último reinicio del sistema.
RH294-RHEL8.0-es-1-20200501 425
capítulo 10 | Automatización de tareas de administración de Linux
ok: [servera.lab.example.com]
6.5. Ejecute un comando ad hoc para determinar el sello de hora del último reinicio del
sistema. El sello de hora que se muestra después de que se ejecuta la guía debe ser
posterior.
6.6. Ejecute un segundo comando ad hoc para determinar que el destino de arranque
graphical.target haya sobrevivido al reinicio.
---
- name: Change default runlevel target
hosts: webservers
become: true
tasks:
- name: Default runlevel is multi-user target
file:
src: /usr/lib/systemd/system/multi-user.target
dest: /etc/systemd/system/default.target
state: link
426 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
playbook: set_default_boot_target_multi-user.yml
7.4. Ejecute un comando ad hoc para verificar que el destino de arranque predeterminado
ahora sea multi-user.target.
Finalizar
En workstation, ejecute el script lab system-process finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 427
capítulo 10 | Automatización de tareas de administración de Linux
Objetivos
Tras finalizar esta sección, deberá poder particionar los dispositivos de almacenamiento,
configurar LVM, formatear particiones o volúmenes lógicos, montar sistemas de archivos, y
agregar espacios o archivos de intercambio.
428 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
La siguiente tarea crea un grupo de volúmenes con un tamaño de extensión física específico
usando un dispositivo de bloque como backend.
El módulo lvol crea volúmenes lógicos, y admite el cambio de tamaño y la reducción de esos
volúmenes, y de los sistemas de archivos que están encima de ellos. Este módulo también admite
la creación de instantáneas para los volúmenes lógicos. La tabla siguiente enumera algunos de los
parámetros para el módulo lvol.
RH294-RHEL8.0-es-1-20200501 429
capítulo 10 | Automatización de tareas de administración de Linux
430 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
RH294-RHEL8.0-es-1-20200501 431
capítulo 10 | Automatización de tareas de administración de Linux
La opción filter (filtrar) para el módulo setup admite filtrado detallado basado en comodines
de tipo shell.
432 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
"partitions": {},
"removable": "1",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "mq-deadline",
"sectors": "2097151",
"sectorsize": "512",
"size": "1024.00 MB",
"support_discard": "0",
"vendor": "QEMU",
"virtual": 1
},
"vda": {
"holders": [],
"host": "SCSI storage controller: Red Hat, Inc. Virtio block
device",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": null,
"partitions": {
"vda1": {
"holders": [],
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": [
"a8063676-44dd-409a-b584-68be2c9f5570"
]
},
"sectors": "20969439",
"sectorsize": 512,
"size": "10.00 GB",
"start": "2048",
"uuid": "a8063676-44dd-409a-b584-68be2c9f5570"
}
},
"removable": "0",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "mq-deadline",
"sectors": "20971520",
"sectorsize": "512",
"size": "10.00 GB",
"support_discard": "0",
"vendor": "0x1af4",
"virtual": 1
},
"vdb": {
RH294-RHEL8.0-es-1-20200501 433
capítulo 10 | Automatización de tareas de administración de Linux
"holders": [],
"host": "SCSI storage controller: Red Hat, Inc. Virtio block
device",
"links": {
"ids": [],
"labels": [],
"masters": [],
"uuids": []
},
"model": null,
"partitions": {},
"removable": "0",
"rotational": "1",
"sas_address": null,
"sas_device_handle": null,
"scheduler_mode": "mq-deadline",
"sectors": "10485760",
"sectorsize": "512",
"size": "5.00 GB",
"support_discard": "0",
"vendor": "0x1af4",
"virtual": 1
}
}
},
"changed": false
}
434 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Referencias
parted: Configurar particiones de dispositivo de bloque; documentación de
Ansible
https://docs.ansible.com/ansible/latest/modules/parted_module.html
RH294-RHEL8.0-es-1-20200501 435
capítulo 10 | Automatización de tareas de administración de Linux
Ejercicio Guiado
Resultados
Deberá poder realizar lo siguiente:
Andes De Comenzar
Desde workstation, ejecute el script lab system-storage start para configurar
el entorno para el ejercicio. El script crea el directorio del proyecto system-storage y
descarga el archivo de configuración Ansible y el archivo del inventario del host necesarios
para el ejercicio.
• Administrar un grupo de volúmenes llamado apache-vg para datos del servidor web
• Crear dos volúmenes lógicos denominados content-lv y logs-lv, ambos respaldados por el
grupo de volumen apache-vg
Si los requisitos de almacenamiento para el servidor web cambian, actualice las variables
correspondientes de la guía y vuelva a ejecutarla. La guía debe ser idempotente.
436 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Ensure Apache Storage Configuration
hosts: webservers
vars_files:
- storage_vars.yml
tasks:
- name: Correct partitions exist on /dev/vdb
debug:
msg: TODO
loop: "{{ partitions }}"
El nombre de cada tarea actúa como un resumen del procedimiento que se pretende
implementar. En pasos posteriores, actualizará y cambiará estas seis tareas.
RH294-RHEL8.0-es-1-20200501 437
capítulo 10 | Automatización de tareas de administración de Linux
---
partitions:
- number: 1
start: 1MiB
end: 257MiB
volume_groups:
- name: apache-vg
devices: /dev/vdb1
logical_volumes:
- name: content-lv
size: 64M
vgroup: apache-vg
mount_path: /var/www
- name: logs-lv
size: 128M
vgroup: apache-vg
mount_path: /var/log/httpd
nota
El grupo de volumen apache-vg tiene una capacidad de 256 MiB, porque está
respaldado por la partición /dev/vdb1. Proporciona suficiente capacidad para
ambos volúmenes lógicos.
438 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
"msg": "TODO"
}
...output omitted...
3. Cambie la primera tarea para usar el módulo parted para configurar una partición para
cada elemento de bucle. Cada elemento describe una partición deseada del dispositivo /
dev/vdb en cada servidor web:
number
El número de partición. Use esto como el valor de la palabra clave number para el
módulo parted.
start
El inicio de la partición, como un desplazamiento desde el principio del dispositivo
de bloque. Use esto como el valor de la palabra clave part_start para el módulo
parted.
end
El fin de la partición, como un desplazamiento desde el principio del dispositivo de
bloque. Use esto como el valor de la palabra clave part_end para el módulo parted.
RH294-RHEL8.0-es-1-20200501 439
capítulo 10 | Automatización de tareas de administración de Linux
4. Cambie la segunda tarea de la guía para usar el módulo lvg para configurar un grupo de
volúmenes para cada elemento de bucle. Cada elemento de la variable volume_groups
describe un grupo de volúmenes que debería existir en cada servidor web:
name
El nombre del grupo de volúmenes. Use esto como el valor de la palabra clave vg para
el módulo lvg.
devices
Lista de dispositivos o particiones separados por coma que forman el grupo de
volúmenes. Use esto como el valor de la palabra clave pvs para el módulo lvg.
5. Cambie la tercera tarea de la guía para usar el módulo lvol para crear un volumen lógico
para cada elemento. Utilice las palabras clave del elemento para crear el nuevo volumen
lógico:
name
El nombre del volumen lógico. Use esto como el valor de la palabra clave lv para el
módulo lvol.
vgroup
El nombre del grupo de volúmenes que proporciona almacenamiento para el volumen
lógico.
size
El tamaño del volumen lógico. El valor de esta palabra clave es cualquier valor
aceptable para la opción -L del comando lvcreate.
Solo ejecute la tarea si todavía no existe un volumen lógico. Actualice la afirmación when
para comprobar que no existe un volumen lógico con un nombre que coincida con el valor
de la palabra clave name del elemento.
5.1. Cambie la tercera tarea para usar el módulo lvol. Configure el nombre del grupo de
volúmenes, el nombre del volumen lógico y el tamaño del volumen lógico utilizando
las palabras clave de cada elemento. El contenido de la tercera tarea ahora es el
siguiente:
440 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
5.2. El dato Ansible ansible_lvm contiene información sobre los objetos de Logical
Volume Management en cada host. Utilice un comando ad hoc para ver el conjunto
actual de volúmenes lógicos en el host remoto:
El valor de la palabra clave lvs indica que no hay volúmenes lógicos en el host
remoto.
5.3. Ejecute la guía para crear los volúmenes lógicos en el host remoto.
5.4. Ejecute otro comando ad hoc para ver la estructura de la variable ansible_lvm
cuando existen volúmenes lógicos en el host remoto.
RH294-RHEL8.0-es-1-20200501 441
capítulo 10 | Automatización de tareas de administración de Linux
"ansible_facts": {
"ansible_lvm": {
"lvs": {
"content-lv": {
"size_g": "0.06",
"vg": "apache-vg"
},
"logs-lv": {
"size_g": "0.12",
"vg": "apache-vg"
}
},
"pvs": {
"/dev/vdb1": {
"free_g": "0.06",
"size_g": "0.25",
"vg": "apache-vg"
}
},
"vgs": {
"apache-vg": {
"free_g": "0.06",
"num_lvs": "2",
"num_pvs": "1",
"size_g": "0.25"
}
}
}
},
"changed": false
}
El valor de la palabra clave lvs es una estructura de datos de par de valor clave.
Las claves de esta estructura son los nombres de cualquier volumen lógico en
el host. Esto indica que existen tanto el volumen lógico content-lv como
logs-lv. Para cada volumen lógico, la palabra clave vg proporciona el grupo de
volúmenes correspondiente.
La palabra clave pvs contiene información sobre volúmenes físicos en el host.
La información indica que la partición /dev/vdb1 pertenece al grupo de
volúmenes apache-vg.
La palabra clave vgs contiene información sobre grupos de volúmenes en el
host.
5.5. Actualice la afirmación when para comprobar que no existe un volumen lógico con un
nombre que coincida con el valor de la palabra clave name del elemento. El contenido
de la tercera tarea ahora es el siguiente:
442 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
6. Cambie la cuarta tarea para usar el módulo filesystem. Configure la tarea para
asegurarse de que cada volumen lógico esté formateado como un sistema de archivos XFS.
Recuerde que un volumen lógico está asociado con el dispositivo lógico /dev/<volume
group name>/<logical volume name> .
El contenido de la cuarta tarea debe ser el siguiente:
7. Configure la quinta tarea para asegurarse de que cada volumen lógico tenga la capacidad
de almacenamiento correcta. Si el volumen lógico aumenta en capacidad, asegúrese de
forzar la expansión del sistema de archivos del volumen.
Advertencia
Si un volumen lógico necesita disminuir su capacidad, esta tarea fallará porque un
sistema de archivos XFS no admite la reducción de la capacidad.
8. Use el módulo mount en la sexta tarea para garantizar que cada volumen lógico se monte
en la ruta de montaje correspondiente y persista después de un reinicio.
El contenido de la sexta tarea debe ser el siguiente:
9. Revise la guía storage.yml completada. Ejecute la guía y verifique que cada volumen
lógico esté montado.
RH294-RHEL8.0-es-1-20200501 443
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Ensure Apache Storage Configuration
hosts: webservers
vars_files:
- storage_vars.yml
tasks:
- name: Correct partitions exist on /dev/vdb
parted:
device: /dev/vdb
state: present
number: "{{ item.number }}"
part_start: "{{ item.start }}"
part_end: "{{ item.end }}"
loop: "{{ partitions }}"
444 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Una tarea se omite durante la ejecución porque la guía se ejecutó previamente con
los mismos valores de variable. No necesitaban crearse los volúmenes.
9.3. Use un comando ad hoc Ansible para ejecutar el comando lsblk en el host remoto.
La salida indica los puntos de montaje de los volúmenes lógicos.
RH294-RHEL8.0-es-1-20200501 445
capítulo 10 | Automatización de tareas de administración de Linux
10. Aumente la capacidad del volumen lógico content-lv a 128 MiB y del volumen lógico
logs-lv a 256 MiB. Esto requiere aumentar la capacidad del grupo de volúmenes
apache-vg.
Cree una nueva partición con una capacidad de 256 MiB y agréguela al grupo de
volúmenes apache-vg.
partitions:
- number: 1
start: 1MiB
end: 257MiB
- number: 2
start: 257MiB
end: 513MiB
volume_groups:
- name: apache-vg
devices: /dev/vdb1,/dev/vdb2
logical_volumes:
- name: content-lv
size: 128M
vgroup: apache-vg
mount_path: /var/www
- name: logs-lv
size: 256M
vgroup: apache-vg
mount_path: /var/log/httpd
446 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
10.5. Use un comando ad hoc Ansible para ejecutar el comando lsblk en el host remoto.
La salida indica que cada volumen lógico es del tamaño correcto y está montado
en el directorio correcto. Existen dos entradas para cada volumen lógico porque los
archivos almacenados en el volumen lógico pueden estar ubicados físicamente en
cualquier partición (/dev/vdb1 o /dev/vdb2).
RH294-RHEL8.0-es-1-20200501 447
capítulo 10 | Automatización de tareas de administración de Linux
Finalizar
Ejecute el comando lab system-storage finish para limpiar el host administrado.
448 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Objetivos
Tras completar esta sección, deberá ser capaz de configurar los ajustes de red y la resolución de
nombres en los hosts administrados y recopilar datos de Ansible relacionados con la red.
El rol de sistema de red admite la configuración de redes en hosts administrados. Este rol admite
la configuración de interfaces Ethernet, interfaces de puente, interfaces enlazadas, interfaces
VLAN, interfaces MacVLAN e interfaces Infiniband. El rol de red se configura con dos variables,
network_provider y network_connections.
---
network_provider: nm
network_connections:
- name: ens4
type: ethernet
ip:
address:
- 172.25.250.30/24
RH294-RHEL8.0-es-1-20200501 449
capítulo 10 | Automatización de tareas de administración de Linux
network_connections:
- name: eth0
persistent_state: present
type: ethernet
autoconnect: yes
mac: 00:00:5e:00:53:5d
ip:
address:
- 172.25.250.40/24
zone: external
450 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Para usar el rol de sistema de red, debe especificar el nombre del rol en la cláusula roles de la
guía, dela siguiente manera:
Puede especificar variables para el rol de red con la cláusula vars, como en el ejemplo anterior, o
crear un archivo YAML con esas variables en los directorios group_vars o host_vars, según el
caso de uso.
RH294-RHEL8.0-es-1-20200501 451
capítulo 10 | Automatización de tareas de administración de Linux
El módulo hostname (nombre de host) establece el nombre de host para un host administrado sin
modificar el archivo /etc/hosts. Este módulo usa el parámetro name (nombre) para especificar
el nuevo nombre de host, como en la tarea que se muestra a continuación:
La siguiente tarea muestra cómo crear una regla de FirewallD para el servicio http en la zona
predeterminada (public [pública]). La tarea configura la regla como permanente y se asegura de
que esté activa.
452 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
Todas las interfaces de red para un host administrado están disponibles en el elemento
ansible_interfaces. Puede usar el parámetro gather_subset=network para el módulo
setup a fin de restringir los hechos a los incluidos en el subconjunto network (red). La opción
filter (filtrar) para el módulo setup admite filtrado detallado basado en comodines de tipo
shell.
RH294-RHEL8.0-es-1-20200501 453
capítulo 10 | Automatización de tareas de administración de Linux
El comando anterior muestra que hay tres interfaces de red disponibles en el host administrado,
host.lab.example.com: lo, ens3 y ens4.
Puede recuperar información adicional sobre la configuración de una interfaz de red con el filtro
ansible_NIC_name para el módulo setup. Por ejemplo, para recuperar la configuración de la
interfaz de red ens4, use el filtro ansible_ens4.
En la siguiente tabla, se enumeran algunos de los datos disponibles para el subconjunto network.
454 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
nota
Ansible también proporciona la variable inventory_hostname que incluye el
nombre de host como está configurado en el archivo de inventario de Ansible.
Referencias
Base de conocimiento: Roles de sistema de Red Hat Enterprise Linux (RHEL)
https://access.redhat.com/articles/3050101
RH294-RHEL8.0-es-1-20200501 455
capítulo 10 | Automatización de tareas de administración de Linux
Ejercicio Guiado
Resultados
Deberá ser capaz de configurar los ajustes de red y la resolución de nombres en los hosts
administrados y recopilar datos de Ansible relacionados con la red.
Andes De Comenzar
Desde workstation, ejecute el script lab system-network start para configurar el
entorno para el ejercicio. El script crea el directorio de trabajo system-network y descarga
el archivo de configuración de Ansible y el archivo de inventario del host necesarios para el
ejercicio.
2. Use el comando ansible-galaxy para verificar que los roles del sistema estén
disponibles. Si no hay roles disponibles, debe instalar el paquete rhel-system-roles.
456 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
3. Cree una guía que use el rol linux-system-roles.network para configurar la interfaz de red de
repuesto, ens4, en servera.lab.example.com con la dirección IP 172.25.250.30.
3.1. Cree una guía, playbook.yml, con una reproducción orientada al grupo de hosts
webservers. Incluya el rol rhel-system-roles.network en la sección roles de
la reproducción.
---
- name: NIC Configuration
hosts: webservers
roles:
- rhel-system-roles.network
3.2. Consulte la sección Variables de rol del archivo README.md para conocer el rol rhel-
system-roles.network. Determine las variables de rol para configurar la interfaz
de red ens4 con la dirección IP 172.25.250.30.
3.4. Cree un archivo nuevo network.yml para definir variables de rol. Como estos
valores de variable se aplican a los hosts del grupo de hosts webservers, debe crear
ese archivo en el directorio group_vars/webservers. Agregue definiciones de
variables para admitir la configuración de la interfaz de red ens4. El archivo ahora
contiene lo siguiente:
---
network_connections:
- name: ens4
type: ethernet
ip:
address:
- 172.25.250.30/24
RH294-RHEL8.0-es-1-20200501 457
capítulo 10 | Automatización de tareas de administración de Linux
changed: [servera.lab.example.com]
4. Use el módulo setup de Ansible en un comando adhoc de Ansible para verificar que la
configuración de la interfaz de red ens4 en servera sea correcta.
4.1. Use el módulo de Ansible setup para enumerar todos los datos de Ansible
disponibles para servera. Filtre los resultados para la interfaz de red ens4 con la
opción -a 'filter=filter_string'. Verifique que la interfaz de red ens4 use
la dirección IP 172.25.250.30. La configuración de la dirección IP puede demorar
hasta un minuto.
458 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
"broadcast": "172.25.250.255",
"netmask": "255.255.255.0",
"network": "172.25.250.0"
},
...output omitted...
Finalizar
En workstation, ejecute el script lab system-network finish para limpiar los recursos
creados en este ejercicio.
RH294-RHEL8.0-es-1-20200501 459
capítulo 10 | Automatización de tareas de administración de Linux
Trabajo de laboratorio
Automatización de tareas de
administración de Linux
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará y realizará tareas administrativas en hosts
administrados usando una guía.
Resultados
Debe ser capaz de crear guías para configurar en un host administrado un repositorio
de software, usuarios y grupos, volúmenes lógicos, trabajos de cron e interfaces de red
adicionales.
Andes De Comenzar
En workstation, ejecute el script de inicio del trabajo de laboratorio a fin de confirmar que
el entorno esté listo para que comience el trabajo de laboratorio. El script crea el directorio
de trabajo, denominado system-review, y lo completa con un archivo de configuración
Ansible, un inventario de hosts y archivos de laboratorio.
1. Cree y ejecute en el grupo de hosts webservers una guía que configure el repositorio
interno de Yum ubicado en http://materials.example.com/yum/repository, e
instale el paquete example-motd disponible en ese repositorio. Todos los paquetes RPM
están firmados con un par de claves GPG organizativas. La clave pública de GPG está
disponible en http://materials.example.com/yum/repository/RPM-GPG-KEY-
example.
2. Cree y ejecute en el grupo de hosts webservers una guía que cree el grupo de usuarios
webadmin, y agregue dos usuarios a ese grupo, ops1 y ops2.
3. Cree y ejecute en el grupo de hosts webservers una guía que use el dispositivo /dev/
vdb para crear un grupo de volúmenes llamado apache-vg. Esta guía también crea dos
volúmenes lógicos denominados content-lv y logs-lv, ambos respaldados por el grupo
de volúmenes apache-vg. Finalmente, crea un sistema de archivos XFS en cada volumen
lógico y monta el volumen lógico content-lv en /var/www, y el volumen lógico logs-lv
en /var/log/httpd. El script de laboratorio completa dos archivos en ~/system-review,
storage.yml que proporciona un esqueleto inicial para la guía, y storage_vars.xml que
proporciona valores para todas las variables requeridas por los diferentes módulos.
4. Cree y ejecute en el grupo de hosts webservers una guía que use el módulo cron para
crear el archivo crontab /etc/cron.d/disk_usage que programa un trabajo cron
recurrente. El trabajo debe ejecutarse con el usuario devops cada dos minutos entre las
09:00 y las 16:59 de lunes a viernes. El trabajo debe adjuntar el uso de disco actual al
archivo /home/devops/disk_usage.
460 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
5. Cree y ejecute en el grupo de hosts webservers una guía que use el rol linux-system-
roles.network para configurar con la dirección IP 172.25.250.40/24 la interfaz de red
de repuesto, ens4.
6. Ejecute lab system-review grade en workstation para calificar su trabajo.
Finalizar
En workstation, ejecute el script lab system-review finish para "limpiar" los recursos
creados en este trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 461
capítulo 10 | Automatización de tareas de administración de Linux
Solución
Automatización de tareas de
administración de Linux
Lista de verificación de rendimiento
En este trabajo de laboratorio, configurará y realizará tareas administrativas en hosts
administrados usando una guía.
Resultados
Debe ser capaz de crear guías para configurar en un host administrado un repositorio
de software, usuarios y grupos, volúmenes lógicos, trabajos de cron e interfaces de red
adicionales.
Andes De Comenzar
En workstation, ejecute el script de inicio del trabajo de laboratorio a fin de confirmar que
el entorno esté listo para que comience el trabajo de laboratorio. El script crea el directorio
de trabajo, denominado system-review, y lo completa con un archivo de configuración
Ansible, un inventario de hosts y archivos de laboratorio.
1. Cree y ejecute en el grupo de hosts webservers una guía que configure el repositorio
interno de Yum ubicado en http://materials.example.com/yum/repository, e
instale el paquete example-motd disponible en ese repositorio. Todos los paquetes RPM
están firmados con un par de claves GPG organizativas. La clave pública de GPG está
disponible en http://materials.example.com/yum/repository/RPM-GPG-KEY-
example.
462 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
---
- name: Repository Configuration
hosts: webservers
tasks:
- name: Ensure Example Repo exists
yum_repository:
name: example-internal
description: Example Inc. Internal YUM repo
file: example
baseurl: http://materials.example.com/yum/repository/
gpgcheck: yes
1.3. Agregue una segunda tarea a la reproducción que use el módulo rpm_key para
asegurarse de que la clave pública del repositorio esté presente en el host remoto. La
URL de la clave pública del repositorio es http://materials.example.com/yum/
repository/RPM-GPG-KEY-example.
La segunda tarea aparece de la siguiente manera:
1.4. Agregue una tercera tarea para instalar el paquete example-motd disponible en el
repositorio interno de Yum.
La tercera tarea aparece de la siguiente manera:
RH294-RHEL8.0-es-1-20200501 463
capítulo 10 | Automatización de tareas de administración de Linux
2. Cree y ejecute en el grupo de hosts webservers una guía que cree el grupo de usuarios
webadmin, y agregue dos usuarios a ese grupo, ops1 y ops2.
2.2. Cree la guía users.yml. Defina una sola reproducción en la guía que se dirija al grupo
de hosts webservers. Agregue una cláusula vars_files que defina la ubicación del
nombre de archivo vars/users_vars.yml. Agregue una tarea que use el módulo
group para crear el grupo de usuarios webadmin en el host remoto.
---
- name: Create multiple local users
hosts: webservers
vars_files:
- vars/users_vars.yml
tasks:
- name: Add webadmin group
group:
name: webadmin
state: present
2.3. Agregue una segunda tarea a la guía que usa el módulo user para crear los usuarios.
Agregue una cláusula loop: "{{ users }}" a la tarea para recorrer en bucle el
archivo de variables para cada nombre de usuario encontrado en el archivo vars/
users_vars.yml. Como name: para los usuarios, use el nombre de variable
item.username. De esta manera, el archivo de variables puede contener información
adicional que puede ser útil para crear los usuarios, como los grupos a los que deberían
pertenecer. La segunda tarea contiene lo siguiente:
464 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
PLAY RECAP
****************************************************************************
serverb.lab.example.com : ok=3 changed=2 unreachable=0 failed=0
3. Cree y ejecute en el grupo de hosts webservers una guía que use el dispositivo /dev/
vdb para crear un grupo de volúmenes llamado apache-vg. Esta guía también crea dos
volúmenes lógicos denominados content-lv y logs-lv, ambos respaldados por el grupo
de volúmenes apache-vg. Finalmente, crea un sistema de archivos XFS en cada volumen
lógico y monta el volumen lógico content-lv en /var/www, y el volumen lógico logs-lv
en /var/log/httpd. El script de laboratorio completa dos archivos en ~/system-review,
storage.yml que proporciona un esqueleto inicial para la guía, y storage_vars.xml que
proporciona valores para todas las variables requeridas por los diferentes módulos.
partitions:
- number: 1
start: 1MiB
end: 257MiB
volume_groups:
- name: apache-vg
devices: /dev/vdb1
logical_volumes:
- name: content-lv
size: 64M
vgroup: apache-vg
mount_path: /var/www
RH294-RHEL8.0-es-1-20200501 465
capítulo 10 | Automatización de tareas de administración de Linux
- name: logs-lv
size: 128M
vgroup: apache-vg
mount_path: /var/log/httpd
nota
El grupo de volumen apache-vg tiene una capacidad de 256 MiB, porque está
respaldado por la partición /dev/vdb1. Proporciona suficiente capacidad para
ambos volúmenes lógicos.
3.2. Cambie la primera tarea de la guía storage.yml para usar el módulo parted para
configurar una partición para cada ítem de bucle. Cada ítem describe una partición
deseada del dispositivo /dev/vdb en cada servidor web:
number
El número de partición. Use esto como el valor de la palabra clave number para el
módulo parted.
start
El inicio de la partición, como un desplazamiento desde el principio del dispositivo
de bloque. Use esto como el valor de la palabra clave part_start para el módulo
parted.
end
El fin de la partición, como un desplazamiento desde el principio del dispositivo
de bloque. Use esto como el valor de la palabra clave part_end para el módulo
parted.
3.3. Cambie la segunda tarea de la guía para usar el módulo lvg para configurar un
grupo de volúmenes para cada elemento de bucle. Cada elemento de la variable
466 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
name
El nombre del grupo de volúmenes. Use esto como el valor de la palabra clave vg
para el módulo lvg.
devices
Lista de dispositivos o particiones separados por coma que forman el grupo de
volúmenes. Use esto como el valor de la palabra clave pvs para el módulo lvg.
3.4. Cambie la tercera tarea para usar el módulo lvol. Configure el nombre del grupo de
volúmenes, el nombre del volumen lógico y el tamaño del volumen lógico utilizando las
palabras clave de cada elemento. El contenido de la tercera tarea ahora es el siguiente:
3.5. Cambie la cuarta tarea para usar el módulo filesystem. Configure la tarea para
asegurarse de que cada volumen lógico esté formateado como un sistema de archivos
XFS. Recuerde que un volumen lógico está asociado con el dispositivo lógico /
dev/<volume group name>/<logical volume name> .
El contenido de la cuarta tarea debe ser el siguiente:
3.6. Configure la quinta tarea para asegurarse de que cada volumen lógico tenga la
capacidad de almacenamiento correcta. Si el volumen lógico aumenta en capacidad,
asegúrese de forzar la expansión del sistema de archivos del volumen.
Advertencia
Si un volumen lógico necesita disminuir su capacidad, esta tarea fallará porque un
sistema de archivos XFS no admite la reducción de la capacidad.
RH294-RHEL8.0-es-1-20200501 467
capítulo 10 | Automatización de tareas de administración de Linux
3.7. Use el módulo mount en la sexta tarea para garantizar que cada volumen lógico se
monte en la ruta de montaje correspondiente y persista después de un reinicio.
El contenido de la sexta tarea debe ser el siguiente:
3.8. Ejecute la guía para crear los volúmenes lógicos en el host remoto.
468 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
PLAY RECAP
*********************************************************************************
serverb.lab.example.com : ok=7 changed=5 unreachable=0 failed=0
4. Cree y ejecute en el grupo de hosts webservers una guía que use el módulo cron para
crear el archivo crontab /etc/cron.d/disk_usage que programa un trabajo cron
recurrente. El trabajo debe ejecutarse con el usuario devops cada dos minutos entre las
09:00 y las 16:59 de lunes a viernes. El trabajo debe adjuntar el uso de disco actual al
archivo /home/devops/disk_usage.
4.1. Cree una nueva guía, create_crontab_file.yml, y agregue las líneas necesarias
para iniciar la reproducción. Debe apuntar a los hosts administrados del grupo
webservers y habilitar el escalamiento de privilegios.
---
- name: Recurring cron job
hosts: webservers
become: true
4.2. Defina una tarea que use el módulo cron para programar un trabajo cron recurrente.
nota
El módulo cron proporciona una opción name para describir de forma única la
entrada del archivo crontab y garantizar los resultados esperados. La descripción
se agrega al archivo crontab. Por ejemplo, se requiere la opción name para eliminar
una entrada de crontab usando state=absent. Además, al configurar el estado
predeterminado state=present, la opción name evita que se cree siempre una
nueva entrada de crontab, independientemente de las existentes.
RH294-RHEL8.0-es-1-20200501 469
capítulo 10 | Automatización de tareas de administración de Linux
tasks:
- name: Crontab file exists
cron:
name: Add date and time to a file
4.3. Configure el trabajo para que se ejecute cada dos minutos entre las 09:00 y las 16:59
de lunes a viernes.
minute: "*/2"
hour: 9-16
weekday: 1-5
user: devops
job: df >> /home/devops/disk_usage
cron_file: disk_usage
state: present
4.5. Cuando se complete, la guía debe verse de la siguiente forma. Revise la guía para
comprobar la precisión.
---
- name: Recurring cron job
hosts: webservers
become: true
tasks:
- name: Crontab file exists
cron:
name: Add date and time to a file
minute: "*/2"
hour: 9-16
weekday: 1-5
user: devops
job: df >> /home/devops/disk_usage
cron_file: disk_usage
state: present
470 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
ok: [serverb.lab.example.com]
PLAY RECAP
*********************************************************************************
***
serverb.lab.example.com : ok=2 changed=1 unreachable=0 failed=0
5. Cree y ejecute en el grupo de hosts webservers una guía que use el rol linux-system-
roles.network para configurar con la dirección IP 172.25.250.40/24 la interfaz de red
de repuesto, ens4.
5.1. Use ansible-galaxy para verificar que los roles del sistema estén disponibles. Si no
lo están, debe instalar el paquete rhel-system-roles.
5.2. Cree una guía, network_playbook.yml, con una reproducción orientada al grupo
de hosts webservers. Incluya el rol rhel-system-roles.network en la sección
roles de la reproducción.
---
- name: NIC Configuration
hosts: webservers
roles:
- rhel-system-roles.network
5.4. Cree un archivo nuevo network.yml para definir variables de rol. Como estos valores
de variable se aplican a los hosts del grupo de hosts webservers, debe crear ese
archivo en el directorio group_vars/webservers. Agregue definiciones de variables
RH294-RHEL8.0-es-1-20200501 471
capítulo 10 | Automatización de tareas de administración de Linux
changed: [serverb.lab.example.com]
472 RH294-RHEL8.0-es-1-20200501
capítulo 10 | Automatización de tareas de administración de Linux
PLAY RECAP
*********************************************************************************
serverb.lab.example.com : ok=7 changed=1 unreachable=0 failed=0
Finalizar
En workstation, ejecute el script lab system-review finish para "limpiar" los recursos
creados en este trabajo de laboratorio.
RH294-RHEL8.0-es-1-20200501 473
capítulo 10 | Automatización de tareas de administración de Linux
Resumen
En este capítulo, aprendió lo siguiente:
• Los módulos user y group crean usuarios y grupos respectivamente en un host administrado.
Puede configurar claves autorizadas para un usuario con el módulo authorized_key.
• Los trabajos de Cron se pueden configurar en hosts administrados con el módulo cron.
• Ansible admite la configuración de volúmenes lógicos con los módulos lvg y lvol. Los módulos
parted y filesystem admiten respectivamente la partición de dispositivos y la creación de
sistemas de archivos.
• Red Hat Enterprise Linux 8 incluye el rol de sistema de red que admite la configuración de
interfaces de red en hosts administrados.
474 RH294-RHEL8.0-es-1-20200501
capítulo 11
RH294-RHEL8.0-es-1-20200501 475
capítulo 11 | Revisión completa: Automation with Ansible
Revisión completa
Objetivos
Tras finalizar esta sección, deberá ser capaz de demostrar competencia con las habilidades y los
conocimientos aprendidos en Red Hat Enterprise Linux Automation with Ansible.
Consulte las secciones anteriores del libro de texto para lecturas complementarias.
• Describir la motivación para automatizar las tareas de administración de Linux con Ansible, los
conceptos fundamentales de Ansible y la arquitectura básica de Ansible.
• Describir dónde se encuentran los archivos de configuración de Ansible, cómo los selecciona
Ansible y editarlos para aplicar los cambios a la configuración predeterminada.
• Ejecutar una única tarea de automatización Ansible utilizando un comando ad hoc y explicar
algunos casos de uso de comandos ad hoc.
• Escribir una guía que use varias reproducciones y escalamiento de privilegios por reproducción.
• Usar con eficacia ansible-doc para aprender a usar nuevos módulos a fin de implementar
tareas para una reproducción.
476 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
• Crear variables que afecten a hosts particulares o grupos de hosts, la reproducción o el entorno
global, y hacer referencia a ellas, y describir cómo funciona la prioridad de variables.
• Cifrar las variables confidenciales utilizando Ansible Vault y ejecutar guías que hagan referencia
a archivos de variables cifradas por Vault.
• Hacer referencia a los datos sobre hosts administrados que utilizan datos de Ansible y configurar
hechos personalizados en hosts administrados.
• Implementar bucles para escribir tareas eficientes a fin de controlar cuándo ejecutar tareas.
• Implementar una tarea que se ejecute solo cuando otra tarea cambie el host administrado.
• Controlar lo que sucede cuando falla una tarea y qué condiciones hacen que falle una tarea.
• Escribir patrones de host sofisticados para seleccionar hosts de manera eficiente para un
comando de reproducción o ad hoc.
• Describir las características y el propósito de los inventarios dinámicos, e instalar y usar un script
existente como fuente de inventario dinámico de Ansible.
• Ajustar la cantidad de conexiones simultáneas que Ansible abre a los hosts administrados, y
cómo Ansible procesa grupos de hosts administrados a través de las tareas de la reproducción.
• Administrar guías grandes importando o incluyendo otras guías o tareas desde archivos
externos, ya sea sin condiciones o sobre la base de una prueba condicional.
• Describir qué es un rol, cómo está estructurado y cómo puede usarlo en una guía.
• Crear un rol en el directorio de proyectos de una guía y ejecutarlo como parte de una de las
reproducciones de la guía.
• Seleccionar y recuperar roles de Ansible Galaxy u otras fuentes, como un repositorio Git, y
utilizarlos en sus guías.
• Escribir guías que aprovechen los roles del sistema de Red Hat Enterprise Linux para realizar
operaciones estándares.
RH294-RHEL8.0-es-1-20200501 477
capítulo 11 | Revisión completa: Automation with Ansible
• Administrar el inicio del servicio, programar procesos con at, cron y systemd, reiniciar y controlar
el destino de inicio predeterminado en los hosts administrados.
478 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Trabajo de laboratorio
Implementación de Ansible
En esta revisión, instalará Ansible en workstation, lo usará como nodo de control y lo
configurará para las conexiones con los hosts administrados servera y serverb. Usar
comandos ad hoc para realizar acciones en hosts administrados.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Instalar Ansible.
Instrucciones
Instale y configure Ansible en workstation. Demuestre que puede construir los comandos
ad hoc especificados en la lista de criterios para modificar los hosts administrados y verifique
que las modificaciones funcionen según lo esperado:
• Instale Ansible en workstation de modo que se pueda usar como nodo de control.
• Ejecute un comando ad hoc para verificar que el contenido del archivo /etc/motd en
servera y serverb sea idéntico.
Evaluación
En workstation, ejecute el comando lab review-deploy grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el
comando hasta obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el comando lab review-deploy finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 479
capítulo 11 | Revisión completa: Automation with Ansible
480 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Solución
Implementación de Ansible
En esta revisión, instalará Ansible en workstation, lo usará como nodo de control y lo
configurará para las conexiones con los hosts administrados servera y serverb. Usar
comandos ad hoc para realizar acciones en hosts administrados.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Instalar Ansible.
Instrucciones
Instale y configure Ansible en workstation. Demuestre que puede construir los comandos
ad hoc especificados en la lista de criterios para modificar los hosts administrados y verifique
que las modificaciones funcionen según lo esperado:
• Instale Ansible en workstation de modo que se pueda usar como nodo de control.
• Ejecute un comando ad hoc para verificar que el contenido del archivo /etc/motd en
servera y serverb sea idéntico.
2. Instale Ansible en workstation de modo que se pueda usar como nodo de control.
RH294-RHEL8.0-es-1-20200501 481
capítulo 11 | Revisión completa: Automation with Ansible
[dev]
servera.lab.example.com
serverb.lab.example.com
[defaults]
inventory=./inventory
5. Ejecute un comando ad hoc con aumento de privilegios para modificar el contenido del
archivo /etc/motd en servera y serverb para que contengan la cadena Managed by
Ansible\n. Use devops como usuario remoto.
482 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": true,
"checksum": "4458b979ede3c332f8f2128385df4ba305e58c27",
"dest": "/etc/motd",
"gid": 0,
"group": "root",
"md5sum": "65a4290ee5559756ad04e558b0e0c4e3",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_t:s0",
"size": 19,
"src": "/home/devops/.ansible/tmp/...output omitted...",
"state": "file",
"uid": 0
}
6. Ejecute un comando ad hoc para verificar que el contenido del archivo /etc/motd en
servera y serverb sean idénticos.
Evaluación
En workstation, ejecute el comando lab review-deploy grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el
comando hasta obtener un resultado satisfactorio.
Finalizar
En workstation, ejecute el comando lab review-deploy finish para limpiar este ejercicio.
RH294-RHEL8.0-es-1-20200501 483
capítulo 11 | Revisión completa: Automation with Ansible
Trabajo de laboratorio
Creación de guías
En esta revisión, creará tres guías en el directorio de proyecto de Ansible, /home/student/
review-playbooks. Una guía garantizará que lftp se instale en sistemas que deberían
ser clientes FTP, una guía garantizará que vsftpd se instale y se configure en sistemas que
deberían ser servidores FTP, y otra guía (site.yml) ejecutará las otras dos guías.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Instrucciones
Cree un inventario estático en review-playbooks/inventory con
serverc.lab.example.com en el grupo ftpclients, y serverb.lab.example.com
y serverd.lab.example.com en el grupo ftpservers. Cree un archivo review-
playbooks/ansible.cfg que configure su proyecto de Ansible para usar este inventario.
Tal vez le sea útil consultar el archivo /etc/ansible/ansible.cfg del sistema para
obtener ayuda con la sintaxis.
Configure su proyecto de Ansible para conectarse con hosts en el inventario con el usuario
remoto, devops, y el método sudo para el método de escalamiento de privilegios. Tiene
claves SSH para iniciar sesión como devops ya configuradas. El usuario devops no necesita
una contraseña para el escalamiento de privilegios con sudo.
• Tiene un archivo de configuración para vsftpd generado desde una plantilla Jinja2. Cree
un directorio para las plantillas, review-playbooks/templates, y copie el archivo
vsftpd.conf.j2 provisto. Cree el directorio review-playbooks/vars. Copie el
archivo defaults-template.yml, que contiene la configuración predeterminada de
las variables usadas para completar esa plantilla cuando se implementa, en el directorio
review-playbooks/vars.
Variable Valor
vsftpd_package vsftpd
vsftpd_service vsftpd
484 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Variable Valor
vsftpd_config_file /etc/vsftpd/vsftpd.conf
4. Garanticen que el paquete firewalld esté instalado y que el servicio esté iniciado
y habilitado. Garanticen que firewalld se haya configurado para permitir las
conexiones de forma inmediata y permanente con el servicio ftp. El intervalo de
puertos temporales para las conexiones pasivas de datos de FTP se ha establecido en
21000-21020 TCP. También deberá permitir este intervalo a través del cortafuegos.
Siga las prácticas recomendadas sobre guías al asignar nombres a todas sus reproducciones
y tareas. Escriba guías con los módulos adecuados y asegúrese de que se puedan volver a
ejecutar de forma segura. Las guías no deberían realizar cambios innecesarios a los sistemas.
Use el comando ansible-doc para ayudarlo a buscar módulos e información sobre cómo
usarlos.
Importante
Si tiene problemas con su guía site.yml, asegúrese de que ansible-
vsftpd.yml y ftpclients.yml tengan una sangría uniforme.
RH294-RHEL8.0-es-1-20200501 485
capítulo 11 | Revisión completa: Automation with Ansible
Evaluación
Como usuario student en workstation, ejecute el comando lab review-playbooks
grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores
informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio.
Finalizar
Ejecute el comando lab review-playbooks finish para limpiar las tareas del trabajo de
laboratorio en serverb, serverc y serverd.
486 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Solución
Creación de guías
En esta revisión, creará tres guías en el directorio de proyecto de Ansible, /home/student/
review-playbooks. Una guía garantizará que lftp se instale en sistemas que deberían
ser clientes FTP, una guía garantizará que vsftpd se instale y se configure en sistemas que
deberían ser servidores FTP, y otra guía (site.yml) ejecutará las otras dos guías.
Resultados
Usted deberá ser capaz de realizar lo siguiente:
Instrucciones
Cree un inventario estático en review-playbooks/inventory con
serverc.lab.example.com en el grupo ftpclients, y serverb.lab.example.com
y serverd.lab.example.com en el grupo ftpservers. Cree un archivo review-
playbooks/ansible.cfg que configure su proyecto de Ansible para usar este inventario.
Tal vez le sea útil consultar el archivo /etc/ansible/ansible.cfg del sistema para
obtener ayuda con la sintaxis.
Configure su proyecto de Ansible para conectarse con hosts en el inventario con el usuario
remoto, devops, y el método sudo para el método de escalamiento de privilegios. Tiene
claves SSH para iniciar sesión como devops ya configuradas. El usuario devops no necesita
una contraseña para el escalamiento de privilegios con sudo.
• Tiene un archivo de configuración para vsftpd generado desde una plantilla Jinja2. Cree
un directorio para las plantillas, review-playbooks/templates, y copie el archivo
vsftpd.conf.j2 provisto. Cree el directorio review-playbooks/vars. Copie el
archivo defaults-template.yml, que contiene la configuración predeterminada de
las variables usadas para completar esa plantilla cuando se implementa, en el directorio
review-playbooks/vars.
Variable Valor
vsftpd_package vsftpd
vsftpd_service vsftpd
RH294-RHEL8.0-es-1-20200501 487
capítulo 11 | Revisión completa: Automation with Ansible
Variable Valor
vsftpd_config_file /etc/vsftpd/vsftpd.conf
4. Garanticen que el paquete firewalld esté instalado y que el servicio esté iniciado
y habilitado. Garanticen que firewalld se haya configurado para permitir las
conexiones de forma inmediata y permanente con el servicio ftp. El intervalo de
puertos temporales para las conexiones pasivas de datos de FTP se ha establecido en
21000-21020 TCP. También deberá permitir este intervalo a través del cortafuegos.
Siga las prácticas recomendadas sobre guías al asignar nombres a todas sus reproducciones
y tareas. Escriba guías con los módulos adecuados y asegúrese de que se puedan volver a
ejecutar de forma segura. Las guías no deberían realizar cambios innecesarios a los sistemas.
Use el comando ansible-doc para ayudarlo a buscar módulos e información sobre cómo
usarlos.
Importante
Si tiene problemas con su guía site.yml, asegúrese de que ansible-
vsftpd.yml y ftpclients.yml tengan una sangría uniforme.
488 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
2.2. Complete el archivo inventory con las siguientes entradas; luego, guárdelo y salga.
[ftpservers]
serverb.lab.example.com
serverd.lab.example.com
[ftpclients]
serverc.lab.example.com
[defaults]
remote_user = devops
inventory = ./inventory
[privilege_escalation]
become_user = root
become_method = sudo
become = true
---
- name: Ensure FTP Client Configuration
hosts: ftpclients
tasks:
- name: latest version of lftp is installed
RH294-RHEL8.0-es-1-20200501 489
capítulo 11 | Revisión completa: Automation with Ansible
yum:
name: lftp
state: latest
Variable Valor
vsftpd_package vsftpd
vsftpd_service vsftpd
vsftpd_config_file /etc/vsftpd/vsftpd.conf
vsftpd_package: vsftpd
vsftpd_service: vsftpd
vsftpd_config_file: /etc/vsftpd/vsftpd.conf
8. Con la plantilla Jinja2 y los archivos de definición de variables creados anteriormente, cree
una segunda guía, /home/student/review-playbooks/ansible-vsftpd.yml, para
configurar el servicio vsftpd en los hosts dentro del grupo de inventario ftpservers.
490 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
---
- name: FTP server is installed
hosts:
- ftpservers
vars_files:
- vars/defaults-template.yml
- vars/vars.yml
tasks:
- name: Packages are installed
yum:
name: "{{ vsftpd_package }}"
state: present
RH294-RHEL8.0-es-1-20200501 491
capítulo 11 | Revisión completa: Automation with Ansible
immediate: yes
handlers:
- name: restart vsftpd
service:
name: "{{ vsftpd_service }}"
state: restarted
---
# FTP Servers playbook
- import_playbook: ansible-vsftpd.yml
Evaluación
Como usuario student en workstation, ejecute el comando lab review-playbooks
grade para confirmar que ha realizado correctamente este ejercicio. Corrija los errores
informados y vuelva a ejecutar el script hasta obtener un resultado satisfactorio.
Finalizar
Ejecute el comando lab review-playbooks finish para limpiar las tareas del trabajo de
laboratorio en serverb, serverc y serverd.
492 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Trabajo de laboratorio
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Crear un rol para configurar el servicio vsftpd mediante tareas de una guía existente.
Instrucciones
Configure su proyecto de Ansible para usar el script de inventario dinámico
crinventory.py y el archivo de inventario estático inventory.
• Use el comando ansible-galaxy para crear la estructura del directorio para el rol
ansible-vsftpd en el directorio review-roles/roles de su proyecto de Ansible.
• El archivo vars.yml contiene variables regulares para el rol. Mueva este archivo a una
ubicación adecuada en la estructura de directorios del rol.
• Edite el archivo meta/main.yml del rol para establecer los campos autor, descripción y
licencia (use BSD para la licencia). Edite el archivo README.md según sea necesario para
alcanzar la integridad.
• La guía debería contener una reproducción que apunte a los hosts en el grupo de
inventario ftpservers.
RH294-RHEL8.0-es-1-20200501 493
capítulo 11 | Revisión completa: Automation with Ansible
Variable Valor
vsftpd_anon_root /mnt/share
vsftpd_local_root /mnt/share
1. Use el módulo command para crear una etiqueta de disco GPT en /dev/vdb, que
comience a 1 MiB del inicio del dispositivo y finalice al final del dispositivo. Use el
comando ansible-doc para obtener información sobre cómo usar el argumento
creates a fin de omitir esta tarea si ya se ha creado /dev/vdb1. Esto evita la
repartición destructiva del dispositivo. Use el siguiente comando para crear la
partición: parted --script /dev/vdb mklabel gpt mkpart primary 1MiB
100%
2. Asegúrese de que el directorio /mnt/share exista para usar como punto de montaje.
4. Agregue una tarea para asegurarse de que /etc/fstab monte el dispositivo /dev/
vdb1 en /mnt/share, en el arranque, y que esté actualmente montado. Use el
comando ansible-doc para encontrar un módulo que pueda montar el dispositivo.
Si esta tarea tiene un resultado cambiado, notifique al manejador del rol ansible-
vsftpd que reinicia vsftpd.
5. Agregue una tarea que garantice que el directorio /mnt/share sea propiedad
del usuario root y del grupo root, que tenga un tipo de SELinux definido en la
variable {{ vsftpd_setype }} desde el rol y que tenga permisos octales de 0755.
Esta tarea debe ejecutarse después de que se monte el sistema de archivos para
establecer los permisos en el sistema de archivos montado y no en el directorio del
punto de montaje del marcador de posición.
494 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Importante
Tal vez le resulte útil depurar su rol probándolo en una guía que no contenga
las tareas o variables adicionales de la guía detalladas anteriormente, sino que
en su lugar contenga una reproducción que apunte a los hosts en el grupo
ftpservers, y aplique el rol.
Una vez que haya confirmado que una guía simplificada que usa solo el rol
funciona igual que la guía ansible-vsftpd.yml original, podrá crear la
guía vsftpd-configure.yml completa mediante la adición de variables y
tareas adicionales especificadas anteriormente.
Siga las prácticas recomendadas sobre guías al asignar nombres a todas sus reproducciones
y tareas. Escriba guías con los módulos adecuados y asegúrese de que se puedan volver a
ejecutar de forma segura. Las guías no deberían realizar cambios innecesarios a los sistemas.
Importante
Si tiene problemas con su guía site.yml, asegúrese de que vsftpd-
configure.yml y ftpclients.yml tengan una sangría uniforme.
Evaluación
En workstation, ejecute el comando lab review-roles grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
Finalizar
Ejecute el comando lab review-roles finish para limpiar las tareas del trabajo de
laboratorio en servera y serverb.
RH294-RHEL8.0-es-1-20200501 495
capítulo 11 | Revisión completa: Automation with Ansible
Solución
Resultados
Usted deberá ser capaz de realizar lo siguiente:
• Crear un rol para configurar el servicio vsftpd mediante tareas de una guía existente.
Instrucciones
Configure su proyecto de Ansible para usar el script de inventario dinámico
crinventory.py y el archivo de inventario estático inventory.
• Use el comando ansible-galaxy para crear la estructura del directorio para el rol
ansible-vsftpd en el directorio review-roles/roles de su proyecto de Ansible.
• El archivo vars.yml contiene variables regulares para el rol. Mueva este archivo a una
ubicación adecuada en la estructura de directorios del rol.
• Edite el archivo meta/main.yml del rol para establecer los campos autor, descripción y
licencia (use BSD para la licencia). Edite el archivo README.md según sea necesario para
alcanzar la integridad.
• La guía debería contener una reproducción que apunte a los hosts en el grupo de
inventario ftpservers.
496 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Variable Valor
vsftpd_anon_root /mnt/share
vsftpd_local_root /mnt/share
1. Use el módulo command para crear una etiqueta de disco GPT en /dev/vdb, que
comience a 1 MiB del inicio del dispositivo y finalice al final del dispositivo. Use el
comando ansible-doc para obtener información sobre cómo usar el argumento
creates a fin de omitir esta tarea si ya se ha creado /dev/vdb1. Esto evita la
repartición destructiva del dispositivo. Use el siguiente comando para crear la
partición: parted --script /dev/vdb mklabel gpt mkpart primary 1MiB
100%
2. Asegúrese de que el directorio /mnt/share exista para usar como punto de montaje.
4. Agregue una tarea para asegurarse de que /etc/fstab monte el dispositivo /dev/
vdb1 en /mnt/share, en el arranque, y que esté actualmente montado. Use el
comando ansible-doc para encontrar un módulo que pueda montar el dispositivo.
Si esta tarea tiene un resultado cambiado, notifique al manejador del rol ansible-
vsftpd que reinicia vsftpd.
5. Agregue una tarea que garantice que el directorio /mnt/share sea propiedad
del usuario root y del grupo root, que tenga un tipo de SELinux definido en la
variable {{ vsftpd_setype }} desde el rol y que tenga permisos octales de 0755.
Esta tarea debe ejecutarse después de que se monte el sistema de archivos para
establecer los permisos en el sistema de archivos montado y no en el directorio del
punto de montaje del marcador de posición.
RH294-RHEL8.0-es-1-20200501 497
capítulo 11 | Revisión completa: Automation with Ansible
Importante
Tal vez le resulte útil depurar su rol probándolo en una guía que no contenga
las tareas o variables adicionales de la guía detalladas anteriormente, sino que
en su lugar contenga una reproducción que apunte a los hosts en el grupo
ftpservers, y aplique el rol.
Una vez que haya confirmado que una guía simplificada que usa solo el rol
funciona igual que la guía ansible-vsftpd.yml original, podrá crear la
guía vsftpd-configure.yml completa mediante la adición de variables y
tareas adicionales especificadas anteriormente.
Siga las prácticas recomendadas sobre guías al asignar nombres a todas sus reproducciones
y tareas. Escriba guías con los módulos adecuados y asegúrese de que se puedan volver a
ejecutar de forma segura. Las guías no deberían realizar cambios innecesarios a los sistemas.
Importante
Si tiene problemas con su guía site.yml, asegúrese de que vsftpd-
configure.yml y ftpclients.yml tengan una sangría uniforme.
498 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
[defaults]
remote_user=devops
inventory=./inventory
RH294-RHEL8.0-es-1-20200501 499
capítulo 11 | Revisión completa: Automation with Ansible
3.2. Con ansible-galaxy, cree la estructura del directorio para el nuevo rol ansible-
vsftpd en el subdirectorio roles.
3.3. Con tree, verifique la estructura del directorio creada para el nuevo rol.
9 directories, 8 files
500 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
---
# tasks file for ansible-vsftpd
- name: Packages are installed
yum:
name: '{{ vsftpd_package }}'
state: present
RH294-RHEL8.0-es-1-20200501 501
capítulo 11 | Revisión completa: Automation with Ansible
---
# handlers file for ansible-vsftpd
- name: restart vsftpd
service:
name: "{{ vsftpd_service }}"
state: restarted
license: BSD
ansible-vsftpd
=========
Example ansible-vsftpd role from Red Hat's "Linux Automation" (RH294)
course.
Role Variables
--------------
502 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Dependencies
------------
None.
Example Playbook
----------------
- hosts: servers
roles:
- ansible-vsftpd
License
-------
BSD
Author Information
------------------
---
- name: Install and configure vsftpd
hosts: ftpservers
vars:
vsftpd_anon_root: /mnt/share/
vsftpd_local_root: /mnt/share/
roles:
- ansible-vsftpd
tasks:
RH294-RHEL8.0-es-1-20200501 503
capítulo 11 | Revisión completa: Automation with Ansible
fstype: xfs
force: yes
---
# FTP Servers playbook
- import_playbook: vsftpd-configure.yml
9. Ejecute la guía con ansible-playbook para verificar que la guía site.yml funcione
según lo planificado.
Evaluación
En workstation, ejecute el comando lab review-roles grade para confirmar que ha
realizado correctamente este ejercicio. Corrija los errores informados y vuelva a ejecutar el script
hasta obtener un resultado satisfactorio.
504 RH294-RHEL8.0-es-1-20200501
capítulo 11 | Revisión completa: Automation with Ansible
Finalizar
Ejecute el comando lab review-roles finish para limpiar las tareas del trabajo de
laboratorio en servera y serverb.
RH294-RHEL8.0-es-1-20200501 505
506 RH294-RHEL8.0-es-1-20200501
apéndice A
Temas suplementarios
Meta Investigar temas complementarios no incluidos
en el curso oficial.
RH294-RHEL8.0-es-1-20200501 507
apéndice A | Temas suplementarios
Objetivos
Después de completar esta sección, debe poder usar ansible-config para descubrir e
investigar las opciones de configuración y para determinar qué opciones se han modificado desde
la configuración predeterminada.
Cada opción mostrada por ansible-config list tendrá un número de pares de claves/
valores asociado a ella. Estos pares de claves/valores proporcionan información sobre cómo
funciona esa opción. Por ejemplo, la opción ACTION_WARNINGS muestra los siguientes pares de
claves/valores:
508 RH294-RHEL8.0-es-1-20200501
apéndice A | Temas suplementarios
Referencias
Página del manual ansible-config(1)
RH294-RHEL8.0-es-1-20200501 509
510 RH294-RHEL8.0-es-1-20200501
apéndice B
RH294-RHEL8.0-es-1-20200501 511
apéndice B | Licencias de Ansible Lightbulb
El aviso de copyright anterior y este aviso de permiso deberían incluirse en todas las copias o
partes sustanciales del software.
Por el presente, se otorga permiso gratuito a cualquier persona que obtenga una copia de este
software y los archivos de documentación asociados (el "Software") para trabajar en el software
sin restricciones, que incluyen, entre otras, el derecho de usar, copiar, modificar, fusionar, publicar,
distribuir, sublicenciar o vender copias del software, y permitir a personas a quienes se entrega el
software para esto, sujeto a las siguiente condiciones:
El aviso de copyright anterior y este aviso de permiso deberían incluirse en todas las copias o
partes sustanciales del software.
512 RH294-RHEL8.0-es-1-20200501