Aller au contenu
Infrastructure as Code medium

Patterns d'hôtes Ansible : --limit, opérateurs (:, &, !), wildcards

9 min de lecture

Logo Ansible

--limit et les patterns d'hôtes permettent de cibler précisément les hôtes voulus sans toucher au playbook. C'est l'outil clé pour des opérations chirurgicales : déployer sur un seul host, tester en staging avant prod, exclure une machine en maintenance. Maîtriser cette syntaxe est mandatory au RHCE, vous y serez confronté à chaque exercice.

Quatre opérateurs couvrent 95 % des cas : : (union), :& (intersection), :! (exclusion), * (wildcard).

  • Lister les hôtes ciblés par un pattern via --list-hosts sans rien exécuter.
  • Combiner union, intersection, exclusion dans un même pattern.
  • Utiliser des wildcards et des ranges (web[01:05]).
  • Appliquer --limit sur un playbook pour réduire la portée.
  • Comprendre l'ordre d'évaluation des opérateurs.
  • Inventaire fonctionnel (statique ou dynamique).
  • Connaître la commande ansible-inventory --graph.
OpérateurEffetExempleRésultat (avec inventaire du lab inventaires/patterns-hotes)
:Union (OU logique)webservers:dbserversweb1, web2, db1
:&Intersection (ET logique)webservers:&stagingweb1 uniquement
:!Exclusionwebservers:!web1.labweb2 uniquement
*Wildcardweb*.labweb1.lab, web2.lab
[a:c]Rangeweb[01:05].labweb01.lab à web05.lab
~regexRegex (rare)~web[1-3]\.labweb1, web2, web3

Important : entourer toujours le pattern de quotes simples en CLI : --limit 'webservers:&staging'. Sans quotes, le shell interprète : ou & et casse la commande.

Avant de lancer un playbook avec un pattern complexe, valider la sélection :

Fenêtre de terminal
ansible 'webservers:&staging' -i inventory/hosts.yml --list-hosts

Sortie :

hosts (1):
web1.lab

--list-hosts est l'équivalent du --check pour les patterns : aucune action, juste la résolution. Mandatory avant un playbook destructif (purge, reboot, drop).

Combiner plusieurs groupes ou hôtes :

Fenêtre de terminal
ansible 'webservers:dbservers' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, web2.lab, db1.lab, l'union de tous les hôtes des deux groupes.

Fenêtre de terminal
ansible 'webservers:db1.lab' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, web2.lab, db1.lab, un groupe + un host individuel. Le pattern accepte indifféremment des noms de groupes ou des hostnames.

Les hôtes présents dans les deux groupes simultanément :

Fenêtre de terminal
ansible 'webservers:&staging' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab uniquement, il est dans webservers ET dans staging. web2.lab est dans webservers mais pas dans staging → exclu.

Cas d'usage typique : déployer un patch uniquement sur les machines qui sont à la fois webservers ET en staging, ne pas toucher au prod, ne pas toucher aux dbservers.

Retirer des hôtes d'un groupe :

Fenêtre de terminal
ansible 'webservers:!web1.lab' -i inventory/hosts.yml --list-hosts

Sortie : web2.lab uniquement.

Fenêtre de terminal
ansible 'all:!dbservers' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, web2.lab, tous sauf ceux dans dbservers.

Cas d'usage typique : machine en maintenance, --limit 'webservers:!web1.lab' pour déployer partout sauf elle.

Fenêtre de terminal
ansible 'web*.lab' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, web2.lab, tout ce qui commence par web.

Fenêtre de terminal
ansible '*1.lab' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, db1.lab, tout ce qui finit par 1.lab.

Limites : le wildcard ne matche que sur les hostnames, pas sur les noms de groupes. Pour des matchs de groupes, préférer la regex (~) ou définir un méta-groupe.

Les opérateurs s'évaluent de gauche à droite :

Fenêtre de terminal
ansible 'prod:!monitoring' -i inventory/hosts.yml --list-hosts

