You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多标签条件筛选并重启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

脚本写完并测试通过后,就可以设置自动调度了:

  1. 登录Azure门户,进入你的Automation账户。
  2. 在左侧菜单找到Runbooks,选中你创建的Runbook。
  3. 点击顶部的调度,选择添加调度。
  4. 根据需求设置调度规则(比如每天凌晨2点执行),保存即可。
注意事项
  • 大小写敏感:Azure标签的键和值都是大小写敏感的,一定要确保脚本中的值和VM上的标签完全一致。
  • 权限排查:如果Runbook执行失败,先检查运行方式账户的权限是否覆盖了所有需要操作的VM所在的资源组。
  • 日志查看:可以在Runbook的作业页面查看每一次执行的详细日志,方便排查问题。

内容的提问来源于stack exchange,提问作者Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:37