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

求助:用Bash脚本在多Azure环境创建用户托管标识并分配权限

解决方案:跨多Azure环境创建用户托管标识并分配资源权限

脚本核心思路

用数组存储所有环境的配置信息(环境名、租户ID、资源组等),通过循环遍历每个环境,依次完成:切换Azure租户、创建(或复用)用户托管标识、将标识关联到App Service、为标识分配Key Vault/Service Bus/Event Hub的访问权限。脚本加入条件判断,避免重复操作导致报错。

完整Bash脚本示例

#!/bin/bash

# 定义环境配置:环境名、租户ID、资源组名、托管标识名、各资源名称
# 请根据实际情况替换资源组、资源名称等信息
environments=(
    "Test 7a610d29-a29a-4833-b40c-27b6120c3c57 rg-test my-managed-identity kv-test app-test sb-test eh-test"
    "Dev b6fc9b56-eb3d-4768-92e7-81ac62f8a7d1 rg-dev my-managed-identity kv-dev app-dev sb-dev eh-dev"
    "Stage 88501bf2-52be-46fd-b4d6-61967b489177 rg-stage my-managed-identity kv-stage app-stage sb-stage eh-stage"
)

# 遍历每个环境
for env in "${environments[@]}"; do
    # 解析环境变量
    read -r ENV_NAME TENANT_ID RG_NAME IDENTITY_NAME KV_NAME APP_NAME SB_NAME EH_NAME <<< "$env"
    
    echo "=== 开始处理环境: $ENV_NAME ==="

    # 1. 切换到当前环境的Azure租户
    az account set --tenant "$TENANT_ID"
    if [ $? -ne 0 ]; then
        echo "切换租户 $TENANT_ID 失败,跳过当前环境"
        continue
    fi

    # 2. 检查用户托管标识是否已存在,不存在则创建
    IDENTITY_ID=$(az identity show --name "$IDENTITY_NAME" --resource-group "$RG_NAME" --query id -o tsv 2>/dev/null)
    if [ -z "$IDENTITY_ID" ]; then
        echo "创建用户托管标识: $IDENTITY_NAME"
        IDENTITY_ID=$(az identity create --name "$IDENTITY_NAME" --resource-group "$RG_NAME" --query id -o tsv)
        if [ -z "$IDENTITY_ID" ]; then
            echo "创建标识失败,跳过后续操作"
            continue
        fi
    else
        echo "标识 $IDENTITY_NAME 已存在,复用现有标识"
    fi

    # 3. 将托管标识分配给App Service(配置App Service使用该标识)
    echo "将标识分配给App Service: $APP_NAME"
    az webapp identity assign --name "$APP_NAME" --resource-group "$RG_NAME" --identities "$IDENTITY_ID"
    if [ $? -ne 0 ]; then
        echo "分配标识到App Service失败,继续处理其他资源"
    fi

    # 4. 为标识分配Key Vault访问权限(示例角色:Key Vault Secrets User,可根据需求调整)
    echo "为标识分配Key Vault权限: $KV_NAME"
    az keyvault set-policy --name "$KV_NAME" --resource-group "$RG_NAME" \
        --object-id "$(az identity show --name "$IDENTITY_NAME" --resource-group "$RG_NAME" --query principalId -o tsv)" \
        --secret-permissions get list
    if [ $? -ne 0 ]; then
        echo "分配Key Vault权限失败"
    fi

    # 5. 为标识分配Service Bus访问权限(示例角色:Azure Service Bus Data Sender,可调整)
    echo "为标识分配Service Bus权限: $SB_NAME"
    az role assignment create \
        --role "Azure Service Bus Data Sender" \
        --assignee "$(az identity show --name "$IDENTITY_NAME" --resource-group "$RG_NAME" --query principalId -o tsv)" \
        --scope "$(az servicebus namespace show --name "$SB_NAME" --resource-group "$RG_NAME" --query id -o tsv)"
    if [ $? -ne 0 ]; then
        echo "分配Service Bus权限失败"
    fi

    # 6. 为标识分配Event Hub访问权限(示例角色:Azure Event Hubs Data Sender,可调整)
    echo "为标识分配Event Hub权限: $EH_NAME"
    az role assignment create \
        --role "Azure Event Hubs Data Sender" \
        --assignee "$(az identity show --name "$IDENTITY_NAME" --resource-group "$RG_NAME" --query principalId -o tsv)" \
        --scope "$(az eventhubs namespace show --name "$EH_NAME" --resource-group "$RG_NAME" --query id -o tsv)"
    if [ $? -ne 0 ]; then
        echo "分配Event Hub权限失败"
    fi

    echo "=== 环境 $ENV_NAME 处理完成 ==="
    echo ""
done

echo "所有环境处理完毕"

关键说明

  • 环境配置:脚本开头的environments数组需根据你的实际资源信息替换,比如资源组名、Key Vault/App Service等资源的名称。
  • 条件判断:通过az identity show检查标识是否存在,避免重复创建;通过$?判断命令执行结果,失败时跳过后续操作或给出提示。
  • 角色权限:示例中使用的角色是常见的基础权限,你可以根据实际需求替换为更合适的角色(比如Key Vault Contributor、Azure Service Bus Data Owner等)。
  • 租户切换:脚本通过az account set切换到对应租户,确保操作在正确的环境中执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:42:40