Ansible – Wert der benutzerdefinierten Tatsache konnte nicht gedruckt werden

Ansible – Wert der benutzerdefinierten Tatsache konnte nicht gedruckt werden


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: Truedie set_factAufgabe 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.

verwandte Informationen