使用Ansible的vmware_vm_facts模块如何筛选信息

98次阅读
没有评论

问题描述

在使用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_nameinventory_hostname匹配时才输出信息。这有助于确保我们只处理与当前主机名相关的facts。

请注意,代码中的inventory_hostname是Ansible中的一个预定义变量,表示当前执行操作的主机名。根据您的实际情况,您可能需要适当调整这个条件。

修复后的代码应该能够正确地从facts中提取uuid等信息,并在输出时避免出现错误。

结束语

通过使用with_items循环以及适当的条件判断,您应该能够从Ansible的vmware_vm_facts模块返回的信息中提取所需的uuid等信息,并且在输出时避免出现错误。请根据您的实际情况调整代码中的变量和条件,以适配您的环境。

在实际应用中,修复后的代码应该能够正确地提取和展示所需的信息,帮助您更有效地管理和操作虚拟机。

正文完