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