
Die folgende Aufgabe:
- name: Download Jfrog Artifcats
ansible.windows.win_shell: |
$ENV:JFROG_CLI_OFFER_CONFIG="false"
jfrog rt download ...
when: ???
center
sollte nur für Maschinen ausgeführt werden, die sich in der appservers
Gruppe befinden
---
all:
children:
root:
children:
center:
children:
appservers:
hosts:
vm1.domain.com:
qservers:
hosts:
vm2.domain.com:
dbservers:
hosts:
vm3.domain.com:
mobilefarms:
hosts:
children:
gateways:
hosts:
south:
children:
brooklyn:
hosts:
vm4.domain.com:
children:
clients:
hosts:
vm5.domain.com:
vm6.domain.com:
north:
children:
new_york:
hosts:
vm8.domain.com:
children:
clients:
hosts:
vm9.domain.com:
Welche Bedingung muss ich eingeben, when
um dies zu erreichen? Und was ist das Prinzip hinter dieser Konfigurationsoption?
Antwort1
Um die Gruppenmitgliedschaft in einer Bedingung für eine Aufgabe, ein Spiel oder einen Block zu verwenden, würden Sie das folgende Format verwenden:
when: inventory_hostname in groups["<group name>"]
Konkret zu Ihrer Eingangsfrage:
when: inventory_hostname in groups["appservers"]
Um alle Maschinen unter zu erreichen north
, ändern Sie es einfach in:
when: inventory_hostname in groups["north"]
In Bezug auf Ihre nachfolgende Klarstellung (Angabe einer Gruppe an einem bestimmten "Standort") müssen Gruppennamen in Ansible eindeutig sein. Es besteht keine Notwendigkeit, zu unterscheidenwelche appservers
Gruppe, auf die Sie sich beziehen, da diese appservers
immer nur an einem Ort sein kann.
Wenn Sie versuchen, zwei Gruppen zu erstellen appservers
, wird nur die erste von der Ansible-Engine analysiert; alle nachfolgenden Gruppen mit demselben Namen werden ignoriert. Wenn Sie also (in Zukunft) eine appservers
Gruppe unter north
und eine appservers
Gruppe unter planen south
, werden Sie feststellen, dass nur Mitglieder der ersten Gruppe eingeschlossen werden.
Wie erreichen wir das in Ansible (meine Annahme, was SieMaiSie können in Zukunft auch mehrere Gruppen gleichzeitig erstellen (wie Sie es in Zukunft möchten), indem Sie die Hosts in Ansible wie folgt zu mehreren Gruppen hinzufügen und Ihr Limit oder Ihre Bedingung entsprechend anpassen:
all:
children:
north:
hosts:
a.domain.com:
b.domain.com:
south:
hosts:
y.domain.com:
z.domain.com:
appservers:
hosts:
a.domain.com:
y.domain.com:
dbservers:
hosts:
b.domain.com:
z.domain.com:
Wenn Sie in diesem BeispielalleApp-Server, würden Sie nur anvisieren appservers
. Wenn Sie nur appservers
in der north
Region wollten, würden Sie Ihr Limit für die Wiedergabe auf festlegen north:&appservers
oder alternativ die Bedingung verwenden
when:
- inventory_hostname in groups["appservers"]
- inventory_hostname in groups["north"]
Auf jeden Fall denke ich, dass Sie eine Auffrischung in der Bestandsstruktur in Ansible benötigen. Dafür empfehle ich dasBenutzerhandbuch; es gibt auch einige großartige Ressourcen auf verschiedenen Schulungsseiten, die viel detaillierter sein können.
Weitere Informationen zu komplexerem Targeting mit mehreren Gruppen (Kombinationen, Vereinigungen, Ausschlüsse usw.) finden Sie in diesem anderenBenutzerhandbuch.
Persönlich dachte ich zunächst, dass die Einrichtung mühsam und eingeschränkt war, aber mit zunehmender Erfahrung mit der Nutzung finde ich sie tatsächlich dynamischer als die Alternative.