Dies ist ein Fragment eines Playbooks, das ich verwende ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Meine Hosts-Datei enthält verschiedene Servergruppen, z
[web]
x.x.x.x
[droplets]
x.x.x.x
Jetzt mag ich ausführen ansible-playbook -i hosts/<env> server.yml
und außer Kraft setzt hosts: web
aus server.yml
diesem Textbuch zu laufen [droplets]
.
Kann ich nur einmal überschreiben, ohne server.yml
direkt zu bearbeiten ?
Vielen Dank.
ansible
ansible-playbook
luqo33
quelle
quelle
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
scheinen nach derhosts:
Zeile des Playbooks analysiert zu werden . Variablen invars:
und Variablen invars_files:
werden jedoch vor derhosts:
Zeile analysiert . HINWEIS Ich frage nicht nach Vorrang.-e
anstelle von verwenden--extra-vars
.Für alle, die nach einer Lösung suchen.
Spielbuch
Inventar
Befehl:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
So können Sie den Gruppennamen in den Extra-Vars angebenquelle
play_hosts
und nicht die erwarteten Ergebnisse erhalten, weil ich vergessen habe, dass diesplay_hosts
eine interne Ansible-Variable für alle Hosts im aktuellen Spiel ist.Dies ist etwas spät, aber ich denke, Sie könnten den
--limit or -l
Befehl verwenden, um das Muster auf spezifischere Hosts zu beschränken. (Version 2.3.2.0)Du könntest haben
- hosts: all (or group) tasks: - some_task
und dann
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
und verwenden Sie das--list-hosts
Flag, um zu sehen, auf welchen Hosts diese Konfiguration angewendet werden würde.quelle
limit
die Liste der betroffenen Hosts vergisst, kann das Playbook großen Schaden anrichten.--extra-vars "variable_host=newtarget(s)"
genau wie die akzeptierte Lösung ebenso gefährlich und komplizierter ist. Es werden Standardhosts verwendet,web
die anstelle von hier auch angewendet werden könnenall
. Sie können standardmäßig eine strenge Hostgruppe verwenden, um Fehler zu vermeiden, und das--list-hosts
Flag verwenden, um ein klares Verständnis dafür zu erhalten, welche Hosts Sie betreffen.--limit
(andernfalls sind alle möglichen Hosts betroffen, was möglicherweise nicht das gewünschte Verhalten ist)Wir verwenden eine einfache Fail- Task, um den Benutzer zu zwingen, die Option Ansible Limit anzugeben , damit wir nicht standardmäßig / versehentlich auf allen Hosts ausgeführt werden.
Der einfachste Weg, den ich gefunden habe, ist folgender:
Jetzt müssen wir die Option
-l
(=--limit
) verwenden, wenn wir das Playbook ausführen, zBegrenzungsoptionsdokumente :
quelle
Ich verwende einen anderen Ansatz, der kein Inventar benötigt und mit diesem einfachen Befehl arbeitet:
Dazu benötigen Sie ein Spielbuch mit zwei Spielen:
Ein funktionierendes Beispiel (kopieren Sie es und führen Sie es mit dem vorherigen Befehl aus):
quelle
Ich habe meinen Standardwert auf "Kein Host" geändert und habe einen Scheck, um ihn abzufangen. Auf diese Weise wird der Benutzer oder Cron gezwungen, einen einzelnen Host oder eine Gruppe usw. bereitzustellen. Ich mag die Logik aus dem Kommentar von @wallydrag. Das
empty_group
enthält keine Hosts im Inventar.Fügen Sie dann die Check-in-Aufgaben hinzu:
quelle
Ich bin gerade auf dieses Googeln gestoßen, um eine Lösung zu finden. Tatsächlich gibt es eine in Ansible 2.5. Sie können Ihre Inventardatei
--inventory
wie folgt angeben :ansible --inventory configs/hosts --list-hosts all
quelle
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Wenn Sie eine Aufgabe ausführen möchten, die einem Host zugeordnet ist, jedoch auf einem anderen Host, sollten Sie delegate_to ausprobieren .
In Ihrem Fall sollten Sie an Ihren localhost (ansible master) delegieren und den
ansible-playbook
Befehl aufrufenquelle
Ich verwende ansible 2.5 (genau 2.5.3) und es scheint, dass die vars-Datei geladen wird, bevor der Hosts-Parameter ausgeführt wird. Sie können den Host also in einer vars.yml- Datei festlegen und einfach
hosts: {{ host_var }}
in Ihr Playbook schreibenZum Beispiel in meinem playbook.yml:
Und in vars / project.yml:
quelle
Hier ist eine coole Lösung, die ich gefunden habe, um Hosts über die
--limit
Option sicher anzugeben . In diesem Beispiel wird das Spiel beendet, wenn das Spielbuch ohne Hosts ausgeführt wurde, die über die--limit
Option angegeben wurden.Dies wurde auf Ansible Version 2.7.10 getestet
quelle
Eine andere Lösung besteht darin, die spezielle Variable zu verwenden,
ansible_limit
die den Inhalt der--limit
CLI-Option für die aktuelle Ausführung von Ansible darstellt.Wenn die
--limit
Option weggelassen wird, gibt Ansible eine Warnung aus, unternimmt jedoch nichts, da kein Host übereinstimmt.quelle