0

我目前正在自动化 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)

所以我想知道是否有更有效的方法来做到这一点。也许拥有应该删除的资源组名称列表并为这些操作创建线程?只是猜测,寻求一些建议。

提前谢谢了!如果我的问题不够清楚,请告诉我。

4

1 回答 1

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 以防发生任何事情。

(我在 Python SDK 团队的 MS 工作)

于 2019-07-30T20:36:35.983 回答