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:
- Crea un directorio
downloadspara almacenar nuestros archivos descargados - Usa el módulo
get_urlpara 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 archivodest: Define la ruta de destino donde se guardará el archivomode: 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:
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
Timeout (Tiempo de Espera) y Reintentos:
timeout: Tiempo máximo en segundos para que se complete la solicitud HTTPretries: Número de veces para reintentar si la descarga falladelay: Retraso entre reintentos en segundosforce: Si se debe descargar el archivo incluso si ya existe
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:
- Crea la estructura de directorio necesaria para nuestra aplicación web
- Crea un archivo index.html con contenido HTML básico
- Descarga un archivo CSS y una imagen del logotipo de Ansible usando el módulo
get_url - Instala un servidor HTTP de Python
- 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_urlpara 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.


