
ansible.builtin.getent: interroge les bases NSS (Name Service Switch) du managed node — passwd, group, hosts, services, networks, protocols. C’est l’alternative idempotente au pipeline command: getent passwd alice quand vous voulez vérifier l’existence d’une entrée ou récupérer ses détails sans passer par le shell.
Le résultat est rangé dans ansible_facts.getent_<database> — directement réutilisable dans une condition when: ou un template Jinja, sans parsing manuel de stdout.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Interroger
passwd,group,hostsdepuis un playbook. - Conditionner une tâche selon la présence d’une entrée (
when:). - Résoudre un hostname via NSS (DNS +
/etc/hosts+ nsswitch). - Récupérer des facts utilisateurs ou groupes pour audit.
Prérequis
Section intitulée « Prérequis »become: falsesuffit en lecture (sauf bases protégées).- Le module n’écrit jamais — pure lecture, pas de
state:.
Lister tous les utilisateurs du système
Section intitulée « Lister tous les utilisateurs du système »- name: Lire la base passwd ansible.builtin.getent: database: passwd
- name: Afficher les users systeme (UID < 1000) ansible.builtin.debug: msg: "{{ item.key }}" loop: "{{ ansible_facts.getent_passwd | dict2items }}" when: (item.value[1] | int) < 1000ansible_facts.getent_passwd est un dict indexé par username. Chaque valeur est une liste [password, uid, gid, gecos, home, shell] — exactement comme les colonnes de /etc/passwd.
Vérifier qu’un groupe existe
Section intitulée « Vérifier qu’un groupe existe »- name: Verifier la presence du groupe wheel ansible.builtin.getent: database: group key: wheel
- name: Echouer si wheel n'existe pas ansible.builtin.fail: msg: "Groupe wheel manquant — corriger le provisioning" when: ansible_facts.getent_group.wheel is not definedkey: restreint la requête à une seule entrée — plus rapide qu’un dict | dict2items. Si l’entrée est absente, ansible_facts.getent_<db> reste vide ou non défini selon les versions, d’où le is not defined.
Résoudre un hostname
Section intitulée « Résoudre un hostname »- name: Resoudre db1.lab via NSS ansible.builtin.getent: database: hosts key: db1.lab
- name: Recuperer l'IP ansible.builtin.set_fact: db1_ip: "{{ ansible_facts.getent_hosts['db1.lab'][0] }}"Avantage sur dig ou nslookup : getent hosts respecte /etc/nsswitch.conf — il consulte /etc/hosts, DNS, mDNS, dans l’ordre configuré sur la cible. C’est ce que voient réellement les applications.
Conditionner une tâche selon la présence d’un user
Section intitulée « Conditionner une tâche selon la présence d’un user »Pattern fréquent : configurer alice uniquement si elle existe (sinon laisser un autre playbook la créer en amont).
- name: Verifier que alice existe ansible.builtin.getent: database: passwd key: alice failed_when: false
- name: Configurer le shell de alice ansible.builtin.user: name: alice shell: /bin/zsh when: ansible_facts.getent_passwd.alice is definedfailed_when: false évite l’échec si la clé n’existe pas — sans ça, getent retourne un code non-zéro et le play s’arrête.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
KeyError sur ansible_facts.getent_passwd.alice | User absent, accès direct sans test | Utiliser is defined ou default({}) |
| Hostname non résolu | DNS down, /etc/hosts incomplet | Vérifier nsswitch.conf et tester getent hosts <host> à la main |
Groupe absent dans getent_group | LDAP/SSSD pas démarré | Vérifier que le service NSS distant est actif sur la cible |
| Lecture lente sur gros annuaire | database: passwd complet via LDAP | Restreindre avec key: pour cibler une entrée |
À retenir
Section intitulée « À retenir »database:= base NSS à interroger (passwd,group,hosts,services…).key:= entrée spécifique (sinon dump complet).- Résultat dans
ansible_facts.getent_<database>— un dict indexé par clé. - Lecture pure, pas d’écriture, idempotent par nature.
- Préférable à
command: getentcar le résultat est structuré et réutilisable danswhen:.