求助:用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
相关产品推荐
相关产品推荐

