Bicep部署脚本中使用az cli --query获取VMSS名称报错排查
解决Azure部署脚本中
az vmss list --query参数引号解析错误问题 问题原因
Azure部署脚本(如Bicep的deploymentScript资源)的命令解析逻辑与本地PowerShell/WSL终端不同,原命令中的单引号会被误判为参数值的结束符,导致--query的JMESPath表达式被截断,触发invalid jmespath_type value错误。
解决方案
提供三种可行的修复方式,根据你的Bicep脚本写法选择:
1. 使用多行脚本内容(推荐)
通过Bicep的多行字符串(三个单引号包裹)定义脚本内容,内部可直接使用原命令,无需额外转义:
resource getVmssName 'Microsoft.Resources/deploymentScripts@2020-10-01' = { name: 'retrieveVmssName' location: resourceGroup().location kind: 'AzureCLI' properties: { azCliVersion: '2.50.0' scriptContent: ''' targetRg=${rgMcName} vmssName=$(az vmss list --resource-group $targetRg --query "[?contains(name, 'workloadpool')].name" -o tsv) echo "VMSS Name: $vmssName" ''' cleanupPreference: 'OnSuccess' timeout: 'PT5M' } }
2. 转义单行命令中的引号
如果使用commandToExecute单行定义命令,需根据Bicep的字符串规则转义引号:
- 若用单引号包裹命令:内部单引号用两个单引号转义
commandToExecute: 'az vmss list --resource-group ${rgMcName} --query "[?contains(name, '\''workloadpool'\'')].name" -o tsv' - 若用双引号包裹命令:内部双引号用反斜杠转义,同时将JMESPath中的单引号替换为双引号
commandToExecute: "az vmss list --resource-group ${rgMcName} --query '[?contains(name, \"workloadpool\")].name' -o tsv"
3. 调整JMESPath表达式的引号使用
将JMESPath中匹配字符串的单引号改为双引号,外层用单引号包裹整个--query参数,避免引号冲突:
commandToExecute: 'az vmss list --resource-group ${rgMcName} --query \'[?contains(name, "workloadpool")].name\' -o tsv'
内容的提问来源于stack exchange,提问作者DaveVentura
相关产品推荐
相关产品推荐

