Azure ADO Runbook脚本如何按LAB/PRD环境动态传入订阅参数?
解决方案:Azure Runbook脚本动态适配LAB/PRD环境批量处理订阅
1. 优化脚本参数设计
将原有的单个订阅参数改为环境标识参数,通过ValidateSet强制仅允许传入LAB或PRD,避免无效输入。同时保留可选的手动订阅列表参数,方便临时调试。
修改后的参数部分:
Param( [Parameter(Mandatory=$true)] [ValidateSet('LAB','PRD')] [string]$Environment, # 可选:手动传入订阅ID列表,覆盖环境默认配置 [string[]]$SubscriptionIds = $null ) # 用托管身份连接Azure Connect-AzAccount -Identity
2. 实现环境与订阅的关联映射
提供两种灵活方案,按需选择:
方案A:硬编码订阅映射(简单直接,适合订阅固定场景)
在脚本中直接定义LAB/PRD对应的订阅ID列表,无需额外依赖:
# 定义环境-订阅ID映射表 $envSubscriptions = @{ 'LAB' = @('lab-sub-id-1', 'lab-sub-id-2') 'PRD' = @('prd-sub-id-1', 'prd-sub-id-2') } # 若未手动传入订阅ID,自动加载对应环境的列表 if (-not $SubscriptionIds) { $SubscriptionIds = $envSubscriptions[$Environment] }
方案B:使用Azure自动化变量组(动态可配置,无需修改脚本)
适合需要频繁调整订阅列表的场景:
- 在Azure自动化账户中创建变量组(如
EnvSubscriptions) - 添加两个变量:
LAB_Subscriptions:值为JSON数组格式,例如["lab-sub-id-1","lab-sub-id-2"]PRD_Subscriptions:值为["prd-sub-id-1","prd-sub-id-2"]
- 脚本中读取变量组内容:
# 读取对应环境的订阅ID列表(替换为你的资源组和自动化账户名) $subsJson = Get-AzAutomationVariable -ResourceGroupName "your-rg-name" -AutomationAccountName "your-automation-account" -Name "$($Environment)_Subscriptions" | Select-Object -ExpandProperty Value $SubscriptionIds = ConvertFrom-Json -InputObject $subsJson
3. 批量处理多个订阅
通过循环切换订阅上下文,批量执行清理逻辑:
# 遍历所有目标订阅 foreach ($subId in $SubscriptionIds) { # 切换到当前订阅 Set-AzContext -SubscriptionId $subId | Out-Null Write-Output "正在处理订阅:$subId" # 此处插入你的存储账户清理逻辑,示例: # $unusedAccounts = Get-AzStorageAccount | Where-Object { /* 未使用判断条件,如最后访问时间超过30天 */ } # foreach ($sa in $unusedAccounts) { # Remove-AzStorageAccount -ResourceGroupName $sa.ResourceGroupName -Name $sa.StorageAccountName -Force # } }
4. 配置执行计划
在Azure自动化账户中创建两个独立计划,分别关联脚本并传入对应环境参数:
- LAB计划:设置执行频率(如每周日),关联Runbook时指定参数
-Environment LAB - PRD计划:设置执行频率(如每月最后一天),关联Runbook时指定参数
-Environment PRD
关于JSON参数文件的说明
如果确实需要用外部JSON文件存储配置,可以将文件上传至Azure存储账户,脚本中读取解析:
// env-subscriptions.json 内容 { "LAB": ["lab-sub-id-1", "lab-sub-id-2"], "PRD": ["prd-sub-id-1", "prd-sub-id-2"] }
脚本读取逻辑:
# 从自动化存储账户读取配置文件(替换为你的存储账户和容器名) $storageContext = New-AzStorageContext -StorageAccountName "your-automation-storage" -UseConnectedAccount Get-AzStorageBlobContent -Container "scripts" -Blob "env-subscriptions.json" -Context $storageContext -Destination "$env:TEMP\config.json" -Force $envConfig = Get-Content "$env:TEMP\config.json" | ConvertFrom-Json $SubscriptionIds = $envConfig.$Environment
但这种方式不如变量组便捷,变量组支持直接在Azure门户修改配置,无需操作存储资源。
内容的提问来源于stack exchange,提问作者Lautaro Iriazabal
相关产品推荐
相关产品推荐

