你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 PowerShell 定义和分配 Azure 蓝图

重要

2026 年 7 月 11 日,蓝图(预览版)将弃用。 将现有蓝图定义和分配迁移到模板规格部署堆栈。 蓝图项目将转换为 ARM JSON 模板或用于定义部署堆栈的 Bicep 文件。 若要了解如何将项目创作为 ARM 资源,请参阅:

本教程介绍如何使用 Azure 蓝图来执行某些与在组织中创建、发布和分配蓝图相关的常见任务。 此技能可帮助你定义常见的模式,以便基于 Azure 资源管理器 (ARM) 模板、策略和安全性开发可重用且可快速部署的配置。

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个免费帐户
  • 如果尚未安装,请按照添加 Az.Blueprint 模块中的说明安装并验证 PowerShell 库中的 Az.Blueprint 模块。
  • 如果你之前未用过 Azure 蓝图,请通过 Azure PowerShell 使用 Register-AzResourceProvider -ProviderNamespace Microsoft.Blueprint 注册资源提供程序。

Azure Cloud Shell

Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。

若要启动 Azure Cloud Shell,请执行以下操作:

选项 示例/链接
选择代码或命令块右上角的“试用”。 选择“试用”不会自动将代码或命令复制到 Cloud Shell。 显示 Azure Cloud Shell 的“试用”示例的屏幕截图。
转到 https://shell.azure.com 或选择“启动 Cloud Shell”按钮可在浏览器中打开 Cloud Shell。 用于启动 Azure Cloud Shell 的按钮。
选择 Azure 门户右上角菜单栏上的 Cloud Shell 按钮。 显示 Azure 门户中的 Cloud Shell 按钮的屏幕截图

若要使用 Azure Cloud Shell,请执行以下操作:

  1. 启动 Cloud Shell。

  2. 选择代码块(或命令块)上的“复制”按钮以复制代码或命令。

  3. 在 Windows 和 Linux 上选择 Ctrl+Shift+V,或在 macOS 上选择 Cmd+Shift+V 将代码或命令粘贴到 Cloud Shell 会话中。

  4. 选择“Enter”运行代码或命令。

创建蓝图

定义符合性的标准模式的第一步是根据可用资源构建蓝图。 让我们创建一个名为 MyBlueprint 的蓝图,用于配置订阅的角色和策略分配。 然后,在资源组上添加资源组、ARM 模板和角色分配。

注意

