Как искать имена виртуальных машин, используя только их часть в Ansible VMware?

#ansible #yaml #vmware

#ansible #yaml #vmware

Вопрос:

Я пытаюсь выполнить поиск виртуальной машины в VMware, используя плагины ansible vmware_vm_info , например, для последующего выполнения снимков. Кажется, что vm_name это чувствительный к регистру параметр во всех плагинах VMware, использующих ansible.

Я безуспешно пытался отправить подстановочные знаки внутри строковой переменной. У кого-нибудь есть идея, как это сделать?

Комментарии:

1. Лучше всего, если вы дадите нам достаточно актуальный пример структуры данных vmware_vm_info , созданных (например, в вашем вопросе, что дает debug`для данных), тогда у нас больше шансов помочь вам здесь.

Ответ №1:

Из того, что я вижу в документации модуля, результат будет выглядеть следующим образом:

 [
   {
      "attributes":{
         "job":"backup-prepare"
      },
      "cluster":"None",
      "datacenter":"Datacenter-1",
      "esxi_hostname":"10.76.33.226",
      "folder":"/Datacenter-1/vm",
      "guest_fullname":"Ubuntu Linux (64-bit)",
      "guest_name":"ubuntu_t",
      "ip_address":"",
      "mac_address":[
         "00:50:56:87:a5:9a"
      ],
      "moid":"vm-24",
      "power_state":"poweredOff",
      "tags":[
         {
            "category_id":"urn:vmomi:InventoryServiceCategory:b316cc45-f1a9-4277-811d-56c7e7975203:GLOBAL",
            "category_name":"cat_0001",
            "description":"",
            "id":"urn:vmomi:InventoryServiceTag:43737ec0-b832-4abf-abb1-fd2448ce3b26:GLOBAL",
            "name":"tag_0001"
         }
      ],
      "uuid":"4207072c-edd8-3bd5-64dc-903fd3a0db04",
      "vm_network":{
         "00:50:56:87:a5:9a":{
            "ipv4":[
               "10.76.33.228"
            ],
            "ipv6":[
               
            ]
         }
      }
   }
]
 
* Источник: https://docs.ansible.com/ansible/2.9/modules/vmware_vm_info_module.html#return-values*

Поскольку я здесь ничего не вижу vm_name , я предполагаю, что вы имели в виду guest_name , но идея, лежащая в основе этого сборника, будет применима к любому атрибуту, который вы сочтете подходящим.

Что вы можете сделать, чтобы извлечь значения из списка словарей в виде простого списка, это использовать фильтр Jinja map .

Вот примерный сборник задач, основанный на данных, документированных для этого модуля, где я добавил вторую поддельную виртуальную машину, чтобы продемонстрировать результат с более чем одним элементом в списке:

 - hosts: localhost
  gather_facts: no
      
  tasks:
    - debug:
        msg: "{{ virtual_machines | map(attribute='guest_name') | list }}"
      vars:
        virtual_machines: [
          {
              "attributes":{
                "job":"backup-prepare"
              },
              "cluster":"None",
              "datacenter":"Datacenter-1",
              "esxi_hostname":"10.76.33.226",
              "folder":"/Datacenter-1/vm",
              "guest_fullname":"Ubuntu Linux (64-bit)",
              "guest_name":"ubuntu_t",
              "ip_address":"",
              "mac_address":[
                "00:50:56:87:a5:9a"
              ],
              "moid":"vm-24",
              "power_state":"poweredOff",
              "tags":[
                {
                    "category_id":"urn:vmomi:InventoryServiceCategory:b316cc45-f1a9-4277-811d-56c7e7975203:GLOBAL",
                    "category_name":"cat_0001",
                    "description":"",
                    "id":"urn:vmomi:InventoryServiceTag:43737ec0-b832-4abf-abb1-fd2448ce3b26:GLOBAL",
                    "name":"tag_0001"
                }
              ],
              "uuid":"4207072c-edd8-3bd5-64dc-903fd3a0db04",
              "vm_network":{
                "00:50:56:87:a5:9a":{
                    "ipv4":[
                      "10.76.33.228"
                    ],
                    "ipv6":[
                      
                    ]
                }
              }
          },
          {
              "attributes":{
                "job":"backup-prepare"
              },
              "cluster":"None",
              "datacenter":"Datacenter-1",
              "esxi_hostname":"10.76.33.226",
              "folder":"/Datacenter-1/vm",
              "guest_fullname":"Ubuntu Linux (64-bit)",
              "guest_name":"ubuntu_t_2",
              "ip_address":"",
              "mac_address":[
                "00:50:56:87:a5:9a"
              ],
              "moid":"vm-24",
              "power_state":"poweredOff",
              "tags":[
                {
                    "category_id":"urn:vmomi:InventoryServiceCategory:b316cc45-f1a9-4277-811d-56c7e7975203:GLOBAL",
                    "category_name":"cat_0001",
                    "description":"",
                    "id":"urn:vmomi:InventoryServiceTag:43737ec0-b832-4abf-abb1-fd2448ce3b26:GLOBAL",
                    "name":"tag_0001"
                }
              ],
              "uuid":"4207072c-edd8-3bd5-64dc-903fd3a0db04",
              "vm_network":{
                "00:50:56:87:a5:9a":{
                    "ipv4":[
                      "10.76.33.228"
                    ],
                    "ipv6":[
                      
                    ]
                }
              }
          }
        ]
 

И вот краткое изложение этого:

 PLAY [localhost] **************************************************************************************************

TASK [debug] ******************************************************************************************************
ok: [localhost] => {
    "msg": [
        "ubuntu_t",
        "ubuntu_t_2"
    ]
}

PLAY RECAP ********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0