使用 Resource Manager 模板和 Resource Manager REST API 部署资源

本文介绍如何将 Resource Manager REST API 与 Resource Manager 模板配合使用向 Azure 部署资源。

Tip

有关在部署过程中调试错误的帮助,请参阅:

可以在请求正文中包含模板或链接到文件。 使用文件时,它可以是本地文件,也可以是通过 URI 提供的外部文件。 如果模板位于存储帐户中,可以限制对该模板的访问,并在部署过程中提供共享访问签名 (SAS) 令牌。

使用 REST API 进行部署

  1. 设置 常见参数和标头,包括身份验证令牌。

  2. 如果目前没有资源组,请创建资源组。 提供订阅 ID、新资源组的名称,以及解决方案所需的位置。 有关详细信息,请参阅 创建资源组

    PUT https://management.chinacloudapi.cn/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>?api-version=2018-05-01
    

    使用如下所示请求正文:

    {
      "location": "China North",
      "tags": {
        "tagname1": "tagvalue1"
      }
    }
    
  3. 在执行部署之前,通过运行验证模板部署操作来验证部署。 测试部署时,请提供与执行部署时所提供的完全相同的参数(如下一步中所示)。

  4. 创建部署。 提供订阅 ID、资源组的名称、部署的名称以及模板的链接。 有关模板文件的信息,请参阅参数文件。 有关使用 REST API 创建资源组的详细信息,请参阅创建模板部署。 请注意,mode 设置为 Incremental。 要运行完整部署,请将 mode 设置为 Complete。 使用完整模式时要小心,因为可能会无意中删除不在模板中的资源。

    PUT https://management.chinacloudapi.cn/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>/providers/Microsoft.Resources/deployments/<YourDeploymentName>?api-version=2018-05-01
    

    使用如下所示请求正文:

    {
      "properties": {
        "templateLink": {
          "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/template.json",
          "contentVersion": "1.0.0.0"
        },
        "mode": "Incremental",
        "parametersLink": {
           "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/parameters.json",
           "contentVersion": "1.0.0.0"
        }
      }
    }
    

    如果想要记录响应内容或/和请求内容,请在请求中包括 debugSetting

    {
      "properties": {
        "templateLink": {
          "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/template.json",
          "contentVersion": "1.0.0.0"
        },
        "mode": "Incremental",
        "parametersLink": {
          "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/parameters.json",
          "contentVersion": "1.0.0.0"
        },
        "debugSetting": {
          "detailLevel": "requestContent, responseContent"
        }
      }
    }
    

    可以将存储帐户设置为使用共享访问签名 (SAS) 令牌。 有关详细信息,请参阅使用共享访问签名委托访问权限

  5. 可以将模板和参数包含在请求正文中,而不是链接到模板和参数的文件。

    {
      "properties": {
      "mode": "Incremental",
      "template": {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
          "storageAccountType": {
            "type": "string",
            "defaultValue": "Standard_LRS",
            "allowedValues": [
              "Standard_LRS",
              "Standard_GRS",
              "Standard_ZRS",
              "Premium_LRS"
            ],
            "metadata": {
              "description": "Storage Account type"
            }
          },
          "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
              "description": "Location for all resources."
            }
          }
        },
        "variables": {
          "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'standardsa')]"
        },
        "resources": [
          {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageAccountName')]",
            "apiVersion": "2018-02-01",
            "location": "[parameters('location')]",
            "sku": {
              "name": "[parameters('storageAccountType')]"
            },
            "kind": "StorageV2",
            "properties": {}
          }
        ],
        "outputs": {
          "storageAccountName": {
            "type": "string",
            "value": "[variables('storageAccountName')]"
          }
        }
        },
        "parameters": {
          "location": {
            "value": "chinaeast2"
          }
        }
      }
    }
    
  6. 获取模板部署的状态。 有关详细信息,请参阅 获取有关模板部署的信息

    GET https://management.chinacloudapi.cn/subscriptions/<YourSubscriptionId>/resourcegroups/<YourResourceGroupName>/providers/Microsoft.Resources/deployments/<YourDeploymentName>?api-version=2018-05-01
    

部署失败时,重新部署

部署失败时,可以自动重新部署部署历史记录中先前成功的部署。 要指定重新部署,请在请求正文中使用 onErrorDeployment 属性。

若要使用此选项,部署必须具有唯一的名称,以便可以在历史记录中标识它们。 如果没有唯一名称,则当前失败的部署可能会覆盖历史记录中以前成功的部署。 只能将此选项用于根级别部署。 从嵌套模板进行的部署不可用于重新部署。

若要在当前部署失败的情况下,重新部署上一个成功部署,请使用:

{
  "properties": {
    "templateLink": {
      "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/template.json",
      "contentVersion": "1.0.0.0"
    },
    "mode": "Incremental",
    "parametersLink": {
      "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/parameters.json",
      "contentVersion": "1.0.0.0"
    },
    "onErrorDeployment": {
      "type": "LastSuccessful",
    }
  }
}

若要在当前部署失败的情况下,重新部署特定部署,请使用:

{
  "properties": {
    "templateLink": {
      "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/template.json",
      "contentVersion": "1.0.0.0"
    },
    "mode": "Incremental",
    "parametersLink": {
      "uri": "http://mystorageaccount.blob.core.chinacloudapi.cn/templates/parameters.json",
      "contentVersion": "1.0.0.0"
    },
    "onErrorDeployment": {
      "type": "SpecificDeployment",
      "deploymentName": "<deploymentname>"
    }
  }
}

指定的部署必须已成功。

参数文件

如果要在部署期间使用参数文件传递参数值,需要使用类似于以下示例的格式创建一个 JSON 文件:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "webSiteName": {
            "value": "ExampleSite"
        },
        "webSiteHostingPlanName": {
            "value": "DefaultPlan"
        },
        "webSiteLocation": {
            "value": "China North"
        },
        "adminPassword": {
            "reference": {
               "keyVault": {
                  "id": "/subscriptions/{guid}/resourceGroups/{group-name}/providers/Microsoft.KeyVault/vaults/{vault-name}"
               }, 
               "secretName": "sqlAdminPassword" 
            }   
        }
   }
}

参数文件的大小不能超过 64 KB。

如果需要为参数(如密码)提供敏感值,请将该值添加到密钥保管库。 在部署过程中检索密钥保管库,如前面的示例所示。 有关详细信息,请参阅在部署期间传递安全值

后续步骤