Лучший способ сделать пакетное удаление списка групп ресурсов

В настоящее время я автоматизирую некоторые операции очистки в Azure, и структура моего кода в основном такова:

  • Огромный цикл for, перебирающий список групп ресурсов, которые следует удалить.
  • Если в какой-либо из этих групп отсутствует определенный мной список обязательных тегов, удалите эту группу ресурсов.

В настоящее время операция удаления так же проста, как:

// Inside the for loop that iterates over a list of resource group names

elif rg.tags.get('delete_at', False):

    if datetime.now() > datetime.strptime(rg.tags['delete_at'], '%Y-%m-%d %H:%M:%S'):
        print('Resource Group: ' + rg.name + ' is going to be deleted')
        try:
            delete_async_op = delete_rg(rg_client, rg.name)
            delete_async_op.wait()
        except CloudError:
            # If any of the delete operation fails, don't block the policy execution over the rest of resource groups
            print("The delete operation for the resource group: '" + rg.name + "' didn't suceed. Details: " + traceback.format_exc())
            continue

Просто для записи, функция delete_rg это просто оболочка, которая выполняет следующую операцию:

rg_client.resource_groups.delete(rg_name)

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

Спасибо заранее! Дайте мне знать, если мой вопрос недостаточно ясен.


person David Barranco    schedule 30.07.2019    source источник


Ответы (1)


Операция удаления на самом деле уже создает поток для вас, и вы присоединяетесь к потоку, когда выполняете "wait()". Я бы посоветовал вам сохранить delete_async_op в списке, запустить их все, а затем подождать.

Что-то типа:

delete_list = []

# your main loop

elif rg.tags.get('delete_at', False):

    if datetime.now() > datetime.strptime(rg.tags['delete_at'], '%Y-%m-%d %H:%M:%S'):
        print('Resource Group: ' + rg.name + ' is going to be deleted')
        try:
            delete_list.append(delete_rg(rg_client, rg.name))
        except CloudError:
            # If any of the delete operation fails, don't block the policy execution over the rest of resource groups
            print("The delete operation for the resource group: '" + rg.name + "' didn't suceed. Details: " + traceback.format_exc())
            continue

# out of main loop

for op in delete_list:
    try:
        op.wait()
    except CloudError:
        print("Unable to confirm deletion")

Первоначальный запрос на удаление выполняется в вашем «если» (поэтому вы хотите поймать CloudError). Опрос с использованием потока выполняется в wait(), но, поскольку есть фактический вызов Azure, вам все равно нужно поймать CloudError, если что-то произойдет.

(я работаю в MS в команде Python SDK)

person Laurent Mazuel    schedule 30.07.2019
comment
Большое спасибо за ответ. Это именно то, что мне было нужно :) - person David Barranco; 31.07.2019