问题描述
在使用Ansible的vmware_vm_facts模块时,用户想从返回的facts中提取出”uuid”信息。用户在Reddit上找到了一个类似的问题解决方案,但是尝试使用该解决方案时,出现了’ansible.utils.unsafe_proxy.AnsibleUnsafeText object’ has no attribute ‘ip_address’错误。以下是用户的代码示例:
- name: Test vmware_vm_facts
vmware_vm_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
delegate_to: localhost
register: rc
- name: Debug...
debug:
msg: "IP of {{ item.key }} is {{ item.value.ip_address }} and power is {{ item.value.power_state }}"
with_dict: "{{ rc.virtual_machines }}"
用户想知道是否有其他解决方法。感谢您的帮助!
解决方案
请注意以下操作注意版本差异及修改前做好备份。
用户在使用Ansible的vmware_vm_facts模块时遇到了问题,主要涉及到从返回的facts中提取uuid信息,并在输出时遇到错误。这里提供一个修复该问题的解决方案。
使用with_items 进行循环
首先,用户在问题描述中提到,这些facts以列表的方式呈现,每个元素都是一个字典。为了从中提取数据,我们需要使用循环来遍历这个列表,并从每个字典中提取所需信息。
以下是修复后的代码示例:
- name: Test vmware_vm_facts
vmware_vm_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
delegate_to: localhost
register: rc
- name: Debug...
debug:
msg: "IP of {{ item.guest_name }} ({{ item.uuid }}) is {{ item.ip_address }} and power is {{ item.power_state }}"
with_items: "{{ rc.virtual_machines }}"
when: "item.guest_name is search(inventory_hostname)"
在这个修复后的示例中,我们将with_dict
改为了with_items
,因为facts以列表的形式提供。另外,我们使用了一个条件语句when
,仅在item.guest_name
与inventory_hostname
匹配时才输出信息。这有助于确保我们只处理与当前主机名相关的facts。
请注意,代码中的inventory_hostname
是Ansible中的一个预定义变量,表示当前执行操作的主机名。根据您的实际情况,您可能需要适当调整这个条件。
修复后的代码应该能够正确地从facts中提取uuid等信息,并在输出时避免出现错误。
结束语
通过使用with_items
循环以及适当的条件判断,您应该能够从Ansible的vmware_vm_facts模块返回的信息中提取所需的uuid等信息,并且在输出时避免出现错误。请根据您的实际情况调整代码中的变量和条件,以适配您的环境。
在实际应用中,修复后的代码应该能够正确地提取和展示所需的信息,帮助您更有效地管理和操作虚拟机。