2017-12-05 3 views
-1

Ich habe zwei Playbooks - mein erstes Playbook iteriert auf der Liste der ESXi-Server, ruft eine Liste aller VMs ab und übergibt diese Liste an das zweite Playbook, das iteriert werden soll die IPs der VMs. Stattdessen versucht es immer noch, auf dem letzten ESXi-Server ausgeführt zu werden. Ich muss den Host auf die VM IP umschalten, die ich gerade an das zweite Playbook übergebe. Ich weiß nicht wie ich umschalten soll ... Irgendjemand?So wechseln Sie das Ansible-Playbook auf einen anderen Host, wenn Sie das zweite Playbook aufrufen

Erstes Textbuch:

- name: get VM list from ESXi 
    hosts: all 

    tasks: 
    - name: get facts 
    vmware_vm_facts: 
     hostname: "{{ inventory_hostname }}" 
     username: "{{ ansible_ssh_user }}" 
     password: "{{ ansible_ssh_pass }}" 
    delegate_to: localhost 
    register: esx_facts 

    - name: Debugging data 
    debug: 
     msg: "IP of {{ item.key }} is {{ item.value.ip_address }} and is {{ item.value.power_state }}" 
    with_dict: "{{ esx_facts.virtual_machines }}" 

    - name: Passing data to include file 
    include: includeFile.yml ip_address="{{ item.value.ip_address }}" 
    with_dict: "{{ esx_facts.virtual_machines }}" 

Mein zweites Textbuch:

- name: <<Check the IP received 
    debug: 
    msg: "Received IP: {{ ip_address }}" 

- name: <<Get custom facts 
    vmware_vm_facts: 
    hostname: "{{ ip_address }}" 
    username: root 
    password: passw 
    validate_certs: False 
    delegate_to: localhost 
    register: custom_facts 

erhalte ich tun, um die ip-adresse der richtige VM aber vmware_vm_facts immer noch versucht, auf dem ESXi-Server anstatt zu laufen ...

+0

Für den Anfang verwenden Sie bitte die richtigen Bedingungen: Sie haben ein Playbook mit einem Spiel und enthalten eine Aufgaben-Datei. Sie behaupten also, Sie delegieren die Aufgabe an localhost, aber sie wird woanders ausgeführt? Wenn ja, könnten Sie 80% des von Ihnen geposteten Codes abschneiden und das gleiche Ergebnis erzielen. – techraf

+0

Außerdem wird die Task "<< Benutzerdefinierte Daten abrufen" mehrmals für alle Ziele im Inventar ausgeführt, aber das ist nicht der Ort, an dem sie ausgeführt wird. Sie könnten verwirrt sein, wenn Sie das Protokoll falsch lesen. – techraf

+0

Und natürlich scheint die ganze Idee, 'vmware_vm_facts' doppelt zu verwenden, ziemlich seltsam. – techraf

Antwort

0

Wenn Sie es sich nicht leisten können, dynamisches Inventar für VMs einzurichten, sollte Ihr Playbook zwei Spiele haben: einen für das Sammeln von VMs und einen anderen für Aufgaben auf diesen VMs, wie diesen (Pseudocode):

--- 
- hosts: hypervisors 
    gather_facts: no 
    connection: local 
    tasks: 
    - vmware_vm_facts: 
     ... params_here ... 
     register: vmfacts 
    - add_host: 
     name: "{{ item.key }}" 
     ansible_host: "{{ item.value.ip_address }}" 
     group: myvms 
     with_dict: "{{ vmfacts.virtual_machines }}" 

- hosts: myvms 
    tasks: 
    - apt: 
     name: "*" 
     state: latest 

Im ersten Spiel sammeln wir Fakten von jedem Hypervisor und myvms Gruppe von inmemory Inventar füllen. Innerhalb des zweiten Spiels führen wir apt Modul für jeden Host in myvms Gruppe.

+0

Danke, Konstantin! Ich musste auch ansible_ssh_user hinzufügen und übergeben, b/c Benutzer wurde als "NONE" angezeigt – larrybg

Verwandte Themen