2016-10-17 1 views
-1

Es gibt 3 Hosts in meinem Spiel.Ansible zielspezifischen Host (nicht delegate_to)

[Maschinen]

  • MachineA
  • RechnerB
  • MachineC

MongoDB auf diesen Servern läuft. Und einer dieser Server kann eine MasterDB von Mongo sein.

So kann jede dieser Maschinen ein "Master" sein. Dies wird erreicht, indem die Tatsache bestimmt, ob die Maschine Master ist, in diesem Beispiel nur MachineA ausgerichtet ist:

- name: check if master 
    shell: 'shell command to check if master' 
    set_fact: MasterHost="machineA" 
    when: 'shell command to check if master'.stdout == "true" 

Dies gilt auch für RechnerB und MachineC erfolgt.

Mission zu erreichen: Befehle nur auf dem Master-Rechner ausführen, der die Tatsache "MasterHost" hat. Ich versuchte, das delegate_to Modul, aber delegate_to verwendet auch die beiden anderen Maschinen:

- name: some task 
    copy: src=/tmp/test.txt dest=/tmp/test.txt 
    delegate_to: "{{ MasterHost }}" 

Ich möchte den Meister es in meinem Textbuch zum Ziel und nur Befehle auf dem Master, nicht in der Schale über die --limit laufen Möglichkeit.

+0

'shell' und' set_fact' sind Module, daher enthält Ihre erste Aufgabe einen Syntaxfehler. Ihr zweiter Aufgabenzweck ist völlig unklar. Es scheint, als ob Sie nicht mehr als 'when: master.stdout ==" true "brauchen, aber wenn Sie nicht angeben, was Sie wollen, ist es ein Ratespiel. – techraf

+0

Es war ein grundlegendes Beispiel, Syntaxfehler beiseite. Ich möchte Befehle auf dem MasterHost ausführen und die anderen Hosts in der Wiedergabe ausschließen. – Kevin

Antwort

0

den Befehl ausführen, ob der Host der Master ist oder nicht nicht teuer ist zu prüfen Angenommen, Sie ohne Einstellung eine bestimmte Tatsache gehen kann:

- name: check if master 
    shell: 'shell command to check if master' 
    register: master_check 

- name: some task 
    copy: src=/tmp/test.txt dest=/tmp/test.txt 
    when: master_check.stdout == "true" 

Führen Sie das Spiel auf allen Hosts und nur derjenige, der ist Der Master wird some task ausführen.

+0

Danke für eine Antwort. – Kevin

+0

... Noch gewöhnungsbedürftig Stackoverflow und wie Sie richtig kommentieren, oder sogar bearbeiten. Wie auch immer, für mich funktionierte es auch, 'code'run_once zu verwenden: true – Kevin

+1

@Kevin' run_once' mit 'delegate_to' ist der falsche Weg. Verwenden Sie den Rat von @demienfrancois. –

0

Schließlich war dies meine Antwort. Sorry für den ersten Beitrag, der immer noch lernt, wie man einen guten Beitrag macht. Hihi

- name: Check which host is master 
    shell: mongo --quiet --eval 'db.isMaster().ismaster' 
    register: mongoMaster 

    - name: Set fact for mongoMasterr 
    set_fact: MongoMasterHost="{{ item }}" 
    with_items: "{{ groups['HOSTS'] }}" 
    when: mongoMaster.stdout == "true" 

    - name: Copy local backup.tgz to master /var/lib/mongodb/backup 
    copy: src=/tmp/backup.tgz dest=/var/lib/backup/backup.tgz 
    when: mongoMaster.stdout == "true" 

Danke für die Hilfe und wies mich in die richtige Richtung.