使用 PowerShell 时,首先创建 blueprint 对象。 对于每个要添加的具有参数的项目,需要在初始蓝图上提前定义参数。

  1. 创建初始 blueprint 对象。 BlueprintFile 参数接受一个 JSON 文件,该文件包含有关蓝图、要创建的任何资源组和所有蓝图级别参数的属性。 在分配过程中设置参数,在后续步骤中添加的项目将使用这些参数。

    • JSON 文件 - blueprint.json

      {
          "properties": {
              "description": "This blueprint sets tag policy and role assignment on the subscription, creates a ResourceGroup, and deploys a resource template and role assignment to that ResourceGroup.",
              "targetScope": "subscription",
              "parameters": {
                  "storageAccountType": {
                      "type": "string",
                      "defaultValue": "Standard_LRS",
                      "allowedValues": [
                          "Standard_LRS",
                          "Standard_GRS",
                          "Standard_ZRS",
                          "Premium_LRS"
                      ],
                      "metadata": {
                          "displayName": "storage account type.",
                          "description": null
                      }
                  },
                  "tagName": {
                      "type": "string",
                      "metadata": {
                          "displayName": "The name of the tag to provide the policy assignment.",
                          "description": null
                      }
                  },
                  "tagValue": {
                      "type": "string",
                      "metadata": {
                          "displayName": "The value of the tag to provide the policy assignment.",
                          "description": null
                      }
                  },
                  "contributors": {
                      "type": "array",
                      "metadata": {
                          "description": "List of AAD object IDs that is assigned Contributor role at the subscription",
                          "strongType": "PrincipalId"
                      }
                  },
                  "owners": {
                      "type": "array",
                      "metadata": {
                          "description": "List of AAD object IDs that is assigned Owner role at the resource group",
                          "strongType": "PrincipalId"
                      }
                  }
              },
              "resourceGroups": {
                  "storageRG": {
                      "description": "Contains the resource template deployment and a role assignment."
                  }
              }
          }
      }
      
    • PowerShell 命令

      # Login first with Connect-AzAccount if not using Cloud Shell
      
      # Get a reference to the new blueprint object, we'll use it in subsequent steps
      $blueprint = New-AzBlueprint -Name 'MyBlueprint' -BlueprintFile .\blueprint.json
      

      注意

      以编程方式创建蓝图定义时,请使用文件名 blueprint.json。 调用 Import-AzBlueprintWithArtifact 时,将使用此文件名。

      默认情况下,会在默认订阅中创建蓝图对象。 若要指定管理组,请使用参数 ManagementGroupId。 若要指定订阅,请使用参数 SubscriptionId

  2. 在订阅中添加角色分配。 ArtifactFile 定义项目的种类、与角色定义标识符一致的属性以及以值的数组形式传递的主体标识。 在下面的示例中,主体标识被授予指定的角色,配置为蓝图分配过程中所设置的参数。 此示例使用 GUID 为 b24988ac-6180-42a0-ab88-20f7382dd24cContributor 内置角色。

    • JSON 文件 - \artifacts\roleContributor.json

      {
          "kind": "roleAssignment",
          "properties": {
              "roleDefinitionId": "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c",
              "principalIds": "[parameters('contributors')]"
          }
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintArtifact -Blueprint $blueprint -Name 'roleContributor' -ArtifactFile .\artifacts\roleContributor.json
      
  3. 在订阅中添加策略分配。 ArtifactFile 定义项目的种类、与策略或计划定义一致的属性,以及策略分配被配置为在蓝图分配过程中使用已定义的蓝图参数。 此示例使用 GUID 为 49c88fc8-6fd1-46fd-a676-f12d1d3a4c71Apply tag and its default value to resource groups 内置策略。

    • JSON 文件 - artifacts\policyTags.json

      {
          "kind": "policyAssignment",
          "properties": {
              "displayName": "Apply tag and its default value to resource groups",
              "description": "Apply tag and its default value to resource groups",
              "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/49c88fc8-6fd1-46fd-a676-f12d1d3a4c71",
              "parameters": {
                  "tagName": {
                      "value": "[parameters('tagName')]"
                  },
                  "tagValue": {
                      "value": "[parameters('tagValue')]"
                  }
              }
          }
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintArtifact -Blueprint $blueprint -Name 'policyTags' -ArtifactFile .\artifacts\policyTags.json
      
  4. (通过重用 storageAccountType_ parameter)在订阅中为存储标记添加另一个策略分配。 此附加的策略分配项目演示了蓝图上定义的参数可由多个项目使用。 在示例中,使用 storageAccountType 在资源组上设置标记。 此值提供有关下一步骤中创建的存储帐户的信息。 此示例使用 GUID 为 49c88fc8-6fd1-46fd-a676-f12d1d3a4c71Apply tag and its default value to resource groups 内置策略。

    • JSON 文件 - artifacts\policyStorageTags.json

      {
          "kind": "policyAssignment",
          "properties": {
              "displayName": "Apply storage tag to resource group",
              "description": "Apply storage tag and the parameter also used by the template to resource groups",
              "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/49c88fc8-6fd1-46fd-a676-f12d1d3a4c71",
              "parameters": {
                  "tagName": {
                      "value": "StorageType"
                  },
                  "tagValue": {
                      "value": "[parameters('storageAccountType')]"
                  }
              }
          }
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintArtifact -Blueprint $blueprint -Name 'policyStorageTags' -ArtifactFile .\artifacts\policyStorageTags.json
      
  5. 在资源组下添加模板。 ARM 模板的 TemplateFile 包含模板的标准 JSON 组件。 该模板还通过将 storageAccountTypetagNametagValue 蓝图参数传递给模板来重用它们。 通过使用参数 TemplateParameterFile 和在使用键值对的模板 JSON 中注入值,模板可以使用蓝图参数。 蓝图和模板参数名称可能相同。

    • JSON ARM 模板文件 - \artifacts\templateStorage.json

      {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
              "storageAccountTypeFromBP": {
                  "type": "string",
                  "metadata": {
                      "description": "Storage Account type"
                  }
              },
              "tagNameFromBP": {
                  "type": "string",
                  "defaultValue": "NotSet",
                  "metadata": {
                      "description": "Tag name from blueprint"
                  }
              },
              "tagValueFromBP": {
                  "type": "string",
                  "defaultValue": "NotSet",
                  "metadata": {
                      "description": "Tag value from blueprint"
                  }
              }
          },
          "variables": {
              "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
          },
          "resources": [{
              "type": "Microsoft.Storage/storageAccounts",
              "name": "[variables('storageAccountName')]",
              "apiVersion": "2016-01-01",
              "tags": {
                  "[parameters('tagNameFromBP')]": "[parameters('tagValueFromBP')]"
              },
              "location": "[resourceGroup().location]",
              "sku": {
                  "name": "[parameters('storageAccountTypeFromBP')]"
              },
              "kind": "Storage",
              "properties": {}
          }],
          "outputs": {
              "storageAccountSku": {
                  "type": "string",
                  "value": "[variables('storageAccountName')]"
              }
          }
      }
      
    • JSON ARM 模板参数文件 - \artifacts\templateStorageParams.json

      {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
              "storageAccountTypeFromBP": {
                  "value": "[parameters('storageAccountType')]"
              },
              "tagNameFromBP": {
                  "value": "[parameters('tagName')]"
              },
              "tagValueFromBP": {
                  "value": "[parameters('tagValue')]"
              }
          }
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintArtifact -Blueprint $blueprint -Type TemplateArtifact -Name 'templateStorage' -TemplateFile .\artifacts\templateStorage.json -TemplateParameterFile .\artifacts\templateStorageParams.json -ResourceGroupName storageRG
      
  6. 在资源组下添加角色分配。 与上一角色分配项类似,以下示例对 Owner 角色使用定义标识符,并向其提供不同于蓝图参数的另一参数。 此示例使用 GUID 为 8e3af657-a8ff-443c-a75c-2fe8c4bcb635Owner 内置角色。

    • JSON 文件 - \artifacts\roleOwner.json

      {
          "kind": "roleAssignment",
          "properties": {
              "resourceGroup": "storageRG",
              "roleDefinitionId": "/providers/Microsoft.Authorization/roleDefinitions/8e3af657-a8ff-443c-a75c-2fe8c4bcb635",
              "principalIds": "[parameters('owners')]"
          }
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintArtifact -Blueprint $blueprint -Name 'roleOwner' -ArtifactFile .\artifacts\roleOwner.json
      

发布蓝图

现在已将项目添加到蓝图中,可以将其发布了。 发布后,即可将蓝图分配到订阅。

# Use the reference to the new blueprint object from the previous steps
Publish-AzBlueprint -Blueprint $blueprint -Version '{BlueprintVersion}'

{BlueprintVersion} 的值是由字母、数字和连字符组成的字符串(不含空格或其他特殊字符)。 最大长度为 20 个字符。 使用唯一且具有参考性的内容,如 v20180622-135541

分配蓝图

在使用 PowerShell 发布蓝图后,即可将其分配到订阅。 将创建的蓝图分配到管理组层次结构下的一个订阅。 如果蓝图保存到某个订阅,则只能将其分配给该订阅。 Blueprint 参数指定要分配的蓝图。 若要提供 namelocationidentitylockblueprint 参数,请在 New-AzBlueprintAssignment cmdlet 上使用匹配的 PowerShell 参数,或在 AssignmentFile 参数 JSON 文件中提供这些参数。

  1. 通过将蓝图部署分配到订阅,运行它。 由于 contributorsowners 参数要求主体的 objectIds 数组被授予角色分配,请使用 Azure Active Directory 图形 API 来收集 objectIds,以供自己的用户、组或服务主体在 AssignmentFile 中使用。

    • JSON 文件 - blueprintAssignment.json

      {
          "properties": {
              "blueprintId": "/providers/Microsoft.Management/managementGroups/{YourMG}/providers/Microsoft.Blueprint/blueprints/MyBlueprint",
              "resourceGroups": {
                  "storageRG": {
                      "name": "StorageAccount",
                      "location": "eastus2"
                  }
              },
              "parameters": {
                  "storageAccountType": {
                      "value": "Standard_GRS"
                  },
                  "tagName": {
                      "value": "CostCenter"
                  },
                  "tagValue": {
                      "value": "ContosoIT"
                  },
                  "contributors": {
                      "value": [
                          "7be2f100-3af5-4c15-bcb7-27ee43784a1f",
                          "38833b56-194d-420b-90ce-cff578296714"
                      ]
                  },
                  "owners": {
                      "value": [
                          "44254d2b-a0c7-405f-959c-f829ee31c2e7",
                          "316deb5f-7187-4512-9dd4-21e7798b0ef9"
                      ]
                  }
              }
          },
          "identity": {
              "type": "systemAssigned"
          },
          "location": "westus"
      }
      
    • PowerShell 命令

      # Use the reference to the new blueprint object from the previous steps
      New-AzBlueprintAssignment -Blueprint $blueprint -Name 'assignMyBlueprint' -AssignmentFile .\blueprintAssignment.json
      
    • 用户分配的托管标识

      蓝图分配也可使用用户分配的托管标识。 在此示例中,JSON 分配文件的 identity 部分更改如下。 将 {tenantId}{subscriptionId}{yourRG}{userIdentity} 分别替换为你的租户 ID、订阅 ID、资源组名称和用户分配的托管标识的名称。

      "identity": {
          "type": "userAssigned",
          "tenantId": "{tenantId}",
          "userAssignedIdentities": {
              "/subscriptions/{subscriptionId}/resourceGroups/{yourRG}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{userIdentity}": {}
          }
      },
      

      用户分配的托管标识可以位于分配蓝图的用户具有权限的任何订阅和资源组中。

      重要

      Azure 蓝图不管理用户分配的托管标识。 用户负责分配足够的角色和权限,否则蓝图分配会失败。

清理资源

可以从订阅中删除蓝图。 通常会在不再需要项目资源时将其删除。 删除蓝图时,作为该蓝图的一部分分配的项目将保留。 若要删除蓝图分配,请使用 Remove-AzBlueprintAssignment cmdlet:

assignMyBlueprint

Remove-AzBlueprintAssignment -Name 'assignMyBlueprint'

后续步骤

在本快速入门中,你使用 PowerShell 创建、分配并删除了蓝图。 若要详细了解 Azure 蓝图,请继续学习蓝图生命周期文章。