PowerShell遍历JSON提取字段并执行Azure子网委托更新
问题描述与解决方案
需求说明
- 从目标JSON的
vnetArray中提取字段:vNetName、subnetName、SubnetAddressSpace、serviceEndpoints、securityRules、routes - 从目标JSON的
subnetArray中提取字段:vNetName、subnetName、SubnetAddressSpace、serviceEndpoints、securityRules、routes、delegations
无法运行的PowerShell代码
$a = Get-Content '.\json_file.json' | ConvertFrom-Json foreach ($record in $a) { write-host "$($record.vNetArray.vNetName) | $($record.vNetArray.vNetLocation) | $($record.vNetArray.NetworkType) | $($record.vNetArray.vNetAddressSpace)" }
目标JSON数据结构
{ "$Schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "$contentVersion": "1.0.0.0", "parameters": { "vNetArray": { "value": [ { "vNetName": "vnet-test-cus-stg", "vNetLocation": "CentralUS", "NetworkType": "Spoke", "vNetAddressSpace": "10.1.0.0/16", "subnets": [ { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-webapp-cus-stg", "SubnetAddressSpace": "10.1.1.0/25", "serviceEndpoints": [], "securityRules": [], "routes": [] }, { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-agw-cus-stg", "SubnetAddressSpace": "10.1.3.0/25", "serviceEndpoints": [], "securityRules": [], "routes": [] }, { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-sql-cus-stg", "SubnetAddressSpace": "10.1.4.0/25", "serviceEndpoints": [], "securityRules": [], "routes": [] } ] } ] }, "subnetArray": { "value": [ { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-webapp-cus-stg", "SubnetAddressSpace": "10.1.1.0/25", "serviceEndpoints": [], "securityRules": [], "routes": [], "delegations":[ { "name": "Microsoft.Web.serverFarms", "properties": { "serviceName": "Microsoft.Web/serverFarms" } } ], "PSDelegation": "Microsoft.Web/serverFarms" }, { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-agw-cus-stg", "SubnetAddressSpace": "10.1.3.0/25", "serviceEndpoints": [], "securityRules": [], "routes": [], "delegations":[], "PSDelegation": "" }, { "vNetName": "vnet-test-cus-stg", "subnetName": "snet-sql-cus-stg", "SubnetAddressSpace": "10.1.4.0/25", "serviceEndpoints": [ { "service": "Microsoft.sql" } ], "securityRules": [], "routes": [], "delegations":[], "PSDelegation": "Microsoft.Sql/managedInstances" } ] } } }
背景原因
由于Bicep存在限制或潜在Bug,测试出可行的解决方法是通过AZ CLI修改子网,示例命令如下:
az network vnet subnet update \ --resource-group myResourceGroup \ --name mySubnet \ --vnet-name myVNet \ --delegations Microsoft.Sql/managedInstances
完整执行流程
- 编写一个接受资源组作为参数的PowerShell脚本;
- 检查资源组是否存在,存在则继续,不存在则抛出错误;
- 在JSON文件中查找包含
PSDelegation值的数组项,若存在该值,检查对应的vNet是否存在于资源组中; - 若vNet存在,检查子网是否存在,存在则继续,不存在则抛出错误;
- 执行AZ CLI命令编辑子网:
az network vnet subnet update \ --resource-group myResourceGroup \ --name mySubnet \ --vnet-name myVNet \ --delegations Microsoft.Sql/managedInstances
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

