Passer au contenu principal

Fondamentaux (Ansible)

Les facts

Les facts sont des variables automatiquement collectées sur chaque hôte cible au début de chaque play. Ils exposent l'état réel du système : distribution, architecture, interfaces réseau, mémoire, disques. Comprendre les facts permet d'écrire des playbooks adaptatifs qui fonctionnent sur des environnements hétérogènes.

La collecte automatique

Par défaut, Ansible exécute le module setup sur chaque hôte au début du play. Cette étape s'affiche comme Gathering Facts dans la sortie. Les facts collectés sont ensuite disponibles dans la variable ansible_facts et accessibles directement par leur nom court.

# Voir tous les facts d'un hôte
ansible web01.example.com -m setup

# Filtrer par pattern
ansible web01.example.com -m setup -a "filter=ansible_distribution*"
ansible web01.example.com -m setup -a "filter=ansible_default_ipv4"

Facts essentiels

  • ansible_distribution : "Debian", "Ubuntu", "CentOS"...
  • ansible_distribution_version : "13", "22.04"...
  • ansible_distribution_release : "trixie", "jammy"...
  • ansible_architecture : "x86_64", "aarch64"...
  • ansible_hostname : nom d'hôte court
  • ansible_fqdn : nom d'hôte complet
  • ansible_default_ipv4.address : IP de l'interface par défaut
  • ansible_memtotal_mb : RAM totale en Mo
  • ansible_processor_vcpus : nombre de vCPU
  • ansible_interfaces : liste des interfaces réseau
  • ansible_date_time : date et heure au moment de la collecte

Utiliser les facts dans un playbook

- name: Configurer selon la distribution
  ansible.builtin.apt:
    name: nginx
    state: present
  when: ansible_distribution == "Debian"

- name: Ajuster selon la RAM disponible
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  vars:
    worker_connections: "{{ [1024, ansible_memtotal_mb // 4] | max }}"

Variables magiques

En plus des facts, Ansible expose des variables dites "magiques" qui décrivent le contexte d'exécution :

  • inventory_hostname : nom de l'hôte tel qu'il apparaît dans l'inventaire
  • inventory_hostname_short : version courte (avant le premier point)
  • ansible_play_hosts : liste des hôtes actifs dans le play courant
  • ansible_play_batch : sous-ensemble du play en cours (avec serial)
  • groups : dictionnaire de tous les groupes et leurs hôtes
  • group_names : liste des groupes auxquels appartient l'hôte courant
  • hostvars : facts et variables de tous les hôtes de l'inventaire
# Accéder aux facts d'un autre hôte
- name: Configurer le backend avec l'IP du DB
  ansible.builtin.template:
    src: app.conf.j2
    dest: /etc/myapp/app.conf
  vars:
    db_ip: "{{ hostvars['db01.example.com']['ansible_default_ipv4']['address'] }}"

Custom facts

Il est possible de définir des facts personnalisés sur les machines cibles. Ansible charge automatiquement tout fichier .fact présent dans /etc/ansible/facts.d/ :

# /etc/ansible/facts.d/app.fact (fichier INI)
[app]
version=2.4.1
env=production

Ces facts sont ensuite disponibles sous ansible_local.app.version. Utile pour exposer des métadonnées applicatives sans modifier l'inventaire.

Désactiver la collecte des facts

La collecte des facts prend 1 à 3 secondes par hôte. Sur un play qui n'en a pas besoin, la désactiver réduit sensiblement le temps d'exécution :

- name: Play rapide sans facts
  hosts: all
  gather_facts: false

  tasks:
    - name: Vérifier la connectivité
      ansible.builtin.ping: