Variables et facts 18 min de lecture

Facts et conditionnelles

Les facts Ansible

Les facts sont des informations systeme collectees automatiquement sur les hotes cibles au debut de chaque play.

# Afficher tous les facts d'un hote
ansible web1.example.com -m setup

# Filtrer les facts
ansible web1.example.com -m setup -a "filter=ansible_os_family"
ansible web1.example.com -m setup -a "filter=ansible_distribution*"

# Facts courants
# ansible_os_family: "Debian"
# ansible_distribution: "Ubuntu"
# ansible_distribution_version: "22.04"
# ansible_hostname: "web1"
# ansible_default_ipv4.address: "192.168.1.10"
# ansible_memtotal_mb: 4096
# ansible_processor_cores: 2

Utiliser les facts dans les taches

- name: Afficher les informations systeme
  debug:
    msg: "OS: {{ ansible_distribution }} {{ ansible_distribution_version }}, RAM: {{ ansible_memtotal_mb }}MB"

- name: Installer le paquet selon l'OS
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"

- name: Installer le paquet sur CentOS
  yum:
    name: nginx
    state: present
  when: ansible_os_family == "RedHat"

Conditionnelles avec when

# Condition simple
- name: Redemarrer si configuration modifiee
  service:
    name: nginx
    state: restarted
  when: nginx_config.changed

# Conditions multiples (ET)
- name: Installer sur Ubuntu 22.04 uniquement
  apt:
    name: special-package
    state: present
  when:
    - ansible_distribution == "Ubuntu"
    - ansible_distribution_version == "22.04"

# Condition OU
- name: Installer sur Debian ou Ubuntu
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian" or ansible_os_family == "Ubuntu"

# Condition sur une variable
- name: Deployer en production uniquement
  template:
    src: prod.conf.j2
    dest: /etc/app/app.conf
  when: env == "production"

Desactiver la collecte de facts

# Pour accelerer l'execution si les facts ne sont pas necessaires
---
- name: Tache rapide sans facts
  hosts: all
  gather_facts: no
  tasks:
    - name: Ping
      ping:
Performance : La collecte de facts prend du temps. Utilisez gather_facts: no quand vous n'en avez pas besoin.