¿Cómo descargar archivos de una URL específica usando el módulo get_url de Ansible?

AnsibleBeginner
Practicar Ahora

Introducción

Ansible es una poderosa herramienta de automatización de código abierto que simplifica la gestión de la infraestructura de TI. En este tutorial, exploraremos el módulo get_url de Ansible, que permite descargar archivos desde una URL específica. Este módulo es esencial para tareas de automatización como la instalación de software, la gestión de la configuración y el despliegue de contenido.

A lo largo de este tutorial, aprenderá a configurar Ansible, a usar el módulo get_url con opciones básicas y avanzadas, y a implementar ejemplos prácticos para automatizar la descarga de archivos. Al final de esta guía, tendrá una sólida comprensión de cómo aprovechar este módulo para optimizar sus procesos de gestión de archivos.

Instalación y Configuración de Ansible

Antes de que podamos usar el módulo get_url, necesitamos asegurarnos de que Ansible esté correctamente instalado y configurado en nuestro sistema.

Instalación de Ansible

Comencemos instalando Ansible en el entorno de LabEx:

sudo apt update
sudo apt install -y ansible

Después de ejecutar estos comandos, verifique que Ansible esté instalado correctamente comprobando su versión:

ansible --version

Debería ver una salida similar a esta, que muestra la versión de Ansible y los detalles de configuración:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, ...) [GCC 11.x]

Creación de un Directorio de Trabajo

A continuación, creemos un directorio dedicado para nuestro proyecto Ansible:

mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url

Configuración de un Inventario Simple

Ansible necesita saber qué hosts administrar. Para este tutorial, crearemos un archivo de inventario simple que apunta a la máquina local:

echo "localhost ansible_connection=local" > inventory.ini

Este archivo de inventario especifica que queremos ejecutar Ansible contra el localhost usando una conexión local.

Creación del Archivo de Configuración de Ansible

Para personalizar el comportamiento de Ansible, creemos un archivo de configuración simple:

cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF

Este archivo de configuración le dice a Ansible que use nuestro archivo de inventario y deshabilita la verificación de la clave del host, lo que simplifica las conexiones en un entorno de prueba.

Prueba de la Configuración de Ansible

Verifiquemos que nuestra configuración de Ansible funcione correctamente ejecutando un comando ping simple:

ansible localhost -m ping

Debería ver una respuesta exitosa como:

localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Esta salida confirma que Ansible está correctamente instalado y puede comunicarse con el localhost. Ahora estamos listos para usar el módulo get_url en el siguiente paso.

Creación de un Playbook Básico con el Módulo get_url

Ahora que tenemos Ansible configurado, creemos un playbook simple que use el módulo get_url para descargar un archivo desde una URL.

Entendiendo los Playbooks de Ansible

Un playbook de Ansible es un archivo YAML que define un conjunto de tareas a ejecutar en los hosts administrados. Los playbooks se organizan como una serie de plays (ejecuciones), donde cada play consiste en:

  • Un conjunto de hosts a los que apuntar
  • Un conjunto de tareas a ejecutar

Creación de Nuestro Primer Playbook

Creemos un playbook básico que use el módulo get_url. Cree un archivo llamado download-file.yml en su directorio de proyecto:

cd ~/project/ansible-get-url

Abra el editor de archivos y cree el archivo con el siguiente contenido:

---
- name: Download a file from URL
  hosts: localhost
  become: no
  tasks:
    - name: Create downloads directory
      file:
        path: ~/project/ansible-get-url/downloads
        state: directory
        mode: "0755"

    - name: Download a sample text file
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
        dest: ~/project/ansible-get-url/downloads/ansible-readme.md
        mode: "0644"

Este playbook hace lo siguiente:

  1. Crea un directorio downloads para almacenar nuestros archivos descargados
  2. Usa el módulo get_url para descargar el archivo README.md de Ansible desde GitHub

Entendiendo los Parámetros del Módulo get_url

Desglosemos los parámetros clave en la tarea get_url:

  • url: Especifica la URL desde la cual descargar el archivo
  • dest: Define la ruta de destino donde se guardará el archivo
  • mode: Establece los permisos del archivo (0644 significa lectura y escritura para el propietario, lectura para el grupo y otros)

Ejecución del Playbook

Ahora que hemos creado nuestro playbook, ejecutémoslo usando el comando ansible-playbook:

ansible-playbook download-file.yml

Debería ver una salida similar a esta:

PLAY [Download a file from URL] ***********************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create downloads directory] *********************************************
changed: [localhost]

TASK [Download a sample text file] ********************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Verificación del Archivo Descargado

Verifiquemos que el archivo se descargó correctamente:

ls -l ~/project/ansible-get-url/downloads/

Debería ver el archivo descargado:

-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md

También puede ver el contenido del archivo descargado:

head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md

Esto mostrará las primeras 10 líneas del archivo README.md de Ansible, confirmando que se descargó con éxito.

¡Felicidades! Ha creado y ejecutado con éxito su primer playbook de Ansible usando el módulo get_url para descargar un archivo desde una URL.

Trabajando con Opciones Avanzadas de get_url

Ahora que hemos cubierto los conceptos básicos, exploremos algunas opciones avanzadas del módulo get_url que pueden ser útiles en escenarios del mundo real.

Creación de un Playbook Avanzado

Creemos un nuevo playbook llamado advanced-download.yml que demuestre varias opciones avanzadas:

cd ~/project/ansible-get-url

Abra el editor de archivos y cree el archivo con el siguiente contenido:

---
- name: Advanced get_url Module Options
  hosts: localhost
  become: no
  tasks:
    - name: Create advanced downloads directory
      file:
        path: ~/project/ansible-get-url/advanced-downloads
        state: directory
        mode: "0755"

    - name: Download with checksum validation
      get_url:
        url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
        dest: ~/project/ansible-get-url/advanced-downloads/jq
        mode: "0755"
        checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44

    - name: Download with timeout and retries
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
        dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
        timeout: 30
        retries: 3
        delay: 5
        force: yes

    - name: Download only if file doesn't exist
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
        dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
        force: no

Entendiendo los Parámetros Avanzados

Examinemos los parámetros avanzados utilizados en este playbook:

  1. Validación de Checksum (Suma de Verificación):

    • checksum: Especifica la suma de verificación (checksum) esperada del archivo descargado (formato: algoritmo:checksum)
    • Esto asegura la integridad del archivo descargado y evita la descarga si el archivo ya existe con la suma de verificación correcta
  2. Timeout (Tiempo de Espera) y Reintentos:

    • timeout: Tiempo máximo en segundos para que se complete la solicitud HTTP
    • retries: Número de veces para reintentar si la descarga falla
    • delay: Retraso entre reintentos en segundos
    • force: Si se debe descargar el archivo incluso si ya existe
  3. Descarga Condicional:

    • force: no: El archivo solo se descargará si no existe en el destino

Ejecución del Playbook Avanzado

Ejecutemos nuestro playbook avanzado:

ansible-playbook advanced-download.yml

Debería ver una salida similar a esta:

PLAY [Advanced get_url Module Options] ****************************************

TASK [Gathering Facts] ********************************************************
ok: [localhost]

TASK [Create advanced downloads directory] ************************************
changed: [localhost]

TASK [Download with checksum validation] **************************************
changed: [localhost]

TASK [Download with timeout and retries] **************************************
changed: [localhost]

TASK [Download only if file doesn't exist] ************************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Verificación de las Descargas Avanzadas

Comprobemos los archivos que descargamos con las opciones avanzadas:

ls -l ~/project/ansible-get-url/advanced-downloads/

Debería ver todos los archivos descargados:

-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex     426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex    1690 Mar 15 12:45 ansible-example.cfg

Probemos si el binario jq descargado funciona:

~/project/ansible-get-url/advanced-downloads/jq --version

Debería ver una salida que indique la versión de jq (por ejemplo, jq-1.6), confirmando que el ejecutable se descargó correctamente con la suma de verificación correcta.

Ahora ha utilizado con éxito varias opciones avanzadas del módulo get_url para descargar archivos con diferentes requisitos y restricciones.

Implementación de un Despliegue Práctico de Aplicación Web

Apliquemos lo que hemos aprendido en un escenario más práctico: desplegar una aplicación web simple usando el módulo get_url de Ansible.

Configuración del Proyecto de Aplicación Web

Primero, creemos una estructura de directorio para nuestra aplicación web:

mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url

Creación del Playbook de Despliegue de la Aplicación Web

Ahora, crearemos un playbook llamado deploy-webapp.yml que descargará los archivos necesarios para nuestra aplicación web:

---
- name: Deploy Web Application Files
  hosts: localhost
  become: no
  vars:
    webapp_dir: ~/project/ansible-get-url/webapp
    assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
  tasks:
    - name: Ensure webapp directories exist
      file:
        path: "{{ item }}"
        state: directory
        mode: "0755"
      loop:
        - "{{ webapp_dir }}"
        - "{{ webapp_dir }}/public"
        - "{{ webapp_dir }}/public/css"
        - "{{ webapp_dir }}/public/images"

    - name: Create index.html
      copy:
        dest: "{{ webapp_dir }}/public/index.html"
        content: |
          <!DOCTYPE html>
          <html>
          <head>
            <title>Ansible Demo App</title>
            <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
            <div class="container">
              <h1>Welcome to Ansible Demo</h1>
              <p>This site was deployed using Ansible's get_url module!</p>
              <img src="images/ansible-logo.png" alt="Ansible Logo">
            </div>
          </body>
          </html>

    - name: Download CSS file
      get_url:
        url: "{{ assets_base_url }}/css/ansible.css"
        dest: "{{ webapp_dir }}/public/css/style.css"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Download Ansible logo
      get_url:
        url: "{{ assets_base_url }}/images/ansible_logo.svg"
        dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Install Python HTTP server
      apt:
        name: python3-http.server
        state: present
      become: yes

    - name: Display information about running the web server
      debug:
        msg: |
          Web application has been deployed!
          To start the web server, run:
          cd {{ webapp_dir }}/public && python3 -m http.server 8080
          Then access it at: http://localhost:8080

Este playbook:

  1. Crea la estructura de directorio necesaria para nuestra aplicación web
  2. Crea un archivo index.html con contenido HTML básico
  3. Descarga un archivo CSS y una imagen del logotipo de Ansible usando el módulo get_url
  4. Instala un servidor HTTP de Python
  5. Muestra información sobre cómo ejecutar el servidor web

Ejecución del Playbook de Despliegue de la Aplicación Web

Ejecutemos el playbook:

ansible-playbook deploy-webapp.yml

Debería ver una salida que indica que la aplicación web se ha desplegado correctamente.

Inicio del Servidor Web

Ahora, iniciemos el servidor web para probar nuestra aplicación desplegada:

cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &

El servidor web ahora se está ejecutando en segundo plano en el puerto 8080. Si estuviera en un entorno normal con acceso al navegador, podría acceder a la aplicación web en http://localhost:8080.

Verificación de los Archivos Desplegados

Verifiquemos que todos los archivos requeridos se hayan desplegado correctamente:

ls -la ~/project/ansible-get-url/webapp/public/

Debería ver el archivo index.html y los directorios que creamos.

ls -la ~/project/ansible-get-url/webapp/public/css/

Esto debería mostrar el archivo CSS descargado.

ls -la ~/project/ansible-get-url/webapp/public/images/

Esto debería mostrar la imagen del logotipo de Ansible descargada.

Visualización del Contenido HTML

Comprobemos el contenido del archivo index.html:

cat ~/project/ansible-get-url/webapp/public/index.html

Debería ver el contenido HTML que creamos en el playbook.

Detención del Servidor Web

Cuando termine de probar, puede detener el servidor web buscando su ID de proceso y matándolo:

pkill -f "python3 -m http.server 8080"

¡Felicidades! Ha desplegado con éxito una aplicación web simple usando el módulo get_url de Ansible para descargar los archivos necesarios.

Resumen

En este tutorial, ha adquirido experiencia práctica utilizando el módulo get_url de Ansible para descargar archivos de URLs específicas. Aprendió:

  • Cómo instalar y configurar Ansible para el desarrollo local
  • Cómo crear playbooks básicos utilizando el módulo get_url para descargar archivos
  • Cómo utilizar opciones avanzadas como la validación de checksum (suma de verificación), timeouts (tiempos de espera), retries (reintentos) y descargas condicionales
  • Cómo implementar un escenario práctico de despliegue de aplicaciones web utilizando el módulo get_url

Estas habilidades son fundamentales para automatizar tareas de gestión de archivos en diversas operaciones de TI, incluyendo el despliegue de software, la gestión de contenido y la configuración del sistema. El módulo get_url es una herramienta versátil que puede integrarse en flujos de trabajo de Ansible más complejos para optimizar sus procesos de gestión de infraestructura.

A medida que continúe su viaje con Ansible, considere explorar módulos relacionados como uri, unarchive y synchronize, que complementan el módulo get_url para una automatización más completa de la gestión de archivos.