Azure共享映像库:编写Bash条件语句创建不存在的映像定义
在Azure共享映像库中判断并创建不存在的映像定义(Bash实现)
核心思路
你已经通过az sig image-definition list获取了现有映像定义名称,但默认返回的是JSON数组格式,需要先转换成Bash易处理的纯文本列表,再通过精确匹配判断目标名称是否存在,不存在则执行创建命令。
步骤1:可靠获取现有映像定义名称
默认的JSON输出不好直接在Bash中匹配,推荐用Azure CLI的-o tsv参数输出纯文本(无需额外工具),或者用jq解析(适合复杂场景):
方式1:用Azure CLI自带的tsv输出
# 获取现有映像定义名称,每行一个 defs=$(az sig image-definition list --resource-group "$MyRG" --gallery-name "$mySIG" --query "[*].name" -o tsv) # 检查命令执行是否成功 if [ $? -ne 0 ]; then echo "错误:无法获取现有映像定义列表" exit 1 fi
方式2:用jq解析JSON(需提前安装jq)
如果已安装jq,可以用它精确提取名称:
defs=$(az sig image-definition list --resource-group "$MyRG" --gallery-name "$mySIG" | jq -r '.[].name')
步骤2:获取用户输入的目标名称
read -p "请输入要创建的映像定义名称: " target_def_name # 检查输入是否为空 if [ -z "$target_def_name" ]; then echo "错误:映像定义名称不能为空" exit 1 fi
步骤3:判断并创建映像定义
用grep做精确匹配(避免部分名称匹配的误判),如果目标名称不存在则执行创建命令:
# 精确匹配目标名称,-q表示静默输出,只返回状态码 if ! echo "$defs" | grep -q "^$target_def_name$"; then echo "映像定义 '$target_def_name' 不存在,开始创建..." # 替换为你的实际参数:publisher、offer、sku、os-type等 az sig image-definition create \ --resource-group "$MyRG" \ --gallery-name "$mySIG" \ --gallery-image-definition "$target_def_name" \ --publisher "你的发布者名称" \ --offer "你的产品系列名称" \ --sku "你的SKU名称" \ --os-type "Linux" # 若为Windows镜像,改为Windows # 检查创建是否成功 if [ $? -eq 0 ]; then echo "映像定义 '$target_def_name' 创建成功" else echo "错误:创建映像定义失败" exit 1 fi else echo "映像定义 '$target_def_name' 已存在,无需创建" fi
完整脚本示例
把上述步骤整合起来,就是一个可直接使用的脚本:
#!/bin/bash # 定义你的资源组和共享映像库名称 MyRG="你的资源组名称" mySIG="你的共享映像库名称" # 获取现有映像定义名称 defs=$(az sig image-definition list --resource-group "$MyRG" --gallery-name "$mySIG" --query "[*].name" -o tsv) if [ $? -ne 0 ]; then echo "错误:无法获取现有映像定义列表" exit 1 fi # 获取用户输入 read -p "请输入要创建的映像定义名称: " target_def_name if [ -z "$target_def_name" ]; then echo "错误:映像定义名称不能为空" exit 1 fi # 判断并创建 if ! echo "$defs" | grep -q "^$target_def_name$"; then echo "创建映像定义 '$target_def_name'..." az sig image-definition create \ --resource-group "$MyRG" \ --gallery-name "$mySIG" \ --gallery-image-definition "$target_def_name" \ --publisher "MyPublisher" \ --offer "MyOffer" \ --sku "MySKU" \ --os-type "Linux" if [ $? -eq 0 ]; then echo "创建成功" else echo "创建失败" exit 1 fi else echo "映像定义已存在" fi
注意事项
- 替换脚本中的占位参数为你的实际资源信息
- 确保Azure CLI已登录且有足够权限操作共享映像库
内容的提问来源于stack exchange,提问作者TheMilli
相关产品推荐
相关产品推荐

