Aller au contenu
Infrastructure as Code medium

Module get_url Ansible : télécharger un fichier HTTP/HTTPS

9 min de lecture

Logo Ansible

ansible.builtin.get_url: télécharge un fichier depuis une URL HTTP/HTTPS/FTP directement sur le managed node (pas de passage par le control node). C’est le module n°1 RHCE 2026 pour récupérer un binaire upstream, une release applicative, un dépôt RPM custom, ou un fichier de config externe.

Options critiques : url:, dest:, mode:, checksum: (vérification d’intégrité), force: true (override), headers: (auth API), validate_certs: (TLS strict).

  • Télécharger un fichier idempotent (Ansible vérifie ETag/Last-Modified par défaut).
  • Vérifier l’intégrité avec checksum: sha256:... (mandatory en prod).
  • Authentifier un download avec Basic Auth ou Bearer token.
  • Désactiver TLS strict avec validate_certs: false (à proscrire en prod).
  • Choisir entre get_url: (download fichier) et uri: (appel API).
  • Connaître la structure HTTP/HTTPS de base (URL, headers, status code).
  • Savoir générer un checksum SHA256 (sha256sum file.tar.gz).
- name: Telecharger un binaire
ansible.builtin.get_url:
url: https://example.com/myapp-1.0.0.tar.gz
dest: /opt/myapp.tar.gz
mode: "0644"

À la première exécution, Ansible télécharge. Au 2ème run, il vérifie via ETag ou Last-Modified HTTP — pas de re-download si le serveur n’a pas changé.

Idempotence : get_url ne re-télécharge que si nécessaire. Pratique pour des artefacts versionnés où l’URL contient déjà la version.

- name: Telecharger node_exporter avec verification SHA256
ansible.builtin.get_url:
url: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
dest: /opt/node_exporter.tar.gz
checksum: sha256:a550cd5c05f760b7934a2d0afad66d2e92e681482f5f57a917465b1fba3b02a6
mode: "0644"

Comportement :

  • Fichier téléchargé avec SHA256 différent de celui spécifié → tâche failed.
  • SHA256 identique → idempotent, pas de re-download.

Formats supportés :

  • sha256:<hex> — recommandé (collision-résistant).
  • sha512:<hex> — plus fort (overkill généralement).
  • sha1:<hex> — déprécié (cassé).
  • md5:<hex> — ne pas utiliser.
  • sha256:https://example.com/SHA256SUMS — récupère depuis URL et matche le filename.

Pattern production : toujours spécifier un checksum pour des binaires critiques. Sans, un MITM ou un repo compromis pousserait n’importe quoi.

# Basic Auth (HTTP)
- ansible.builtin.get_url:
url: https://repo.private.com/files/private.tar.gz
dest: /opt/private.tar.gz
url_username: "{{ vault_repo_user }}"
url_password: "{{ vault_repo_password }}"
mode: "0600"
# Bearer Token (API moderne)
- ansible.builtin.get_url:
url: https://api.github.com/repos/myorg/myapp/releases/latest
dest: /opt/release-meta.json
headers:
Authorization: "Bearer {{ vault_github_token }}"
Accept: application/vnd.github+json
mode: "0600"

Stockage des secrets : toujours dans Ansible Vault (vault_* par convention) — jamais hardcodé dans le playbook.

- ansible.builtin.get_url:
url: https://example.com/dynamic-content.txt
dest: /opt/dynamic.txt
force: true
mode: "0644"

Par défaut, get_url est idempotent. force: true force le download à chaque run.

Cas d’usage : endpoint qui retourne du contenu dynamique (token CSRF, snapshot horaire), ou rotation d’un artefact.

- ansible.builtin.get_url:
url: https://internal-dev.lab/file.tar.gz
dest: /opt/file.tar.gz
validate_certs: false # DESACTIVE LE CHECK TLS — DANGER
mode: "0644"

Désactive la vérification TLS — risque MITM. Cas légitimes : lab interne avec PKI self-signed, test temporaire en dev.

Jamais en prod : si vous voyez validate_certs: false en code de production, c’est une faille de sécurité — corrigez le truststore ou utilisez un certif valide (Let’s Encrypt, internal CA).

# La query string change a chaque run, mais le contenu serveur est identique
- ansible.builtin.get_url:
url: "https://example.com/static.zip?cache_buster={{ ansible_date_time.epoch }}"
dest: /opt/static.zip
checksum: sha256:abc123... # Compare le contenu, pas l URL

Si l’URL change à chaque run mais que le contenu est identique, Ansible ne peut pas savoir via ETag/Last-Modified. Le checksum sauve la mise : Ansible compare le contenu local au checksum attendu — si match, skip même si l’URL diffère.

- name: Telecharger et extraire node_exporter
block:
- ansible.builtin.get_url:
url: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
dest: /tmp/node_exporter.tar.gz
checksum: sha256:a550cd5c05f760b7934a2d0afad66d2e92e681482f5f57a917465b1fba3b02a6
- ansible.builtin.unarchive:
src: /tmp/node_exporter.tar.gz
dest: /opt/
remote_src: true
creates: /opt/node_exporter-1.7.0.linux-amd64/node_exporter

Alternative plus directe : unarchive: src: accepte des URLs directement avec remote_src: true. Mais pas de checksum: côté unarchive: — si l’intégrité compte, faire get_url: puis unarchive: séparément.

SymptômeCauseFix
Re-download à chaque run sur URL stablePas d’ETag/Last-Modified côté serveurUtiliser checksum: pour idempotence
Tâche failed silencieusementFichier corrompu sans checksum:Toujours checksum: en prod
Téléchargement de 5Go reprend à 0get_url ne supporte pas le resumeUtiliser community.general.* ou wget direct
MITM ne déclenche pas d’erreurvalidate_certs: falseNe jamais désactiver TLS sauf cas dev
  • get_url: télécharge côté managed node (pas via control node).
  • Idempotent par défaut via ETag / Last-Modified HTTP.
  • checksum: sha256:... mandatory en prod pour vérification d’intégrité.
  • headers: pour Bearer tokens et API keys.
  • validate_certs: false = DANGER — uniquement en dev avec PKI interne.
  • URL dynamique → utiliser checksum: pour idempotence sur le contenu.

Cette page a un lab d’accompagnement : labs/modules-reseau/get-url/ dans stephrobert/ansible-training.

Challenge — sur db1.lab :

  1. Télécharger gpl-3.0.txt dans /opt/lab-gpl3.txt.
  2. Télécharger lgpl-3.0.txt dans /opt/lab-lgpl3.txt avec force: false.
  3. Vérifier l’idempotence (2ème run = changed=0).

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-reseau/get-url/challenge/tests/

4 tests vérifient l’existence, le mode, et le contenu des deux fichiers.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn