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

如何在Azure CLI的az vm extension命令中使用动态变量

如何在Azure CLI的CustomScript扩展命令中正确使用动态变量?

你遇到的部署失败问题,根源在于Bash变量替换规则和JSON格式要求没匹配上,咱们先拆解问题,再给出解决方案:

问题原因分析

你原来的命令用单引号包裹了--protected-settings的JSON内容,但Bash不会解析单引号内部的变量,所以$SCRIPT_LOCATION、$SCRIPT_NAME这些变量根本没被替换成实际值,直接作为字符串传给了Azure CLI。另外,就算变量被替换,[$SCRIPT_LOCATION]里的URL也没有用双引号包裹,不符合JSON数组的格式要求(JSON字符串必须用双引号),这就导致了JSON验证失败的报错。

正确的解决方法

这里提供两种可行的方式,你可以根据自己的习惯选择:

方法一:转义JSON内部引号,用双引号包裹整个参数

把--protected-settings的内容用双引号包裹,同时对JSON内部的双引号用反斜杠\转义,这样Bash会解析内部的变量,同时保证JSON格式正确:

az vm extension set --resource-group rg1 --vm-name test --name CustomScript --publisher Microsoft.Azure.Extensions --version 2.0 --protected-settings "{\"fileUris\": [\"$SCRIPT_LOCATION\"], \"commandToExecute\": \"bash $SCRIPT_NAME $PARAM1 $PARAM2 $PARAM3\"}"

方法二:先构建JSON变量,再传入命令

如果JSON内容比较复杂,转义引号容易出错,可以先通过Here Document构建完整的JSON字符串变量,再传给Azure CLI,这样可读性更好:

# 先定义变量(你的原有变量定义不变)
SCRIPT_LOCATION="https://test.blob.core.windows.net/testcontainer/test.sh?st=2018-05-28T19%3A56%3A00Z&se=2018-05-30T19%3A56%3A00Z&sp=r&sv=2017-04-17&sr=b&sig=LsAmSVWmggcBYXs7XwUhdA16HfSChi6%2FvH0vqjZMS%2F1YM%3D"
SCRIPT_NAME="test.sh"
PARAM1="test1"
PARAM2="test2"
PARAM3="test3"

# 构建JSON配置字符串
PROTECTED_SETTINGS=$(cat <<EOF
{"fileUris": ["$SCRIPT_LOCATION"], "commandToExecute": "bash $SCRIPT_NAME $PARAM1 $PARAM2 $PARAM3"}
EOF
)

# 执行Azure CLI命令
az vm extension set --resource-group rg1 --vm-name test --name CustomScript --publisher Microsoft.Azure.Extensions --version 2.0 --protected-settings "$PROTECTED_SETTINGS"

验证小技巧

执行命令前,可以先打印一下PROTECTED_SETTINGS变量,确认生成的JSON格式是否正确:

echo "$PROTECTED_SETTINGS"

输出应该是一个符合JSON规范的字符串,这样就能避免大部分格式问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:07