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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn