2017-06-09 8 views
0

Ich habe ein Playbook, das eine Konfigurationsdatei für alle angegebenen Hosts erstellen soll, auf meinem monitoring_sever.Wie man über alle angegebenen Hosts iteriert

- hosts: all 
    gather_facts: True 

    hosts: monitoring_server 
    tasks: 
    - command: touch {{ hostvars[item]['ansible_fqdn'] }} 
    with_items: "{{ groups['all'] }}" 

ausführen ich das Textbuch mit ansible-playbook main.yml -l "new_client, new_client2, monitoring_server"

Die resultierenden Dateien auf dem Überwachungsserver wie folgt aussehen sollte:
client1.conf client2.conf über fehlende Anführungszeichen

Aber ich erhalte eine Fehlermeldung Ich habe alle möglichen Syntaxänderungen ausprobiert, aber ich kann das Problem nicht finden.

Antwort

0

Aktualisiert:

- hosts: all 
    gather_facts: True 

    tasks: 
    - file: 
     path: "{{ hostvars[item]['ansible_fqdn'] }}" 
     state: touch 
     delegate_to: host_name # Delegate task to specific host 
     with_items: "{{ groups['all'] }}" 

Sie haben Fehler in der ursprünglichen Textbuch.

  1. with:items sollte with_items
  2. items sollte item

Verwendung von delegate_to sein: http://docs.ansible.com/ansible/playbooks_delegation.html#delegation


Solange Sie alle Hosts sind Targeting, Sie müssen nicht zu Erstellen Sie eine Schleife, wenn Ansible Aufgaben auf allen Zielhosts ausführt, sofern nicht ausgeschlossen nach Zustand.

Auf der anderen Seite würde ich vorschlagen file Modul anstelle von command zu verwenden, um die Datei zu berühren.

- hosts: all 
    tasks: 
    - name: Touch a file 
     file: 
     path: "{{ ansible_fqdn }}" 
     state: touch 

PS. Ich nehme an, ansible_fqdn ist eine Host-Variable, die Sie für jeden Host definiert haben.

+0

Das Problem ist, dass ich will Erstellen Sie die Dateien für alle Hosts, aber nur auf dem Monitoring-Server. Ich habe Touch nur für Debug-Zwecke verwendet. Die ursprüngliche Aufgabe besteht darin, eine Konfigurationsdatei mithilfe einer Vorlage zu kopieren. – David

+0

Betrachte deine Frage genauer. Ich werde meine Antwort auch aktualisieren. –

+0

Dafür, @David, fügen Sie einfach 'delegate_to: localhost' für die Aufgabe hinzu. – Jack

0

Sie müssen beheben:

  1. with_items: statt with:items:

  2. item statt items

  3. eine einzige hosts: Erklärung in jedem Punkt auf der Liste von Spielen

Dies sollte für Ihren Fall arbeiten:

--- 
- hosts: all 
    gather_facts: true 

- hosts: monitoring_server 
    tasks: 
    - command: touch {{ hostvars[item]['ansible_fqdn'] }} 
     with_items: "{{ groups['all'] }}" 

Alternativ können Sie delegate_to: localhost verwenden und vollständig die Schleife sowie der Verweis auf hostvars fallen:

--- 
- hosts: all 
    gather_facts: true 
    tasks: 
    - command: touch {{ ansible_fqdn }} 
     delegate_to: localhost 
+0

Danke, ich habe Artikel in meinem Spielbuch korrigiert. Die Doppel-Host-Deklaration ist jedoch notwendig, da sie die Variable von den anderen Systemen mittels gather_facts abrufen muss. – David

+0

YAML funktioniert nicht so. Wenn Sie Fakten sammeln müssen, müssen Sie zwei Elemente haben, nicht eins. – techraf

+0

Es tut mir leid, aber ich bekomme immer noch einen Fehler, auch wenn ich das Beispiel kopieren und ausführen, das Sie mir gesendet haben, und ich kann einfach nicht herausfinden, warum. Ich habe das Playbook mit 'ansible-playbook test.ym -l" new_client1, monitoring_server "' 'ausgeführt. Der Fehler ist folgender:' Das Feld 'args' hat einen ungültigen Wert. [...] Zeile 7, Spalte 7 ' – David

Verwandte Themen