练习 - 部署 ARM 模板

已完成

注意

首次激活沙盒并接受这些条款后,你的 Microsoft 帐户将与名为“Microsoft Learn 沙盒”的新 Azure 目录相关联。 你会被添加到名为“Concierge 订阅”的特殊订阅中。

在本练习中,可以通过指定 URI 从计算机和 GitHub 存储库中部署 Azure 资源管理器 (ARM) 模板。

重要

本练习使用适用于 Visual Studio Code 的 Azure 资源管理器工具。 请务必在 Visual Studio Code 中安装此扩展。

通过 Microsoft Learn 沙盒订阅设置环境

若要执行本单元的每个部署,需要从 Visual Studio Code 终端登录到 Azure 帐户。

确保登录的是与激活沙盒相同的帐户。

登录到 Azure

  1. 从 Visual Studio Code 中的终端运行以下命令以登录到 Azure。 运行此命令时,系统会打开一个浏览器,使你能够登录到你的帐户。

    Connect-AzAccount
    
  2. 登录后,你会在终端中看到与此帐户关联的订阅的列表。 如果已激活沙盒,则 Concierge 订阅应在此列表中。

  3. 请验证订阅名称。 以下命令将以易于阅读的表格格式列出你的订阅、姓名及 ID。 查找 Concierge Subscription

    Get-AzSubscription
    
  4. 将处于活动状态的订阅更改为 Concierge 订阅。

    $context = Get-AzSubscription -SubscriptionName "Concierge Subscription" | Set-AzContext
    

设置默认资源组

现在需要将在沙盒中创建的资源组设置为默认资源组。 若要执行此操作,首先需要运行以下命令获取资源组名称。

Get-AzResourceGroup | where-object ResourceGroupName -match "learn" | Set-AzDefault

在此命令中,使用从上一个命令中获得的资源名称。 (该资源名称类似于 learn-a73131a1-b618-48b8-af70-21af7ca420c4。)此命令使你能够在本练习的其余 Azure PowerShell 命令中省略该参数。

注意

通常,运行 PowerShell 或 Azure CLI 命令部署模板时,必须指定目标资源组名称。 运行上一个命令,我们已设置部署的上下文。 我们已通过运行 Set-AzDefault PowerShell 命令指定沙盒资源组名称:

Set-AzDefault -ResourceGroupName {Resource Group Name}

部署本地模板

