Aller au contenu
Infrastructure as Code medium

Module getent Ansible : interroger NSS (passwd, group, hosts) sans shell

6 min de lecture

Logo Ansible

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.

  • Interroger passwd, group, hosts depuis 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.
  • become: false suffit en lecture (sauf bases protégées).
  • Le module n’écrit jamais — pure lecture, pas de state:.
- 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) < 1000

ansible_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.

- 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 defined

key: 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.

- 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 defined

failed_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.

SymptômeCauseFix
KeyError sur ansible_facts.getent_passwd.aliceUser absent, accès direct sans testUtiliser is defined ou default({})
Hostname non résoluDNS down, /etc/hosts incompletVérifier nsswitch.conf et tester getent hosts <host> à la main
Groupe absent dans getent_groupLDAP/SSSD pas démarréVérifier que le service NSS distant est actif sur la cible
Lecture lente sur gros annuairedatabase: passwd complet via LDAPRestreindre avec key: pour cibler une entrée
  • 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: getent car le résultat est structuré et réutilisable dans when:.

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