Ansible
Ansible - 無法列印自定義事實的值
這是與 vmware 對話的角色的劇本部分。
我正在嘗試設置一個接收虛擬機名稱的自定義事實**(target_vm) 。**
但是當我使用調試模組列印它的值時,它似乎是空的。
它表明set_fact設置正確,因為調試輸出顯示**{“ansible_facts”: {“target_vm”: “TESTVM”}**。
我還做了一個 Fail 任務,它顯示是否設置了 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
你有
delegate_facts: True
任務set_fact
,所以你正在為 localhost 設置變數。然後,您嘗試在未設置它的播放主機的上下文中訪問它。您必須決定要設置它的位置。如果 localhost 正確,則需要通過 hostvars (
hostvars['localhost']['testvm']
) 訪問;如果不是,則需要刪除delegate_facts
.