教程:在 ARM 模板中使用条件

了解如何根据 Azure 资源管理器模板(ARM 模板)中的条件部署 Azure 资源。

设置资源部署顺序教程介绍如何创建虚拟机、虚拟网络以及其他一些依赖资源(包括存储帐户)。 无需每次都创建新的存储帐户,可让用户选择是创建新的存储帐户还是使用现有的存储帐户。 为实现此目的,需定义附加的参数。 如果参数值为“new”,则创建新存储帐户。 否则,将使用具有所提供名称的现有存储帐户。

Resource Manager template use condition diagram

本教程涵盖以下任务:

  • 打开快速入门模板
  • 修改模板
  • 部署模板
  • 清理资源

本教程仅介绍使用条件的基本方案。 有关详细信息,请参阅:

如果没有 Azure 订阅,请在开始前创建试用版订阅

先决条件

若要完成本文,需要做好以下准备:

  • 包含资源管理器工具扩展的 Visual Studio Code。 请参阅快速入门:使用 Visual Studio Code 创建 ARM 模板

  • 若要提高安全性,请使用为虚拟机管理员帐户生成的密码。 可以在 PowerShell 或 CLI 中使用本地 Shell 运行以下命令:

    openssl rand -base64 32
    

    若要了解详细信息,请运行 man openssl rand 打开手册页。

    Azure Key Vault 旨在保护加密密钥和其他机密。 有关详细信息,请参阅教程:在 ARM 模板部署中集成 Azure Key Vault。 我们还建议你每三个月更新一次密码。

打开快速入门模板

Azure 快速入门模板是 ARM 模板的存储库。 无需从头开始创建模板,只需找到一个示例模板并对其自定义即可。 本教程中使用的模板称为部署简单的 Windows VM

  1. 在 Visual Studio Code 中,选择“文件”>“打开文件”。

  2. 在“文件名”中粘贴以下 URL:

    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vm-simple-windows/azuredeploy.json
    
  3. 选择“打开”以打开该文件。

  4. 有六个通过此模板定义的资源:

    • Microsoft.Storage/storageAccounts
    • Microsoft.Network/publicIPAddresses
    • Microsoft.Network/networkSecurityGroups
    • Microsoft.Network/virtualNetworks
    • Microsoft.Network/networkInterfaces
    • Microsoft.Compute/virtualMachines

    在自定义模板之前查看模板参考会很有帮助。

  5. 选择“文件”>“另存为”,将该文件的副本保存到名为 azuredeploy.json 的本地计算机。

修改模板

对现有模板进行两项更改:

  • 添加存储帐户名称参数。 用户可以指定新的存储帐户名称或现有的存储帐户名称。
  • 添加名为 newOrExisting 的新参数。 部署使用此参数来确定是要创建新存储帐户还是使用现有的存储帐户。

下面是进行更改的过程:

  1. 在 Visual Studio Code 中打开 azuredeploy.json

  2. 在整个模板中,将三个 variables('storageAccountName') 替换为 parameters('storageAccountName')

  3. 删除以下变量定义:

    Screenshot that highlights the variable definitions that you need to remove.

  4. 将以下两个参数添加到 parameters 节的开头:

    "storageAccountName": {
      "type": "string"
    },
    "newOrExisting": {
      "type": "string",
      "allowedValues": [
        "new",
        "existing"
      ]
    },
    

    在 Visual Studio Code 中按“Alt+Shift+F”,设置模板格式。

    更新的参数定义如下所示:

    Resource Manager use condition

  5. 将以下行添加到存储帐户定义的开头。

    "condition": "[equals(parameters('newOrExisting'),'new')]",
    

    条件会检查参数 newOrExisting 的值。 如果参数值为 new,则部署将创建存储帐户。

    更新的存储帐户定义如下所示:

    Screenshot that shows the updated storage account definition.

  6. 使用以下值更新虚拟机资源定义的 storageUri 属性:

    "storageUri": "[concat('https://', parameters('storageAccountName'), '.blob.core.chinacloudapi.cn')]"
    

    如果使用另一资源组中的现有存储帐户,则此更改是必需的。

  7. 保存更改。

部署模板

  1. 在本地计算机上使用管理员权限运行以下 PowerShell 脚本,然后登录 Azure 中国世纪互联。

    Connect-AzAccount -Environment AzureChinaCloud
    
  2. 运行以下 PowerShell 脚本以部署我们在前面步骤中保存的模板。

    重要

    存储帐户名称在 Azure 中必须是唯一的。 该名称只能包含小写字母或数字。 其长度不能超过 24 个字符。 存储帐户名称是追加了“store”的项目名称。 请确保项目名称和生成的存储帐户名称符合存储帐户名称要求。

    $projectName = Read-Host -Prompt "Enter a project name that is used to generate resource group name and resource names"
    $newOrExisting = Read-Host -Prompt "Create new or use existing (Enter new or existing)"
    $location = Read-Host -Prompt "Enter the Azure location (i.e. chinaeast)"
    $vmAdmin = Read-Host -Prompt "Enter the admin username"
    $vmPassword = Read-Host -Prompt "Enter the admin password" -AsSecureString
    $dnsLabelPrefix = Read-Host -Prompt "Enter the DNS Label prefix"
    
    $resourceGroupName = "${projectName}rg"
    $storageAccountName = "${projectName}store"
    
    New-AzResourceGroup -Name $resourceGroupName -Location $location
    New-AzResourceGroupDeployment `
        -ResourceGroupName $resourceGroupName `
        -adminUsername $vmAdmin `
        -adminPassword $vmPassword `
        -dnsLabelPrefix $dnsLabelPrefix `
        -storageAccountName $storageAccountName `
        -newOrExisting $newOrExisting `
        -TemplateFile "$HOME/azuredeploy.json"
    
    Write-Host "Press [ENTER] to continue ..."
    

    注意

    如果 newOrExistingnew,但具有指定存储帐户名称的存储帐户已存在,则部署将会失败。

通过将 newOrExisting 设置为“existing”并指定现有存储帐户来尝试进行另一个部署。 若要提前创建存储帐户,请参阅创建存储帐户

清理资源

不再需要 Azure 资源时,请通过删除资源组来清理部署的资源。

$projectName = Read-Host -Prompt "Enter the same project name you used in the last procedure"
$resourceGroupName = "${projectName}rg"

Remove-AzResourceGroup -Name $resourceGroupName

Write-Host "Press [ENTER] to continue ..."

后续步骤

在本教程中,我们开发了一个允许用户选择创建新存储帐户或使用现有存储帐户的模板。 若要了解如何从 Azure Key Vault 检索机密并在模板部署中使用这些机密作为密码,请参阅: