练习 - 重构模板以使用模块
在本练习中,你将更新之前创建的 Bicep 模板,使其对 Azure 应用服务资源使用模块。 模块有助于使主模板的意图更加明确。 如果你愿意,可以在其他模板中重用应用服务模块。
在此过程中,你将:
- 添加新的模块,并将应用服务资源移到模块中。
- 从主 Bicep 模板中引用模块。
- 为应用服务应用的主机名添加一个输出,并从模块和模板部署中发出它。
- 测试部署,确保模板有效。
添加新的模块文件
在 Visual Studio Code 中,在你创建了 main.bicep 文件的同一文件夹中,创建一个名为“模块”的新文件夹。 在“模块”文件夹中,创建一个名为 appService.bicep 的文件。 保存该文件。
将以下内容添加到 appService.bicep 文件中:
param location string param appServiceAppName string @allowed([ 'nonprod' 'prod' ]) param environmentType string var appServicePlanName = 'toy-product-launch-plan' var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1' 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 } }
请注意,你已经从 main.bicep 模板中复制了参数和变量,因为 appService.bicep 模板需要是独立的。
保存对文件所做的更改。 请注意,Visual Studio Code 没有向你显示任何红色波浪线,指明有关缺少变量、缺少参数或资源无效的警告。
从父模板添加对模块的引用
现在你有了一个完整的模块来部署应用服务资源,现在可以在父模板中引用该模块了。 由于该模块部署了应用服务资源,因此可以从父模板中删除关联的资源和变量。
在 main.bicep 文件中,删除应用服务资源,以及
appServicePlanName
和appServicePlanSkuName
变量定义。 请勿删除应用服务参数,因为你仍需要它们。 此外,不要删除存储帐户参数、变量或资源。在 main.bicep 文件底部,添加以下 Bicep 代码:
module appService 'modules/appService.bicep' = { name: 'appService' params: { location: location appServiceAppName: appServiceAppName environmentType: environmentType } }
请注意,是通过在父模板中引用参数来指定模块的参数。
保存对文件所做的更改。
添加主机名作为输出
在 appService.bicep 文件的底部,添加以下 Bicep 代码:
output appServiceAppHostName string = appServiceApp.properties.defaultHostName
此代码声明该模块的输出,它将被命名为
appServiceAppHostName
,类型为string
。 输出将从应用服务应用的defaultHostName
属性中获取其值。保存对文件所做的更改。
此输出是在将用作模块的 Bicep 文件中声明的,因此它将仅适用于父模板。 你还需要将输出返回给部署了模板的人员。
打开 main.bicep 文件,并在文件底部添加以下代码:
output appServiceAppHostName string = appService.outputs.appServiceAppHostName
请注意,此输出的声明方式与模块中输出的声明方式类似。 但这次你引用的是模块的输出,而不是资源属性。
保存对文件所做的更改。
验证 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 storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountSkuName
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
}
module appService 'modules/appService.bicep' = {
name: 'appService'
params: {
location: location
appServiceAppName: appServiceAppName
environmentType: environmentType
}
}
output appServiceAppHostName string = appService.outputs.appServiceAppHostName
appService.bicep 文件应如以下示例所示:
param location string
param appServiceAppName string
@allowed([
'nonprod'
'prod'
])
param environmentType string
var appServicePlanName = 'toy-product-launch-plan'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
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
}
}
output appServiceAppHostName string = appServiceApp.properties.defaultHostName
如果任意文件均不匹配,请复制示例或调整模板以匹配示例。
部署已更新的 Bicep 模板
在终端中运行以下 Azure CLI 命令。
az deployment group create \
--template-file main.bicep \
--parameters environmentType=nonprod
在终端中运行以下 Azure PowerShell 命令。
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-environmentType nonprod
检查你的部署
在浏览器中返回到 Azure 门户。 转到你的资源组,那里现在有两个成功的部署。
选择“2 个成功”链接。 请注意,列表中有一个名为“main”的部署,还有一个名为“appService”的新部署。
选择名为 main 的部署,然后选择“部署详细信息”以展开已部署的资源列表。
请注意,我们的模块部署出现在列表中。
选择“输出”选项卡。请注意,有一个名为 appServiceAppHostName 的输出,其中包含应用服务应用的主机名。 将主机名复制到剪贴板。
打开新的浏览器选项卡,并粘贴复制的主机名。 应会看到默认的应用服务欢迎页。
祝贺你! 你已成功为出色的应用部署好了基础内容。