练习 - 向 Bicep 模板添加参数和变量

已完成

在此练习中,你将更新之前创建的 Bicep 模板,使其:

  • 接受资源位置和名称的参数。
  • 使用业务规则为要部署的资源选择适当的 SKU。

在此过程中,你将:

  • 更新模板以包含 location 参数。
  • 更新模板以包括资源名称的参数和变量。
  • 使用表达式为参数设置默认值。
  • 更新模板以包含每个资源的 SKU 的变量。
  • 测试部署,确保模板有效。

添加位置和资源名称参数

  1. 在 Visual Studio Code 的 main.bicep 文件中,将以下代码添加到文件顶部:

    param location string = 'eastus'
    param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    
    var appServicePlanName = 'toy-product-launch-plan'
    

    Bicep Linter 在每个参数和变量名称的下面添加黄色锯齿线,以指示未在模板中使用。 将稍后解决此问题。

    请注意,你使用的是包含字符串内插和 uniqueString() 函数的表达式来定义默认参数值。 部署此模板的用户可以通过在部署时指定值来覆盖默认参数值,但不能覆盖变量值。

    另请注意,你是使用变量作为 Azure 应用服务计划名称,但将参数用于其他名称。 存储帐户和应用服务应用需要全局唯一的名称,但应用服务计划名称仅需在其资源组中唯一。 这种差异意味着,只要部署都进入不同的资源组,那么在不同部署中使用相同的应用服务计划名称就不是问题。

    提示

    你指定参数 location 应设置为 westus3。 通常,将使用 resourceGroup().location 属性在与资源组相同的位置创建资源。 但是,使用 Microsoft Learn 沙盒时,需要使用与资源组位置不匹配的某些 Azure 区域。

  2. 查找资源定义中设置 locationname 属性的位置,并将其更新为使用参数值。 完成后,Bicep 文件中的资源定义应如下所示:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: 'Standard_LRS'
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    resource appServicePlan 'Microsoft.Web/serverFarms@2022-03-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: 'F1'
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    
  3. 保存对文件所做的更改。

为每个环境类型自动设置 SKU

  1. 在 Visual Studio Code 的 main.bicep 文件中,在上一个任务中创建的参数下面添加以下 Bicep 参数:

    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    

    请注意,你在定义一个有一组允许值的参数,但你没有为这个参数指定一个默认值。

  2. 在声明 appServicePlanName 变量的行下面,添加以下变量定义:

    var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
    var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
    

    请注意,你在使用三元运算符设置这些变量的值,以表示一些 if/then/else 逻辑。

  3. 查找资源定义中设置 sku 属性的位置,并将其更新为使用参数值。 完成后,Bicep 文件中的资源定义应如下所示:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: storageAccountSkuName
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    resource appServicePlan 'Microsoft.Web/serverFarms@2022-03-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    请注意,你没有参数化所有内容。 你已在资源定义中设置了一些属性,你知道这些值在部署之间不会发生变化。

  4. 保存对文件所做的更改。

验证 Bicep 文件

完成上述所有更改后,main.bicep 文件应如以下示例所示:

param location string = 'eastus'
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var appServicePlanName = 'toy-product-launch-plan'
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

resource appServicePlan 'Microsoft.Web/serverFarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

如果文件不匹配,请复制示例或调整文件以匹配示例。

部署已更新的 Bicep 模板

在终端中运行以下 Azure CLI 命令。

az deployment group create \
  --template-file main.bicep \
  --parameters environmentType=nonprod

在终端中运行以下 Azure PowerShell 命令。

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -environmentType nonprod

请注意,在执行部署时,将显式指定 environmentType 参数的值。 无需指定其他参数值,因为它们具有有效的默认值。

检查你的部署

  1. 在浏览器中,返回 Azure 门户并转到资源组。 你仍然会看到一个成功的部署,因为部署使用了与第一个部署相同的名称。

  2. 选择“1 个成功”链接。

  3. 选择名为“main”的部署,然后选择“部署详细信息”以展开已部署的资源列表。

    Screenshot of the Azure portal interface for the specific deployment, with storage account and App Service resources listed with generated names.

  4. 请注意,已使用随机生成的名称部署了新的 App 服务应用和存储帐户。