在以下练习中,你会从本地计算机部署模板。 由于我们已在上一节中定义了默认资源组,因此这里不需要使用在你自己的环境中部署时通常使用的资源组的名称。

  1. 首先,请将以下模板代码的内容复制并粘贴到本地目录中的文件中。 例如,使用 C:\JSON\maintemplate.json 格式。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
          "VnetName": {
            "type": "string",
            "defaultValue": "VNet-001",
            "metadata": {
              "description": "Virtual Network Name"
            }
          },
          "CostCenterIO": {
            "type": "string",
            "defaultValue": "12345",
            "metadata": {
              "description": "Cost Center IO number for cross billing"
            }
          },
          "OwnerName": {
            "type": "string",
            "defaultValue": "John Smith",
            "metadata": {
              "description": "Name of the stakeholder responsible for this resource"
            }
          }
        },
        "variables": {},
        "resources": [
            {
                "apiVersion": "2018-10-01",
                "type": "Microsoft.Network/virtualNetworks",
                "name": "[parameters('VnetName')]",
                "location": "[resourceGroup().location]",
                "tags": {
                    "CostCenter": "[parameters('CostCenterIO')]",
                    "Owner": "[parameters('OwnerName')]"
                },  
                "properties": {
                    "addressSpace": {
                        "addressPrefixes": [
                            "10.0.0.0/16"
                        ]
                    },
                    "enableVmProtection": false,
                    "enableDdosProtection": false,
                    "subnets": [
                        {
                            "name": "subnet001",
                            "properties": {
                                "addressPrefix": "10.0.0.0/24"
                            }
                        },
                        {
                            "name": "subnet002",
                            "properties": {
                                "addressPrefix": "10.0.1.0/24"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  2. 将文件保存在本地后,可以使用 PowerShell 命令在上一单元中讨论的资源组级别中进行部署, 即使用 New-AzResourceGroupDeployment 命令。

    $templateFile="C:\JSON\maintemplate.json"
    $today=Get-Date -Format "MM-dd-yyyy"
    $DeploymentName="DeployLocalTemplate-"+"$today"
    
    New-AzResourceGroupDeployment `
    -Name $DeploymentName `
    -TemplateFile $templateFile
    

    完成后,应会得到类似于以下示例的结果。

    DeploymentName          : DeployLocalTemplate-08-24-2020
    ResourceGroupName       : learn-03f041a7-cd17-4f50-9c81-5f6678feb217
    ProvisioningState       : Succeeded
    Timestamp               : 2020-08-24 5:50:04 p.m.
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              vnetName         String                     VNet-001
                              costCenterIO     String                     12345
                              ownerName        String                     John Smith
    
    Outputs                 :
    DeploymentDebugLogLevel :
    
    

使用参数值部署相同的本地模板

在上一个练习中,你使用了参数的默认值来部署模板。 部署本地 ARM 模板时,可能需要传递参数值。 你可以使用内联参数或参数文件。

若要将内联参数传递给部署,需要使用 New-AzResourceGroupDeployment cmdlet 提供参数名称。 在下一练习中,你将以内联参数和参数文件的形式传递参数。

  1. 使用与上一练习相同的模板,构造一个哈希表,其中需包含所需模板参数的值。

    $parameters = @{vnetName = "VNet-001"; costCenterIO = "12345"; ownerName = "John Smith"}
    $templateFile="C:\JSON\maintemplate.json"
    $today=Get-Date -Format "MM-dd-yyyy"
    $DeploymentName="DeployLocalTemplate-2-"+"$today"
    
    New-AzResourceGroupDeployment `
        -Name $DeploymentName `
        -TemplateFile $templateFile `
        -TemplateParameterObject $parameters
    

    完成后,应会得到类似于以下的结果:

    DeploymentName          : DeployLocalTemplate-2-08-24-2020
    ResourceGroupName       : learn-03f041a7-cd17-4f50-9c81-5f6678feb217
    ProvisioningState       : Succeeded
    Timestamp               : 2020-08-24 5:51:55 p.m.
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              vnetName         String                     VNet-001
                              costCenterIO     String                     12345
                              ownerName        String                     John Smith
    
    Outputs                 :
    DeploymentDebugLogLevel :
    

    与在脚本中以内联值的形式传递参数相比,你可能会发现使用包含参数值的 JSON 文件更加轻松。 参数文件可以是本地文件,也可以是具有可访问 URI 的外部/远程文件。 有关参数文件的详细信息,请参阅创建资源管理器参数文件

  2. 为了传递本地参数文件,我们将使用之前使用的同一命令中的 TemplateParameterFile 参数。 但首先需要创建并保存参数文件。

    1. 由于我们将 Visual Studio Code 与 Azure 资源管理器工具扩展结合使用,因此你可以打开本地保存的 ARM 模板,然后选择“选择/创建参数文件…”链接。

    2. 在菜单上选择“新建”,然后选择“仅必需参数”。 扩展根据当前打开的模板创建参数文件。

    显示用于在 Visual Studio Code 中创建参数文件的选项的屏幕截图。

  3. 将以下 PowerShell 命令与 TemplateParameterFile 参数结合使用。

    $parameters = @{vnetName = "VNet-001"; costCenterIO = "12345"; ownerName = "John Smith"}
    $templateFile="C:\JSON\maintemplate.json"
    $TemplateParameterFile= "C:\JSON\maintemplate.parameters.json"
    $today=Get-Date -Format "MM-dd-yyyy"
    $DeploymentName="DeployLocalTemplate-3-"+"$today"
    
    New-AzResourceGroupDeployment `
        -Name $DeploymentName `
        -TemplateFile $templateFile `
        -TemplateParameterFile $TemplateParameterFile
    

    部署后,结果应如以下示例所示。

    DeploymentName          : DeployLocalTemplate-3-08-24-2020
    ResourceGroupName       : learn-03f041a7-cd17-4f50-9c81-5f6678feb217
    ProvisioningState       : Succeeded
    Timestamp               : 2020-08-24 5:54:40 p.m.
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              vnetName         String                     VNet-001
                              costCenterIO     String                     12345
                              ownerName        String                     John Smith
    
    Outputs                 :
    DeploymentDebugLogLevel :
    
    

部署外部或远程模板

在某些情况下,你需要从外部或远程位置而不是从本地计算机上的模板进行部署。 可以将模板存储在源控件存储库(例如 GitHub)中。 另外,还可以将其存储在 Azure 存储帐户中,以便在组织中共享访问。

  1. 若要部署外部模板,请使用 TemplateUri 参数。

    在下一练习中,你将从 GitHub 存储库部署 ARM 模板。 存储库是公用的,因此无需担心会部署需要共享访问签名 (SAS) 令牌的模板。 有关使用专用位置或受保护的远程位置的详细信息,请参阅 使用 SAS 令牌部署专用模板

    本练习的模板 URI 是 https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json。 这是一个简短的模板,它将在你的沙盒环境中部署一个基础的存储帐户。

  2. PowerShell 命令与用于本地模板的命令完全相同。 唯一的区别是 -TemplateUri 参数替换了 -TemplateFile 参数。

    使用以下代码在提供的沙盒中进行部署:

    $parameters = @{vnetName = "VNet-001"; costCenterIO = "12345"; ownerName = "John Smith"}
    $today=Get-Date -Format "MM-dd-yyyy"
    $DeploymentName="DeployLocalTemplate-4-"+"$today"
    
    New-AzResourceGroupDeployment `
        -Name $DeploymentName `
        -TemplateUri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json
    

    结果与以下屏幕截图类似。 其中列出了模板位置的详细信息。

    DeploymentName          : DeployLocalTemplate-4-08-24-2020
    ResourceGroupName       : learn-03f041a7-cd17-4f50-9c81-5f6678feb217
    ProvisioningState       : Succeeded
    Timestamp               : 2020-08-24 5:56:55 p.m.
    Mode                    : Incremental
    TemplateLink            :
                              Uri            :
                              https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json
                              ContentVersion : 1.0.0.0
    
    Parameters              :
                              Name                  Type                       Value
                              ====================  =========================  ==========
                              storageAccountType    String                     Standard_LRS
                              location              String                     westus
    
    Outputs                 :
                              Name                  Type                       Value
                              ====================  =========================  ==========
                              storageAccountName    String                     storepgxosadmbq77e
    
    DeploymentDebugLogLevel :
    
    

注意

本部分是使用 Windows 10 的 Windows Linux 子系统 (WSL2) 中的 Azure CLI 命令编写的。 无论你是在 PowerShell、CMD 还是 Bash Shell 中使用 Azure CLI,这些命令都是相同的。 但是变量的处理方式可能有所不同。

登录到 Azure

  1. 从 Visual Studio Code 中的终端运行以下命令以登录到 Azure。 运行此命令时,系统会打开一个浏览器,使你能够登录到你的帐户。

    az login
    
  2. 登录后,你会在终端中看到与此帐户关联的订阅的 JSON 列表。 如果已激活沙盒,则 Concierge 订阅应在此列表中。

  3. 获取订阅 ID。 以下命令将列出你的订阅及其 ID。 订阅 ID 位于第三列。 查找 Concierge Subscription 并复制第三列。 它应如 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e 所示。

    az account list -o table
    
  4. 将处于活动状态的订阅更改为 Concierge 订阅。 确保将 {Your subscription ID} 替换为在上一个命令中获得的 Concierge 订阅的 ID。

    az account set -s {Your subscription ID}
    

设置默认资源组

现在需要将在沙盒中创建的资源组设置为默认资源组。 若要执行此操作,首先需要使用以下命令获取资源组名称:

az group list -o table

在此命令中,使用从上一个命令中获得的资源名称。 (该资源名称类似于 learn-a73131a1-b618-48b8-af70-21af7ca420c4。)此命令使你能够在本练习的其余 Azure CLI 命令中省略该参数。

注意

通常,使用 Azure CLI 命令部署模板时,需要指定目标资源组名称。 在本模块中的练习中,我们通过设置部署的上下文来绕过这一要求。 在下一步中,我们将使用 az configure Azure CLI 命令来指定沙盒资源组名称。

az configure --defaults group={Resource Group Name}

部署本地模板

在以下练习中,你会从本地计算机部署模板。 由于我们已在上一节中定义了默认资源组,因此这里不需要使用在你自己的环境中部署时通常使用的资源组的名称。

  1. 首先,请将以下模板代码的内容复制并粘贴到本地目录中的文件中。 例如,使用 C:\JSON\maintemplate.json/mnt/c/Users/you/json/maintemplate.json 格式。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
          "VnetName": {
            "type": "string",
            "defaultValue": "VNet-001",
            "metadata": {
              "description": "Virtual Network Name"
            }
          },
          "CostCenterIO": {
            "type": "string",
            "defaultValue": "12345",
            "metadata": {
              "description": "Cost Center IO number for cross billing"
            }
          },
          "OwnerName": {
            "type": "string",
            "defaultValue": "John Smith",
            "metadata": {
              "description": "Name of the stakeholder responsible for this resource"
            }
          }
        },
        "variables": {},
        "resources": [
            {
                "apiVersion": "2018-10-01",
                "type": "Microsoft.Network/virtualNetworks",
                "name": "[parameters('VnetName')]",
                "location": "[resourceGroup().location]",
                "tags": {
                    "CostCenter": "[parameters('CostCenterIO')]",
                    "Owner": "[parameters('OwnerName')]"
                },  
                "properties": {
                    "addressSpace": {
                        "addressPrefixes": [
                            "10.0.0.0/16"
                        ]
                    },
                    "enableVmProtection": false,
                    "enableDdosProtection": false,
                    "subnets": [
                        {
                            "name": "subnet001",
                            "properties": {
                                "addressPrefix": "10.0.0.0/24"
                            }
                        },
                        {
                            "name": "subnet002",
                            "properties": {
                                "addressPrefix": "10.0.1.0/24"
                            }
                        }
                    ]
                }
            }
        ]
    }
    
  2. 将文件保存在本地后,可以使用 Azure CLI 命令在上一单元中讨论的资源组级别中进行部署。 即使用 az deployment group create

    注意

    在以下示例中,模板文件位于 Windows Linux 子系统 (WSL2) 中主驱动器的“json”文件夹中。 根据所选的 shell 调整命令。

    templateFile=/mnt/c/Users/<UserName>/json/maintemplate.json
    today=$(date +"%Y-%m-%d")
    deploymentname="DeployLocalTemplate-"$today
    
    az deployment group create \
      --name $deploymentname \
      --template-file $templateFile
    

    完成后,生成的输出应类似于以下示例。 若要确保部署成功,请查找 "provisioningState": "Succeeded" 行。

    {
      "id": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a/providers/Microsoft.Resources/deployments/DeployLocalTemplate-2020-08-19",
      "location": null,
      "name": "DeployLocalTemplate-2020-08-19",
      "properties": {
        "correlationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
        "debugSetting": null,
        "dependencies": [],
        "duration": "PT8.9060761S",
        "error": null,
        "mode": "Incremental",
        "onErrorDeployment": null,
        "outputResources": [
          {
            "id": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/    learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a/providers/Microsoft.Network/virtualNetworks/VNet-001",
            "resourceGroup": "learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a"
          }
        ],
        "outputs": null,
        "parameters": {
          "costCenterIO": {
            "type": "String",
            "value": "12345"
          },
          "ownerName": {
            "type": "String",
            "value": "John Smith"
          },
          "vnetName": {
            "type": "String",
            "value": "VNet-001"
          }
        },
        "parametersLink": null,
        "providers": [
          {
            "id": null,
            "namespace": "Microsoft.Network",
            "registrationPolicy": null,
            "registrationState": null,
            "resourceTypes": [
              {
                "aliases": null,
                "apiVersions": null,
                "capabilities": null,
                "locations": [
                  "westus"
                ],
                "properties": null,
                "resourceType": "virtualNetworks"
              }
            ]
          }
        ],
        "provisioningState": "Succeeded",
        "templateHash": "11553431046699679955",
        "templateLink": null,
        "timestamp": "2020-08-19T14:47:06.403362+00:00",
        "validatedResources": null
      },
      "resourceGroup": "learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
      "tags": null,
      "type": "Microsoft.Resources/deployments"
    }
    

使用参数值部署相同的本地模板

在上一个练习中,你使用了参数的默认值来部署模板。 部署本地 ARM 模板时,可能需要传递参数值。 你可以使用内联参数或参数文件。

在下一个练习中,你将向部署传递内联参数。 无论是使用内联参数还是参数文件,你都需要通过使用 az deployment group create 命令提供参数名称。

  1. 通过使用与上一练习相同的模板,构造一个变量,该变量将包含所需模板参数的 JSON 字符串格式的参数。

    注意

    在以下示例中,模板文件位于 Windows Linux 子系统 (WSL2) 中的“json”文件夹中。 根据所选的 shell 和 OS 调整命令。

    parameters="{\"vnetName\":{\"value\":\"VNet-001\"},\"costCenterIO\":{\"value\":\"12345\"},\"ownerName\":{\"value\":\"John Smith\"}}"
    templateFile=/mnt/c/Users/<UserName>/json/maintemplate.json
    today=$(date +"%Y-%m-%d")
    deploymentname="DeployLocalTemplate-2-"$today
    
    az deployment group create \
    --name $deploymentname \
    --template-file $templateFile \
    --parameters "$parameters"
    

    完成后,应会得到类似于以下示例的结果。 为确保命令成功运行,请查看 "parameters" 部分和 "provisioningState" 值。

      {- Finished ..
        "id": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a/providers/Microsoft.Resources/deployments/DeployLocalTemplate-2-2020-08-19",      
        "location": null,
        "name": "DeployLocalTemplate-2-2020-08-19",
        "properties": {
          "correlationId": "bbbb1111-cc22-3333-44dd-555555eeeeee",
          "debugSetting": null,
          "dependencies": [],
          "duration": "PT4.6990388S",
          "error": null,
          "mode": "Incremental",
          "onErrorDeployment": null,
          "outputResources": [
            {
              "id": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a/providers/Microsoft.Network/virtualNetworks/VNet-001",
              "resourceGroup": "learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a"
            }
          ],
          "outputs": null,
          "parameters": {
            "costCenterIO": {
              "type": "String",
              "value": "12345"
            },
            "ownerName": {
              "type": "String",
              "value": "John Smith"
            },
            "vnetName": {
              "type": "String",
              "value": "VNet-001"
            }
          },
          "parametersLink": null,
          "providers": [
            {
              "id": null,
              "namespace": "Microsoft.Network",
              "registrationPolicy": null,
              "registrationState": null,
              "resourceTypes": [
                {
                  "aliases": null,
                  "apiVersions": null,
                  "capabilities": null,
                  "locations": [
                    "westus"
                  ],
                  "properties": null,
                  "resourceType": "virtualNetworks"
                }
              ]
            }
          ],
          "provisioningState": "Succeeded",
          "templateHash": "11553431046699679955",
          "templateLink": null,
          "timestamp": "2020-08-19T16:40:20.249786+00:00",
          "validatedResources": null
        },
        "resourceGroup": "learn-cccc2c2c-dd3d-ee4e-ff5f-aaaaaa6a6a6a",
        "tags": null,
        "type": "Microsoft.Resources/deployments"
      }
    

    与在脚本中以内联值的形式传递参数相比,你可能会发现使用包含参数值的 JSON 文件更加轻松。 参数文件可以是本地文件,也可以是具有可访问 URI 的外部/远程文件。 有关参数文件的详细信息,请参阅创建资源管理器参数文件

  2. 为了传递本地参数文件,我们将使用之前使用的同一命令中的 --parameters 参数。 但首先需要创建并保存参数文件。

    1. 由于我们将 Visual Studio Code 与 Azure 资源管理器工具扩展结合使用,因此可以打开本地保存的 ARM 模板,然后选择“选择或创建参数文件以启用完全验证”链接。

    2. 在菜单上,选择“新建”。 扩展根据当前打开的模板创建参数文件。

    显示用于在 Visual Studio Code 中创建参数文件的选项的屏幕截图。

  3. 将以下 Azure CLI 命令与 --parameters 参数结合使用。

    注意

    在以下示例中,模板文件位于 Windows Linux 子系统 (WSL2) 中的“json”文件夹中。 根据所选的 shell 和 OS 调整命令。

    templateFile=/mnt/c/Users/<UserName>/json/maintemplate.json
    templateparameterfile=/mnt/c/Users/<UserName>/json/maintemplate.parameters.json
    today=$(date +"%Y-%m-%d")
    deploymentname="DeployLocalTemplate-3-"$today
    
    az deployment group create \
    --name $deploymentname \
    --template-file $templateFile \
    --parameters $templateparameterfile
    

    部署后,结果应类似于以下示例。

      {- Finished ..
        "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b/providers/Microsoft.Resources/deployments/DeployLocalTemplate-3-2020-08-19",
        "location": null,
        "name": "DeployLocalTemplate-3-2020-08-19",
        "properties": {
          "correlationId": "cccc2222-dd33-4444-55ee-666666ffffff",
          "debugSetting": null,
          "dependencies": [],
          "duration": "PT4.2058912S",
          "error": null,
          "mode": "Incremental",
          "onErrorDeployment": null,
          "outputResources": [
            {
              "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b/providers/Microsoft.Network/virtualNetworks/VNet-001",
              "resourceGroup": "learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b"
            }
          ],
          "outputs": null,
          "parameters": {
            "costCenterIO": {
              "type": "String",
              "value": "12345"
            },
            "ownerName": {
              "type": "String",
              "value": "John Smith"
            },
            "vnetName": {
              "type": "String",
              "value": "VNet-001"
            }
          },
          "parametersLink": null,
          "providers": [
            {
              "id": null,
              "namespace": "Microsoft.Network",
              "registrationPolicy": null,
              "registrationState": null,
              "resourceTypes": [
                {
                  "aliases": null,
                  "apiVersions": null,
                  "capabilities": null,
                  "locations": [
                    "westus"
                  ],
                  "properties": null,
                  "resourceType": "virtualNetworks"
                }
              ]
            }
          ],
          "provisioningState": "Succeeded",
          "templateHash": "11553431046699679955",
          "templateLink": null,
          "timestamp": "2020-08-19T20:42:44.069215+00:00",
          "validatedResources": null
        },
        "resourceGroup": "learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b",
        "tags": null,
        "type": "Microsoft.Resources/deployments"
      }
    

部署外部或远程模板

在某些情况下,你需要从外部或远程位置而不是从本地计算机上的模板进行部署。 可以将模板存储在源控件存储库(例如 GitHub)中。 另外,还可以将其存储在 Azure 存储帐户中,以便在组织中共享访问。

  1. 若要部署外部模板,请使用 --template-uri 参数。

在本练习中,你将从 GitHub 存储库部署 ARM 模板。 存储库是公用的,因此无需担心会部署需要共享访问签名 (SAS) 令牌的模板。 有关使用专用位置或受保护的远程位置的详细信息,请参阅 使用 SAS 令牌部署专用模板

本练习的模板 URI 是 https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json。 这是一个简短的模板,它将在你的沙盒环境中部署一个基础的存储帐户。

  1. Azure CLI 命令与用于本地模板的命令完全相同。 唯一的区别是 --template-uri 参数替换了 --template-file 参数。

  2. 使用以下代码在提供的沙盒中进行部署:

    parameters="{\"vnetName\":{\"value\":\"VNet-001\"},\"costCenterIO\":{\"value\":\"12345\"},\"ownerName\":{\"value\":\"John Smith\"}}"
    today=$(date +"%Y-%m-%d")
    deploymentname="DeployLocalTemplate-4-"$today
    
    az deployment group create \
    --name $deploymentname \
    --template-uri https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json
    

    结果类似于以下代码块。 "templateLink" 部分中列出了模板位置的详细信息。 "provisioningState" 部分中显示了部署是否成功。

    {- Finished ..
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b/providers/Microsoft.Resources/deployments/DeployLocalTemplate-4-2020-08-19",
      "location": null,
      "name": "DeployLocalTemplate-4-2020-08-19",
      "properties": {
        "correlationId": "dddd3333-ee44-5555-66ff-777777aaaaaa",
        "debugSetting": null,
        "dependencies": [],
        "duration": "PT24.3286124S",
        "error": null,
        "mode": "Incremental",
        "onErrorDeployment": null,
        "outputResources": [
          {
            "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b/providers/Microsoft.Storage/storageAccounts/store7zk7eyqew54l4",
            "resourceGroup": "learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b"
          }
        ],
        "outputs": {
          "storageAccountName": {
            "type": "String",
            "value": "store7zk7eyqew54l4"
          }
        },
        "parameters": {
          "location": {
            "type": "String",
            "value": "westus"
          },
          "storageAccountType": {
            "type": "String",
            "value": "Standard_LRS"
          }
        },
        "parametersLink": null,
        "providers": [
          {
            "id": null,
            "namespace": "Microsoft.Storage",
            "registrationPolicy": null,
            "registrationState": null,
            "resourceTypes": [
              {
                "aliases": null,
                "apiVersions": null,
                "capabilities": null,
                "locations": [
                  "westus"
                ],
                "properties": null,
                "resourceType": "storageAccounts"
              }
            ]
          }
        ],
        "provisioningState": "Succeeded",
        "templateHash": "12600309984865991765",
        "templateLink": {
          "contentVersion": "1.0.0.0",
          "id": null,
          "relativePath": null,
          "uri": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json"
        },
        "timestamp": "2020-08-19T20:53:36.759312+00:00",
        "validatedResources": null
      },
      "resourceGroup": "learn-dddd3d3d-ee4e-ff5f-aa6a-bbbbbb7b7b7b",
      "tags": null,
      "type": "Microsoft.Resources/deployments"
    }