Linter 规则 - 无部署资源
当模板在根级别包含 Microsoft.Resources/deployments
资源时,此 Linter 规则会发出警告。
Linter 规则代码
请在 Bicep 配置文件中使用以下值自定义规则设置:
no-deployments-resources
解决方案
在 ARM 模板中,可以使用 Microsoft.Resources/deployments
资源通过嵌套或链接模板来重用或模块化模板。 有关详细信息,请参阅部署 Azure 资源时使用链接模板和嵌套模板 以下 ARM 模板是嵌套模板的示例:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}{1}', 'store', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2024-03-01",
"name": "nestedTemplate1",
"properties": {
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
}
}
]
}
在 Bicep 中,仍可以使用 Microsoft.Resources/deployments
资源来嵌套 ARM 模板或链接外部 ARM 模板。 但是,这并不是一个好主意,因为多次评估会导致不安全和棘手的行为。 此外,在创建 Bicep 文件时,Visual Studio Code 几乎不提供任何验证和自完成,因此很难使用。 以下 Bicep 文件未能通过此测试,因为模板包含根级别的 Microsoft.Resources/deployments
资源。
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
resource nestedTemplate1 'Microsoft.Resources/deployments@2024-03-01' = {
name: 'nestedTemplate1'
properties:{
mode: 'Incremental'
template: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
contentVersion: '1.0.0.0'
resources: [
{
type: 'Microsoft.Storage/storageAccounts'
apiVersion: '2023-04-01'
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
]
}
}
}
若要解决此问题,可以使用 Bicep CLI 反向编译命令。 例如,可以将前面的 ARM 模板反向编译为以下 Bicep 文件:
main.bicep:
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
module nestedTemplate1 './nested_nestedTemplate1.bicep' = {
name: 'nestedTemplate1'
params: {
storageAccountName: storageAccountName
location: location
}
}
nested_nestedTemplate1.bicep:
param storageAccountName string
param location string
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
此外,还可以使用 module 语句来引用 ARM 模板。
main.bicep:
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
module nestedTemplate1 './createStorage.json' = {
name: 'nestedTemplate1'
params: {
storageAccountName: storageAccountName
location: location
}
}
createStorage.json:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}{1}', 'store', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
后续步骤
有关 Linter 的详细信息,请参阅使用 Bicep Linter。