
Dies ist ein Playbook-Teil einer Rolle, die mit VMware kommuniziert.
Ich versuche, eine benutzerdefinierte Tatsache festzulegen(Ziel-VM)die den Namen der virtuellen Maschine erhalten.
Aber wenn ich den Wert mit dem Debug-Modul drucke, scheint er leer zu sein.
Es scheint, dass dieset_factist richtig eingestellt, da die Debug-Ausgabe zeigt{"ansible_facts": {"target_vm": "TESTVM"}.
Ich habe auch eine Fail-Aufgabe erstellt, die anzeigt, ob die target_vm-Fakten festgelegt sind oder nicht.
Dies ist das Playbook
- delegate_to: localhost
become: no
delegate_facts: yes
vars:
vc_hostname: 'vcenter.bio.local'
vc_username: 'bio.local\ansible'
vc_password: "{{ v_pass }}"
vm_uuid: '4217200F-46D2-C9FD-E7FD-768D21B327E8' | lower
block:
- name: Gather only registered virtual machines
vmware_vm_info:
hostname: '{{ vc_hostname }}'
username: '{{ vc_username }}'
password: '{{ vc_password }}'
validate_certs: False
vm_type: vm
delegate_to: localhost
register: virtual_info
no_log: true
- name: Get VM name from UUID
set_fact:
target_vm: "{{ my_item.guest_name }}"
loop: "{{ virtual_info.virtual_machines }}"
when: my_item.uuid == vm_uuid
loop_control:
loop_var: my_item
delegate_to: localhost
delegate_facts: True
- name: Verify interface name is set
fail:
msg: "Could not determine target_vm name!"
when: target_vm is not defined
- name: Print Output
debug:
msg: "The VM name is: {{ target_vm }}"
Dies ist die Ausgabe
TASK [vmwaretaks : Get VM name from UUID] ***************************************************************************************
ok: [testvm] => (item={'guest_name': 'TESTVM', 'guest_fullname': 'Red Hat Enterprise Linux 6 (64-bit)', 'power_state': 'poweredOn', 'ip_address': '192.168.54.32', 'mac_address': ['00:32:52:97:e9:c8'], 'uuid': '4217200f-46d2-c9fd-e7fd-768d21b327e8', 'vm_network': {'00:32:52:97:e9:c8': {'ipv4': ['192.168.54.32'], 'ipv6': ['fe80::250:56ff:fe97:d4c3']}}, 'esxi_hostname': 'b3j15esx05.bio.local', 'cluster': 'JAS-Lab-DEP', 'attributes': {}, 'tags': []}) => {"ansible_facts": {"target_vm": "TESTVM"}, "ansible_loop_var": "my_item", "changed": false, "my_item": {"attributes": {}, "cluster": "JAS-Lab-DEP", "esxi_hostname": "b3j15esx05.bio.local", "guest_fullname": "Red Hat Enterprise Linux 6 (64-bit)", "guest_name": "TESTVM", "ip_address": "192.168.54.32", "mac_address": ["00:32:52:97:e9:c8"], "power_state": "poweredOn", "tags": [], "uuid": "4217200f-46d2-c9fd-e7fd-768d21b327e8", "vm_network": {"00:32:52:97:e9:c8": {"ipv4": ["192.168.54.32"], "ipv6": ["fe80::250:56ff:fe97:d4c3"]}}}}
TASK [vmwaretaks : Verify interface name is set] ********************************************************************************
fatal: [testvm]: FAILED! => {"changed": false, "msg": "Could not determine target_vm name!"}
PLAY RECAP **********************************************************************************************************************
testvm : ok=13 changed=0 unreachable=0 failed=1 skipped=2 rescued=0 ignored=0
Antwort1
Sie haben delegate_facts: True
die set_fact
Aufgabe erledigt, also legen Sie die Variable für localhost fest. Anschließend versuchen Sie, im Kontext des Playhosts darauf zuzugreifen, für den sie nicht festgelegt ist.
Sie müssen entscheiden, wo Sie es festlegen möchten. Wenn localhost korrekt ist, müssen Sie über hostvars ( hostvars['localhost']['testvm']
) darauf zugreifen. Wenn nicht, müssen Sie entfernen delegate_facts
.