Aller au contenu
English
English
Infrastructure as Code medium

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

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

Trois de ces quatre pannes ne viennent pas du module mais de ce qu'il observe : une entrée absente à laquelle on accède sans précaution, un nom que le système ne sait pas résoudre, un annuaire distant dont le service est arrêté. La quatrième est une question de volume, et elle se règle en ciblant une entrée au lieu de rapatrier toute la base.

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

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • 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:.
  • Module stat : l'autre module de lecture pure, côté fichiers cette fois, pour conditionner une tâche.
  • Modules assert et fail : transformer une lecture NSS en précondition qui arrête le play avec un message utile.
  • Module service_facts : la même logique de collecte d'état, appliquée cette fois aux services.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. 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