2016-05-10 5 views
0

Ich möchte Ansible zwingen, Fakten über Hosts in Playbook zu sammeln (um diese Daten innerhalb der Rolle zu verwenden) unabhängig --limit, aber weiß nicht wie.Force Ansible zum Sammeln von Fakten aus der Gruppe

Ich habe Textbuch wie folgt aus:

- hosts: postgres_access 
    tasks: 
    - name: Gathering info 
    action: setup 

- hosts: postgres 
    roles: 
    - postgres 

Inside 'postgres' Rolle I Vorlage haben die iteriert über Standard-IP-Adressen:

{% for host in groups['postgres_access'] %} 
host all all {{hostvars[host].ansible_default_ipv4.address}}/32 md5 
{% endfor %} 

Das ist wie Magie funktioniert, aber nur, wenn ich mein Textbuch laufen ohne Limit. Wenn ich --limit verwende, bricht es, weil einige Hosts in der Hostgruppe keine gesammelten Fakten haben.

ansible-playbook -i testing db.yml --limit postgres 

fehlgeschlagen: [pgtest] (item = pg_hba.conf) => { "nicht bestanden": true, "item": "pg_hba.conf", "msg": „AnsibleUndefinedVariable: 'dict Objekt' hat kein Attribut 'ansible_default_ipv4' "}

Wie kann ich --limit haben, nur postgres-Host neu zu konfigurieren, und Netzwerkdaten von anderen Hosts haben (ohne alle anderen Konfigurations-Sachen zu machen?).

+1

Haben Sie einen anderen Ansatz wie das Markieren Ihrer Postgres-Aufgaben und die Angabe von '--tags postgres' ausprobiert? Auf diese Weise führen Sie keine Begrenzung durch Inventargruppen, sondern durch spezifische Aufgaben –

+0

ja, ich denke, ich werde Tags verwenden. Es würde immer noch nicht helfen mit "configure single host" case (wie es oft verwendet wird). –

+0

Eine Aufgabe gemacht, um dies zu lösen, habe ich in die 'roles/postgres/tasks/main.yml' Datei geschrieben, aber ich wette, dass der Ort nicht relevant ist, wenn Sie ihn stattdessen aus dem Playbook heraus ausführen. Siehe meine Antwort unten. –

Antwort

0

Versuchen Sie folgendes:

- hosts: postgres 
    pre_tasks: 
    - setup: 
    delegate_to: postgres_access 
    roles: 
    - postgres 
+0

Leider kann eine Aufgabe nicht an die Gruppe delegiert werden. –

1

Try this bitte!

- hosts: postgres 

    pre_tasks: 
    - setup: 
    delegate_to: "{{item}}" 
    with_items: "{{groups['postgres_access']}}" 

    roles: 
    - postgres 
+0

delegate_to Idee ist erstaunlich, und es funktioniert mit 'with_items' wie erwartet (netter Trick!). Wenn "setup" delegiert wird, füllt es unglücklicherweise Fakten für "postgres" -Hosts, nicht aber für die "postgress_access" -Gruppe. –

+0

oh, wenn möglich bitte teilen Sie die Ausgabe!:) –

0

Sie können setup für die Gastgeber in der postgres_access Gruppe als eine Aufgabe ausführen und die Fakten speichern register mit:

 
    - name: setup hosts 
    action: "setup {{ item }} filter=ansible_default_ipv4" 
    with_items: groups.postgres_access 
    register: ip_v4
- name: create template template: src=[your template] dest=[your dest file]

Nur denken Sie daran, dass die Vorlage, wie Sie ändern muss referenzieren die Hosts IPv4-Adresse, versuchte ich mit etwas wie folgt:

{% for item in ip_v4.results %} 
    host all all {{ item.ansible_facts.ansible_default_ipv4.address }}/32 md5 
{% endfor %} 

Zum Drucken nur der IP jedes Hosts in der Gruppe

+0

Delegierter scheint auch die Art und Weise zu sein, dies aus dem Playbook nach [this] (http://docs.ansible.com/ansible/playbooks_delegation.html) zu tun, aber Jungs gingen die 'delegate_facts: True' Einstellung verloren Das könnte der Grund sein, dass dies für dich überhaupt nicht funktioniert hat. –

+0

Ich versuchte 'delegate' vergebens. Ich glaube, das liegt daran, dass delegate Aufgaben in Hosts ausführt, an die sie delegiert werden. Sie erstellen die Vorlage jedoch an einem anderen Ort, und die 'hostvars' werden nicht wie erwartet wiedergegeben. Es gibt einige Bugs, die mit diesem Verhalten in Verbindung stehen, und ich glaube, dass Sie gerade einen anderen schlagen. –

0

Verwenden Sie dieselbe Rolle, die Sie definiert haben, wie sie ist, mit ignore_errors: true. So dass für Hosts, die keine Daten gesammelt haben, wird nicht fehlschlagen.

Und wenn Sie möchten, dass Daten für alle Hosts in beiden Gruppen postgres_access und postgres gesammelt werden, fügen Sie gather_facts: true hinzu, um Fakten für postgres group zu erhalten und für postgres_access haben Sie bereits eine Aufgabe geschrieben.

- hosts: postgres_access 
    tasks: 
    - name: Gathering info 
    action: setup 

- hosts: postgres 
    gather_facts: true 
    roles: 
    - postgres 
    ignore_errors: true 
Verwandte Themen