Introducción
En este laboratorio, aprenderá a implementar un playbook completo de Ansible para desplegar un servidor web Apache en un sistema Red Hat Enterprise Linux (RHEL). Comenzará configurando los componentes fundamentales de un proyecto Ansible, lo que incluye la creación de un archivo de inventario estático para definir sus nodos administrados y la configuración del entorno local de Ansible utilizando un archivo ansible.cfg.
Tras la configuración inicial, escribirá un playbook de múltiples tareas para automatizar el proceso de despliegue principal. Esto implica instalar e iniciar el servicio Apache, desplegar una página web personalizada y configurar el firewall del sistema para permitir el tráfico HTTP. Para completar el laboratorio, agregará una segunda "play" a su playbook que probará el servidor web desde la línea de comandos, verificando que todo el despliegue se realizó con éxito.
Crear un Archivo de Inventario Estático para Servidores Web
En este paso, aprenderá los fundamentos de un inventario de Ansible. Un inventario es un archivo de texto que lista los servidores (o "nodos administrados") que Ansible gestionará. Creará un archivo de inventario estático simple para un grupo de servidores web y aprenderá a verificar su contenido.
Primero, necesita asegurarse de que Ansible esté instalado en su sistema. Dado que no está instalado por defecto, utilizará el gestor de paquetes dnf para instalarlo.
Abra su terminal e instale el paquete
ansible-core, que proporciona las herramientas fundamentales de línea de comandos de Ansible.sudo dnf install -y ansible-coreDebería ver una salida que indica que el paquete se está instalando y verificando.
... Installed: ansible-core-2.16.x-x.el9.x86_64 ... Complete!Para una mejor organización, cree un directorio dedicado para este proyecto dentro de su directorio de inicio. Llamémoslo
ansible-lab.mkdir -p ~/project/ansible-labNavegue a su directorio de proyecto recién creado. Todo el trabajo posterior en este laboratorio se realizará desde esta ubicación.
cd ~/project/ansible-labAhora, creará su primer archivo de inventario. Un archivo de inventario se escribe típicamente en un formato similar a INI. Utilizará el editor de texto
nanopara crear un archivo llamadoinventory.nano inventoryDentro del editor
nano, agregue el siguiente contenido. Esta configuración define un grupo llamado[webservers]y agrega su máquina local,localhost, a este grupo.[webservers]es un nombre de grupo. Los grupos se utilizan para apuntar a varios hosts con un solo comando.localhostes el nombre de host de la máquina que desea administrar. En este caso, es la propia VM de LabEx.ansible_connection=locales una variable especial que le indica a Ansible que ejecute comandos directamente en el nodo de control (su VM) en lugar de intentar conectarse a través de SSH.
[webservers] localhost ansible_connection=localPara guardar el archivo en
nano, presioneCtrl+O, luegoEnterpara confirmar el nombre del archivo yCtrl+Xpara salir del editor.Con su archivo de inventario creado, puede usar el comando
ansible-inventorypara analizar el archivo y mostrar una lista de los hosts que contiene. La bandera-iespecifica la ruta a su archivo de inventario.ansible-inventory --list -i inventoryEl comando generará una representación con formato JSON de su inventario, lo que confirma que Ansible puede leer y comprender su archivo correctamente.
{ "_meta": { "hostvars": { "localhost": { "ansible_connection": "local" } } }, "all": { "children": ["ungrouped", "webservers"] }, "webservers": { "hosts": ["localhost"] } }
Ha creado con éxito un archivo de inventario estático básico y ha verificado que Ansible puede interpretarlo correctamente. Este archivo de inventario será la base de los playbooks que escribirá en los siguientes pasos.
Configurar el Entorno de Ansible con ansible.cfg
En este paso, creará un archivo de configuración de Ansible, ansible.cfg. Este archivo le permite establecer comportamientos predeterminados para Ansible, ahorrándole la necesidad de escribir opciones comunes en la línea de comandos repetidamente. Al colocar un archivo ansible.cfg en su directorio de proyecto, puede definir configuraciones como la ruta predeterminada del archivo de inventario, que Ansible utilizará automáticamente cuando se ejecute desde ese directorio.
Debería seguir estando en el directorio ~/project/ansible-lab del paso anterior.
Utilice el editor de texto
nanopara crear un nuevo archivo llamadoansible.cfgen su directorio actual (~/project/ansible-lab).nano ansible.cfgDentro del editor
nano, agregue el siguiente contenido. Esta configuración le indica a Ansible dónde encontrar su archivo de inventario predeterminado.- La sección
[defaults]es una parte estándar del archivoansible.cfgdonde define la mayoría de las configuraciones predeterminadas. - La línea
inventory = ./inventoryestablece el inventario predeterminado en el archivoinventoryubicado en el directorio actual (.).
[defaults] inventory = ./inventoryGuarde el archivo presionando
Ctrl+O, luegoEnter, y salga conCtrl+X.- La sección
Ahora que ha configurado la ruta del inventario predeterminado, ya no necesita usar la bandera
-icon sus comandos de Ansible (siempre que se encuentre en el directorio~/project/ansible-lab).Para probar esto, ejecute nuevamente el comando
ansible-inventory --list, pero esta vez, omita la parte-i inventory.ansible-inventory --listDebería ver la misma salida JSON exacta que en el paso anterior, lo que confirma que Ansible está encontrando y utilizando automáticamente su archivo
inventorygracias a la nueva configuraciónansible.cfg.{ "_meta": { "hostvars": { "localhost": { "ansible_connection": "local" } } }, "all": { "children": ["ungrouped", "webservers"] }, "webservers": { "hosts": ["localhost"] } }
Al crear un ansible.cfg específico del proyecto, ha hecho que su flujo de trabajo sea más eficiente. Esta es una práctica común en los proyectos de Ansible para garantizar un comportamiento consistente y reducir la complejidad de la línea de comandos.
Escribir un Playbook para Instalar y Arrancar el Servicio Apache
En este paso, escribirá su primer Ansible Playbook. Un playbook es un archivo escrito en formato YAML que describe un conjunto de tareas a ejecutar en sus hosts administrados. Creará un playbook que instala el servidor web Apache (httpd) y levanta su servicio en la máquina localhost definida en su inventario.
Debería seguir estando en el directorio ~/project/ansible-lab.
Primero, utilice el editor de texto
nanopara crear un nuevo archivo llamadoapache.yml. Este archivo contendrá su playbook.nano apache.ymlDentro del editor
nano, definirá un "play". Un play es la unidad central de un playbook y mapea un grupo de hosts a un conjunto de tareas. Agregue el siguiente contenido aapache.yml.---: Este es un marcador estándar de YAML que indica el inicio de un documento.- name: ...: Este es el comienzo de su play. Darle un nombre descriptivo es una buena práctica.hosts: webservers: Esto le dice a Ansible que ejecute este play en todos los hosts del grupowebserversde su archivo de inventario.become: true: Esto instruye a Ansible a usar la escalada de privilegios (comosudo) para ejecutar las tareas. Esto es necesario para acciones como instalar software o administrar servicios.tasks:: Esta palabra clave inicia la lista de tareas a realizar.
--- - name: Install and start Apache web server hosts: webservers become: true tasks:Ahora, agregue las tareas a su playbook. Cada tarea es una acción única que llama a un módulo de Ansible. La indentación es crítica en YAML, así que asegúrese de que las tareas estén correctamente indentadas debajo de la sección
tasks:.- Tarea 1: Instalar httpd. Esta tarea utiliza el módulo
ansible.builtin.dnfpara asegurar que el paquetehttpdesté instalado. El parámetrostate: presentsignifica que Ansible instalará el paquete si falta, y no hará nada si ya está instalado. - Tarea 2: Levantar el servicio httpd. Esta tarea utiliza el módulo
ansible.builtin.service.state: startedasegura que el servicio esté en ejecución, yenabled: trueasegura que se iniciará automáticamente al arrancar el sistema.
Agregue las siguientes tareas a su archivo
apache.yml, directamente debajo de la líneatasks::- name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: true- Tarea 1: Instalar httpd. Esta tarea utiliza el módulo
Su playbook
apache.ymlcompleto debería verse ahora así. Verifique cuidadosamente la indentación.--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: trueGuarde el archivo y salga de
nano(Ctrl+O,Enter,Ctrl+X).Antes de ejecutar su playbook, es una buena práctica verificar su sintaxis usando el comando
ansible-playbookcon la bandera--syntax-check.ansible-playbook --syntax-check apache.ymlSi la sintaxis es correcta, el comando imprimirá el nombre del archivo del playbook sin errores.
playbook: apache.ymlAhora, ejecute el playbook.
ansible-playbook apache.ymlAnsible ejecutará las tareas. Dado que esta es la primera ejecución, verá el estado
changedpara ambas tareas, lo que indica que el estado del sistema fue modificado.PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** changed: [localhost] TASK [Start and enable httpd service] ****************************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Finalmente, verifique que el servidor web Apache esté en ejecución usando
curlpara solicitar la página web predeterminada desdelocalhost.curl http://localhostDebería ver la Página de Prueba Predeterminada de Apache, lo que confirma que su playbook funcionó correctamente.
<html> <head> <title>Test Page</title> </head> <body> <h1>Test Page</h1> <p>This is the default test page for the Apache HTTP server.</p> </body> </html>
Añadir Tareas para Desplegar una Página Web
En este paso, ampliará su playbook para realizar una configuración de servidor web más realista. Agregará una tarea para desplegar una página index.html personalizada. Esto demuestra cómo administrar archivos utilizando los módulos de administración de archivos de Ansible.
Debería seguir estando en el directorio ~/project/ansible-lab.
Primero, cree un archivo HTML simple que su playbook desplegará. Use
nanopara crear un archivo llamadoindex.htmlen su directorio actual.nano index.htmlAgregue el siguiente contenido HTML al archivo. Este será el contenido de su página web personalizada.
<h1>Welcome to the Ansible-managed Web Server!</h1> <p>This page was deployed using an Ansible Playbook.</p>Guarde y salga de
nano(Ctrl+O,Enter,Ctrl+X).Ahora, actualizará su playbook
apache.ymlpara agregar la nueva tarea. Para evitar errores de formato YAML, se recomienda recrear el archivo con el contenido completo.Importante: Para asegurar el formato YAML correcto y evitar errores de indentación, elimine el archivo
apache.ymlexistente y cree uno nuevo con el contenido completo que se muestra a continuación.rm apache.yml nano apache.ymlAgregará una nueva tarea al playbook. Esta tarea copiará el archivo
index.htmla la raíz del documento del servidor web (/var/www/html/).- Tarea: Desplegar index.html. Esta tarea utiliza el módulo
ansible.builtin.copy.srcespecifica el archivo de origen en el nodo de control (index.html), ydestespecifica la ruta de destino en el host administrado.
- Tarea: Desplegar index.html. Esta tarea utiliza el módulo
Copie y pegue el contenido completo del playbook
apache.ymla continuación. Esto asegura el formato y la indentación YAML correctos.--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Deploy custom index.html ansible.builtin.copy: src: index.html dest: /var/www/html/index.html - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: trueGuarde y salga de
nano.Guarde el archivo y salga de
nano(Ctrl+O,Enter,Ctrl+X), luego ejecute el playbook actualizado.ansible-playbook apache.ymlEsta vez, debería ver la nueva tarea ejecutándose. Las tareas "Install httpd" y "Start httpd" deberían reportar
okporque su estado deseado ya se ha cumplido. La tarea "Deploy custom index.html" reportaráchanged.PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** ok: [localhost] TASK [Deploy custom index.html] ************************************************ changed: [localhost] TASK [Start and enable httpd service] ****************************************** ok: [localhost] PLAY RECAP ********************************************************************* localhost : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Finalmente, use
curlnuevamente para verificar que su página web personalizada ahora se está sirviendo.curl http://localhostLa salida ahora debería ser el contenido de su archivo
index.html.<h1>Welcome to the Ansible-managed Web Server!</h1> <p>This page was deployed using an Ansible Playbook.</p>
Implementar un Segundo Play para Probar el Despliegue del Servidor Web
En este paso final, agregará un segundo play a su playbook. Un único archivo de playbook puede contener múltiples plays, que se ejecutan secuencialmente. Esto es útil para organizar tareas que se dirigen a diferentes hosts o tienen diferentes propósitos. Agregará un nuevo play que se ejecutará solo en el nodo de control (localhost) para probar el servidor web que se configuró en el primer play.
Debería seguir estando en el directorio ~/project/ansible-lab.
Ahora agregará un segundo play a su playbook. Para asegurar el formato YAML correcto al agregar el segundo play, se recomienda recrear el archivo con el contenido completo.
Importante: Para evitar errores de indentación YAML al agregar el segundo play, elimine el archivo
apache.ymlexistente y cree uno nuevo con el contenido completo de dos plays que se muestra a continuación.rm apache.yml nano apache.ymlAgregará un segundo play al playbook. Un segundo play le permite organizar tareas que se dirigen a diferentes hosts o tienen diferentes propósitos.
name: Test web server: Un nombre descriptivo para el nuevo play.hosts: localhost: Este play se ejecutará enlocalhost, el propio nodo de control.become: false: Esta prueba no requiere privilegios de root, por lo que deshabilitamos explícitamente la escalada de privilegios.- Tarea: Verificar contenido web. Esta tarea utiliza el módulo
ansible.builtin.uripara realizar una solicitud HTTP al servidor web. Comprueba que el servidor devuelve un código de estado 200 (OK) y que el contenido devuelto contiene la cadena "Ansible-managed". Esto automatiza la verificación concurlygrepque ha estado haciendo manualmente.
Copie y pegue el contenido completo del playbook
apache.ymla continuación, que ahora incluye ambos plays:--- - name: Install and start Apache web server hosts: webservers become: true tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present - name: Deploy custom index.html ansible.builtin.copy: src: index.html dest: /var/www/html/index.html - name: Start and enable httpd service ansible.builtin.service: name: httpd state: started enabled: true - name: Test web server from localhost hosts: localhost become: false tasks: - name: Verify web server is serving correct content ansible.builtin.uri: url: http://localhost return_content: yes status_code: 200 register: result failed_when: "'Ansible-managed' not in result.content"Guarde el archivo y salga de
nano(Ctrl+O,Enter,Ctrl+X).Ejecute el playbook completo. Ansible ejecutará el primer play, encontrará que todas las tareas ya están en su estado deseado (
ok), y luego procederá al segundo play para ejecutar la prueba.ansible-playbook apache.ymlLa salida mostrará ambos plays ejecutándose. Todas las tareas deberían completarse con éxito con un estado
ok.PLAY [Install and start Apache web server] ************************************* TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** ok: [localhost] TASK [Deploy custom index.html] ************************************************ ok: [localhost] TASK [Start and enable httpd service] ****************************************** ok: [localhost] PLAY [Test web server from localhost] ****************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Verify web server is serving correct content] **************************** ok: [localhost] PLAY RECAP ********************************************************************* localhost : ok=6 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Al agregar un segundo play, ha creado un flujo de trabajo de automatización más robusto que no solo configura un servicio, sino que también incluye una prueba integrada para verificar que el despliegue fue exitoso.
Resumen
En este laboratorio, aprendió a preparar un entorno RHEL para la automatización con Ansible instalando el paquete ansible-core y estructurando un directorio de proyecto. Creó un archivo de inventario estático fundamental para definir un grupo de nodos administrados, especificando localhost con una conexión local. También configuró el entorno de Ansible utilizando un archivo ansible.cfg para apuntar a su inventario personalizado, estableciendo un espacio de trabajo limpio y organizado para ejecutar playbooks.
Luego, redactó un playbook de Ansible completo para automatizar el despliegue de un servidor web Apache. Esto implicó escribir tareas para instalar el paquete httpd utilizando el módulo ansible.builtin.dnf y para asegurar que el servicio se iniciara y habilitara con el módulo ansible.builtin.service. El playbook se mejoró para desplegar una página web index.html personalizada utilizando el módulo ansible.builtin.copy. Finalmente, implementó un segundo play dentro del mismo playbook para validar el despliegue, utilizando el módulo ansible.builtin.uri para probar la conectividad con el servidor web recién desplegado, demostrando un flujo de trabajo completo de configuración y verificación.


