Может ли ansible создать dict, используя общие значения из списка и dict?

По сути, модуль vmware_guest_info предоставит нам список тегов на виртуальной машине, но не будет включать никакой информации об этих тегах:

"tags": [
"10.16.3",
"dicky",
"develop"
],

Модуль vmware_tag_info дает нам dict insidefo для этих тегов, включая описание и идентификатор, но НЕ имя тега:

"10.16.3": {
"tag_category_id": "urn: vmomi: InventoryServiceCategory: 6eb9d643-8fa3-42a1-8b50-78a1c6e99867: GLOBAL",
"tag_description": "10.16.3",
"tag_id": "urn: vmomi: InventoryServiceTag: ca46ab80-be91-4c3a-8f9f-019d163dd954: GLOBAL",
"tag_used_by": []
},

Модуль vmware_category_info дает нам список, который включает идентификатор и имя тега.

"tag_category_info": [
{
"category_associable_types": [],
"category_cardinality": "SINGLE",
"category_description": "nodeVersion",
"category_id": "urn : vmomi: InventoryServiceCategory: 6eb9d643-8fa3-42a1-8b50-78a1c6e99867: GLOBAL ",
" category_name ":" nodeVersion ",
" category_used_by ": []
},
]

Кажется, мне нужно объединить вывод трех разных списков, чтобы получить значение тега, имя тега и идентификатор тега.

Очень надеюсь, что кто-то это уже сделал. Если нет, может ли кто-нибудь пролить свет на то, как перебирать вывод vmware_tag_info и vmware_category_info и определять, когда tag_category_id соответствует category_id?


person Mike A    schedule 19.02.2020    source источник


Ответы (1)


Как насчет этого?

---
- name: Example playbook
  hosts: localhost
  gather_facts: no
  vars:
    vcenter_hostname: change me
    vcenter_username: [email protected]
    vcenter_password: change me
    dc1: change me
    vm_name: change me
  tasks:
    - name: Gather tags information
      vmware_tag_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
      register: tags_info_result

    - name: Gather tags category information
      vmware_category_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
      register: tags_category_info_result

    - name: Set tags_information variable
      set_fact:
        tags_information: >-
          {{ tags_information | default({})
            | combine({
                item.key: tags_category_info_result.tag_category_info
                | selectattr('category_id', '==', item.value.tag_category_id)
                | list
                | first
                | combine(item.value)
                | combine({'tag_name': item.key})
                })
          }}
      with_dict: "{{ tags_info_result.tag_facts }}"

    - name: Gather VM information
      vmware_guest_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: no
        datacenter: "{{ dc1 }}"
        name: "{{ vm_name }}"
        tags: true
      register: vm_info_result

    - name: Display VM tags information
      debug:
        msg:
          - "tags information about {{ vm_name }}"
          - "{{ tags_information[item] }}"
      loop: "{{ vm_info_result.instance.tags }}"
      when:
        - "'tags' in vm_info_result.instance"
person sky_jokerxx    schedule 27.09.2020
comment
Задача сбора информации о виртуальной машине завершилась ошибкой с сообщением: Сбор информации завершился неудачно, исключение: Ожидается экземпляр VapiStruct или словарь Python, но получен str Я бегу: ansible 2.10.1 python 3.8.5 pyvmomi 7.0 vSphere-Automation-SDK 1.32.0 - person Mike A; 02.10.2020
comment
Ошибка была известной ошибкой. Ошибка уже исправлена, можете ли вы снова попробовать следующий исправленный модуль? github.com/ansible-collections/community.vmware/pull/406 - person sky_jokerxx; 04.10.2020