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