如何基于多标签条件筛选并重启Azure虚拟机?
当然可行!这种基于多标签组合条件的VM重启逻辑完全可以通过Azure Automation Runbook实现,下面我给你一步步拆解方案,包含PowerShell和Python两种常用的Runbook脚本示例,你可以根据自己的偏好选择。
核心实现思路
我们的目标是:遍历指定订阅内的所有虚拟机,仅当虚拟机同时存在Tag1=True和Tag2=True两个标签时才执行重启;只要任一标签缺失、或者标签值不为True,就跳过该虚拟机。
前提准备
在动手写脚本之前,先确认两件事:
- 你的Azure Automation账户已经配置了运行方式账户(Run As Account),用来授权Runbook访问Azure资源。
- 运行方式账户拥有足够的权限:至少需要
Virtual Machine Contributor角色,能读取VM标签信息并执行重启操作。
PowerShell Runbook 示例
这是最常用的方案,脚本逻辑清晰,适合熟悉PowerShell的用户:
# 使用运行方式账户连接到Azure Connect-AzAccount -Identity | Out-Null # 定义需要验证的标签键和目标值(可根据实际需求修改) $requiredTags = @{ "Tag1" = "True" "Tag2" = "True" } # 获取当前订阅下的所有虚拟机 $vms = Get-AzVM foreach ($vm in $vms) { $vmTags = $vm.Tags $meetsAllConditions = $true # 逐一检查每个必填标签 foreach ($tagKey in $requiredTags.Keys) { # 如果标签不存在,或者值不匹配,标记为不符合条件 if (-not $vmTags.ContainsKey($tagKey) -or $vmTags[$tagKey] -ne $requiredTags[$tagKey]) { $meetsAllConditions = $false Write-Output "虚拟机 [$($vm.Name)] 不符合条件:缺少标签 [$tagKey] 或标签值不匹配" break } } # 所有条件都满足时,执行重启 if ($meetsAllConditions) { Write-Output "正在重启虚拟机 [$($vm.Name)]..." Restart-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force Write-Output "虚拟机 [$($vm.Name)] 重启操作已成功触发" } }
脚本关键点说明
Connect-AzAccount -Identity:通过运行方式账户的托管身份完成Azure认证,无需手动输入凭据。$requiredTags:可以直接修改这里的标签键和值,适配你的实际需求(比如改成Environment=Production和AutoRestart=Yes)。- 标签检查逻辑:先判断标签是否存在,再验证值是否完全匹配(Azure标签是大小写敏感的,注意
True和true会被视为不同值)。
Python Runbook 示例
如果你更习惯用Python,这个脚本同样可以实现需求:
import azure.mgmt.compute as compute from azure.identity import ManagedIdentityCredential # 替换为你的Azure订阅ID SUBSCRIPTION_ID = "your-subscription-id-here" # 定义需要验证的标签 required_tags = { "Tag1": "True", "Tag2": "True" } # 初始化认证和Compute管理客户端 credential = ManagedIdentityCredential() compute_client = compute.ComputeManagementClient(credential, SUBSCRIPTION_ID) # 获取订阅内所有虚拟机 vms = compute_client.virtual_machines.list_all() for vm in vms: # 如果VM没有标签,默认转为空字典 vm_tags = vm.tags or {} meets_conditions = True # 检查每个标签条件 for tag_key, expected_value in required_tags.items(): if tag_key not in vm_tags or vm_tags[tag_key] != expected_value: meets_conditions = False print(f"虚拟机 [{vm.name}] 不符合条件:缺少标签 [{tag_key}] 或标签值不匹配") break # 执行重启操作 if meets_conditions: print(f"正在重启虚拟机 [{vm.name}]...") # 从VM的ID中提取资源组名称(list_all返回的对象没有直接的resource_group_name属性) resource_group = vm.id.split('/')[4] compute_client.virtual_machines.begin_restart( resource_group_name=resource_group, vm_name=vm.name ) print(f"虚拟机 [{vm.name}] 重启操作已成功触发")
脚本关键点说明
- 记得替换
SUBSCRIPTION_ID为你的实际订阅ID。 ManagedIdentityCredential:同样使用运行方式账户的托管身份完成认证。vm.id.split('/')[4]:通过解析VM的资源ID来获取资源组名称,这是Python SDK中获取资源组的常用方法。
调度Runbook
脚本写完并测试通过后,就可以设置自动调度了:
- 登录Azure门户,进入你的Automation账户。
- 在左侧菜单找到Runbooks,选中你创建的Runbook。
- 点击顶部的调度,选择添加调度。
- 根据需求设置调度规则(比如每天凌晨2点执行),保存即可。
注意事项
- 大小写敏感:Azure标签的键和值都是大小写敏感的,一定要确保脚本中的值和VM上的标签完全一致。
- 权限排查:如果Runbook执行失败,先检查运行方式账户的权限是否覆盖了所有需要操作的VM所在的资源组。
- 日志查看:可以在Runbook的作业页面查看每一次执行的详细日志,方便排查问题。
内容的提问来源于stack exchange,提问作者Taylor
相关产品推荐
相关产品推荐

