练习 - 向 Bicep 模板添加参数和变量
在此练习中,你将更新之前创建的 Bicep 模板,使其:\
- 接受资源位置和名称的参数。
- 使用业务规则为要部署的资源选择适当的 SKU。
在此过程中,你将:
- 更新模板以包含
location
参数。 - 更新模板以包括资源名称的参数和变量。
- 使用表达式为参数设置默认值。
- 更新模板以包含每个资源的 SKU 的变量。
- 测试部署,确保模板有效。
添加位置和资源名称参数
在 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 区域。查找资源定义中设置
location
和name
属性的位置,并将其更新为使用参数值。 完成后,Bicep 文件中的资源定义应如下所示:resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = { name: storageAccountName location: location sku: { name: 'Standard_LRS' } kind: 'StorageV2' properties: { accessTier: 'Hot' } } resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = { name: appServicePlanName location: location sku: { name: 'F1' } } resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = { name: appServiceAppName location: location properties: { serverFarmId: appServicePlan.id httpsOnly: true } }
保存对文件所做的更改。
为每个环境类型自动设置 SKU
在 Visual Studio Code 的 main.bicep 文件中,在上一个任务中创建的参数下面添加以下 Bicep 参数:
@allowed([ 'nonprod' 'prod' ]) param environmentType string
请注意,你在定义一个有一组允许值的参数,但你没有为这个参数指定一个默认值。
在声明
appServicePlanName
变量的行下面,添加以下变量定义:var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS' var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
请注意,你在使用三元运算符设置这些变量的值,以表示一些
if/then/else
逻辑。查找资源定义中设置
sku
属性的位置,并将其更新为使用参数值。 完成后,Bicep 文件中的资源定义应如下所示:resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = { name: storageAccountName location: location sku: { name: storageAccountSkuName } kind: 'StorageV2' properties: { accessTier: 'Hot' } } resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = { name: appServicePlanName location: location sku: { name: appServicePlanSkuName } } resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = { name: appServiceAppName location: location properties: { serverFarmId: appServicePlan.id httpsOnly: true } }
请注意,你没有参数化所有内容。 你已在资源定义中设置了一些属性,你知道这些值在部署之间不会发生变化。
保存对文件所做的更改。
验证 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@2023-05-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountSkuName
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
}
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSkuName
}
}
resource appServiceApp 'Microsoft.Web/sites@2023-12-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
参数的值。 无需指定其他参数值,因为它们具有有效的默认值。
检查你的部署
在浏览器中,返回 Azure 门户并转到资源组。 你仍然会看到一个成功的部署,因为部署使用了与第一个部署相同的名称。
选择“1 个成功”链接。
选择名为“main”的部署,然后选择“部署详细信息”以展开已部署的资源列表。
请注意,已使用随机生成的名称部署了新的 App 服务应用和存储帐户。