Sortie : web1.lab, web2.lab, tous les hôtes de prod sauf ceux dans monitoring (db1).

Fenêtre de terminal
ansible 'webservers:dbservers:!staging' -i inventory/hosts.yml --list-hosts

Sortie : web2.lab, db1.lab, union de webservers et dbservers, moins ceux dans staging (web1).

Fenêtre de terminal
ansible 'all:&prod:!web1.lab' -i inventory/hosts.yml --list-hosts

Évaluation pas-à-pas :

  1. all → web1, web2, db1.
  2. &prod → intersection avec prod → web1, web2, db1 (tous y sont).
  3. !web1.lab → retirer web1 → web2, db1.

Règle d'or : pour des patterns à 3+ opérateurs, valider avec --list-hosts avant le run réel.

Le pattern peut s'appliquer à un playbook qui cible hosts: all :

Fenêtre de terminal
ansible-playbook -i inventory/hosts.yml site.yml --limit 'webservers:!web1.lab'

Le playbook tourne uniquement sur web2.lab, --limit filtre par-dessus le hosts: du playbook. L'inverse n'est pas vrai : --limit ne peut pas élargir le hosts: d'origine, seulement le restreindre.

Fenêtre de terminal
# hosts: webservers dans le playbook, --limit 'all'
# → cible quand même webservers (limit ne peut pas élargir)

Quand vous avez 50 webservers nommés web01 à web50 :

Fenêtre de terminal
ansible 'web[01:10].lab' -i inventory/hosts.yml --list-hosts

Sortie : web01.lab à web10.lab. Le séparateur est : (pas - comme dans certaines convention).

Fenêtre de terminal
ansible 'web[01:50]:!web[10:20].lab' -i inventory/hosts.yml --list-hosts

Tous les webservers sauf web10 à web20. Combinaison range + exclusion.

Avec un plugin libvirt ou AWS, les groupes sont générés dynamiquement depuis les tags ou les attributs des VMs :

Fenêtre de terminal
# Plugin AWS retourne des groupes par tag
ansible 'tag_Environment_prod:&tag_Role_web' -i aws_inventory.yml --list-hosts

Cible toutes les VMs AWS qui ont à la fois Environment=prod ET Role=web. Le pattern syntaxique reste identique au statique, c'est juste la source des groupes qui change.

Cette page a un lab d'accompagnement : labs/inventaires/patterns-hotes/ dans stephrobert/ansible-training. Il définit un inventaire avec des hôtes appartenant à plusieurs groupes (web1 dans webservers + staging + prod) pour démontrer les intersections.

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/inventaires/patterns-hotes/
cat README.md
ansible 'webservers:&staging' -i inventory/hosts.yml --list-hosts
ansible 'prod:!monitoring' -i inventory/hosts.yml --list-hosts
pytest -v challenge/tests/
SymptômeCauseFix
: interprété par le shellPas de quotes autour du patternToujours --limit '...'
&staging lance le shell en arrière-plan& interprété par bashQuotes simples obligatoires
Pattern matche 0 hostFaute de frappe ou groupe inexistant--list-hosts puis --graph
--limit n'agit pasNe peut élargir un hosts: du playbookModifier hosts: all dans le playbook
Range web[1-5] ne marche pasTirets - au lieu de deux-points :web[01:05] (avec :)
Wildcard sur nom de groupe* matche seulement les hostnamesDéfinir un méta-groupe explicitement
  • : = union, :& = intersection, :! = exclusion, * = wildcard.
  • Quotes simples obligatoires en CLI : --limit '...'.
  • --list-hosts valide la sélection sans exécuter, mandatory avant un run risqué.
  • Évaluation gauche-à-droite des opérateurs.
  • --limit peut restreindre le hosts: du playbook, pas l'élargir.
  • Ranges : web[01:10] (séparateur :).
  • Sur inventaire dynamique : la syntaxe reste identique, seuls les groupes diffèrent.

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