it-swarm.com.de

Überschreibt die hosts-Variable des Ansible-Playbooks in der Befehlszeile

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.

59
luqo33

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)"
100
wallydrag

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

40
Mrunal Gosar

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.

7
Jonathan Hamel

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 == "") 
5
Tony-Caffe

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:

  • das erste Spiel läuft auf localhost und fügt einen Host (aus einer gegebenen Variablen) in einer bekannten Gruppe im Inventar der Inmorys hinzu
  • das zweite Stück läuft über diese bekannte Gruppe

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

4
Nelson G.

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

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

2
nghnam

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

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

1
Bebef

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}}"
0
sudo soul