Dies ist ein Fragment eines Spielbuchs, 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 hat verschiedene Gruppen von Servern, z.
[web]
x.x.x.x
[droplets]
x.x.x.x
Jetzt möchte ich ansible-playbook -i hosts/<env> server.yml
ausführen und hosts: web
von server.yml
überschreiben, um dieses Playbook für [droplets]
auszuführen.
Kann ich einfach einmal außer Kraft gesetzt werden, ohne server.yml
direkt bearbeiten zu müssen?
Vielen Dank.
Ich denke nicht, dass Ansible diese Funktion bietet, die es sollte. Folgendes können Sie tun:
hosts: "{{ variable_Host | default('web') }}"
und Sie können variable_Host
entweder über die Befehlszeile oder über eine vars-Datei übergeben, z.
ansible-playbook server.yml --extra-vars "variable_Host=newtarget(s)"
Für alle, die nach der Lösung suchen.
Spielbuch
- hosts: '{{ Host }}'
tasks:
- debug: msg="Host is {{ ansible_fqdn }}"
Inventar
[web]
x.x.x.x
[droplets]
x.x.x.x
Befehl: ansible-playbook deplyment.yml -i hosts --extra-vars "Host=droplets"
So können Sie den Gruppennamen in den Zusatzvariablen angeben
Dies ist etwas spät, aber ich denke, Sie könnten den Befehl --limit or -l
verwenden, um das Muster auf spezifischere Hosts zu beschränken. (Version 2.3.2.0)
Sie könnten 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 Flag --list-hosts
, um zu sehen, auf welchen Hosts diese Konfiguration angewendet wird.
Ich habe meinen Standard zu keinem Host geändert und habe einen Haken, um ihn zu fangen. Auf diese Weise muss der Benutzer oder cron einen einzelnen Host oder eine Gruppe angeben. Ich mag die Logik aus dem Kommentar von @wallydrag. Der empty_group
enthält keine Hosts im Inventar.
- hosts: "{{variable_Host | default ('empty_group')}}"
Fügen Sie dann die Aufgaben zum Einchecken hinzu:
Aufgaben: - Name: Fehlerhaftes Skript, wenn der Parameter "variable_Host" fehlt Scheitern: msg: "Sie müssen --extra-vars = 'variable_Host ='" .__ hinzufügen. wann: (variable_Host ist nicht definiert) oder (variable_Host == "")
Ich verwende einen anderen Ansatz, der kein Inventar benötigt und mit diesem einfachen Befehl arbeitet:
ansible-playbook site.yml -e working_Host=myhost
Um dies durchzuführen, benötigen Sie ein Spielbuch mit zwei Spielen:
Ein Arbeitsbeispiel (Kopieren Sie es und führt es mit dem vorherigen Befehl aus):
- hosts: localhost
connection: local
tasks:
- add_Host:
name: "{{ working_Host }}"
groups: working_group
changed_when: false
- hosts: working_group
gather_facts: false
tasks:
- debug:
msg: "I'm on {{ ansible_Host }}"
Ich verwende ansible 2.4.3 und 2.3.3
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. So können Sie den Host in einer vars.yml -Datei festlegen und einfach hosts: {{ Host_var }}
in Ihr Playbook schreiben
Zum Beispiel in meinem playbook.yml:
---
- hosts: "{{ Host_name }}"
become: yes
vars_files:
- vars/project.yml
tasks:
...
Und in vars/project.yml:
---
# general
Host_name: your-fancy-Host-name
Wenn Sie eine Aufgabe ausführen möchten, die einem Host zugeordnet ist, jedoch auf einem anderen Host, sollten Sie delegate_to versuchen.
In Ihrem Fall sollten Sie an Ihren localhost (ansible master) delegieren und den Befehl ansible-playbook
aufrufen
Ich finde das limit arg schon großartig - ich möchte nur den Benutzer dazu zwingen, das Limit anzugeben, damit wir nicht versehentlich auf allen Hosts ausführen.
Der einfachste Weg, den ich gefunden habe, ist folgender:
---
- name: Force limit
# all is okay, because we must anyway specify a limit
hosts: 'all'
tasks:
- name: checking limit arg
fail:
msg: "you must use -l or --limit - when you really want to use all hosts, use -l 'all'"
when: ansible_limit is not defined
run_once: true
Ich habe gerade dieses googeln für eine Lösung gefunden. Eigentlich gibt es in Ansible 2.5 eine. Sie können Ihre Inventardatei mit --inventory
wie folgt angeben: ansible --inventory configs/hosts --list-hosts all
Hier ist eine coole Lösung, mit der ich Hosts über die Option --limit
sicher spezifizieren konnte. In diesem Beispiel wird die Wiedergabe beendet, wenn das Playbook ohne Hosts ausgeführt wurde, die mit der Option --limit
angegeben wurden.
Dies wurde auf Ansible Version 2.7.10 getestet
---
- name: Playbook will fail if hosts not specified via --limit option.
# Hosts must be set via limit.
hosts: "{{ play_hosts }}"
connection: local
gather_facts: false
tasks:
- set_fact:
inventory_hosts: []
- set_fact:
inventory_hosts: "{{inventory_hosts + [item]}}"
with_items: "{{hostvars.keys()|list}}"
- meta: end_play
when: "(play_hosts|length) == (inventory_hosts|length)"
- debug:
msg: "About to execute tasks/roles for {{inventory_hostname}}"