Ansible - 사용자 정의 사실 값을 인쇄할 수 없습니다.

Ansible - 사용자 정의 사실 값을 인쇄할 수 없습니다.


vmware와 대화하는 역할의 플레이북 부분입니다.
맞춤 사실을 설정하려고 합니다.(대상_vm)가상 머신 이름을 수신합니다.
그러나 디버그 모듈의 값을 인쇄하면 비어 있는 것으로 보입니다.
이음새는세트_사실디버그 출력에 표시되므로 올바르게 설정되었습니다.{"ansible_facts": {"target_vm": "TESTVM"}.
또한 target_vm 사실이 설정되었는지 여부를 나타내는 실패 작업도 만들었습니다.

이것이 플레이북이다

- 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 }}"


이것이 출력이다

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

답변1

delegate_facts: True작업을 수행 중이므로 set_factlocalhost에 대한 변수를 설정하고 있습니다. 그런 다음 설정되지 않은 플레이 호스트의 컨텍스트에서 액세스를 시도하고 있습니다.

어디에 설정할지 결정해야 합니다. localhost가 정확하다면, hostvars( hostvars['localhost']['testvm'])를 통해 접근해야 합니다 . 그렇지 않은 경우 제거해야 합니다 delegate_facts.

관련 정보