如何将ARM模板参数动态传递给CustomScriptExtension脚本参数
解决方案
你当前已经定义的ARM参数文件不需要做任何修改,保持现有的proxyinfos数组结构即可,只需要调整ARM模板的自定义脚本扩展配置和PowerShell脚本的参数接收逻辑即可:
步骤1:调整ARM模板的自定义脚本扩展参数传递
在ARM模板的CustomScriptExtension资源配置中,通过ARM内置的string()函数将proxyinfos数组序列化为JSON字符串,通过命令行参数传递给PowerShell脚本,示例配置如下:
{ "type": "Microsoft.Compute/virtualMachines/extensions", "apiVersion": "2023-03-01", "name": "[concat(variables('vmName'),'/CustomScriptExtension')]", "location": "[resourceGroup().location]", "properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.10", "autoUpgradeMinorVersion": true, "settings": { "fileUris": [ "[uri(parameters('_artifactsLocation'), concat('configure-proxy.ps1', parameters('_artifactsLocationSasToken')))]" ], // 核心逻辑:将proxyinfos数组转为JSON字符串传入脚本 "commandToExecute": "[concat('powershell.exe -ExecutionPolicy Unrestricted -File configure-proxy.ps1 -proxyInfosJson ', string(parameters('proxyinfos')))]" } } }
如果参数包含敏感信息,可将commandToExecute放在protectedSettings节点下。
步骤2:修改PowerShell脚本适配参数
在脚本开头添加JSON参数接收逻辑,将传入的JSON字符串转换为你需要的哈希表数组即可,原有业务逻辑不需要修改:
param( [string]$proxyInfosJson ) # 将JSON字符串转为哈希表数组 $proxyinfos = ($proxyInfosJson | ConvertFrom-Json) | ForEach-Object { $hashTable = @{} $_.PSObject.Properties | ForEach-Object { $hashTable[$_.Name] = $_.Value } $hashTable } # 以下保留你原有的业务逻辑即可 function set-proxy { param( [parameter(ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, HelpMessage = "proxy informations")] [hashtable[]]$proxyinfos ) foreach ($proxyinfo in $proxyinfos){ netsh interface portproxy add v4tov4 listenaddress=$($proxyinfo.listenaddress) ` listenport=$($proxyinfo.listenport) connectaddress=$($proxyinfo.connectaddress) connectport=$($proxyinfo.connectport) } } function set-firewall { param( [parameter(ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, HelpMessage = "proxy informations")] [hashtable[]]$proxyinfos ) foreach ($proxyinfo in $proxyinfos){ New-NetFirewallRule -DisplayName $($proxyinfo.firewallrulename) -Direction $($proxyinfo.direction) ` -LocalPort $($proxyinfo.listenport) -Protocol $($proxyinfo.protocol) -Action $($proxyinfo.action) } } set-proxy $proxyinfos set-firewall $proxyinfos
内容的提问来源于stack exchange,提问作者Roger Chen
相关产品推荐
相关产品推荐

