一,引言

  当我们在使用 Azure Bicep 的时候会出现以下几个问题:

1)文件中有很多地方会重用很多相同的值

2)输入参数可以在统一的地方进行修改

带着这些问题,我们开始今天的内容,学习如何在 Bicep 中使用变量。

--------------------我是分割线--------------------

1,Azure Bicep 开发利器​

​2,Azure Bicep(二)语法简介​

​3,Azure Bicep(三)变量控制​

二,正文

1,语法

在 Bicep 中声明变量并给其初值时非常简单的。如下图所示,为标准的参数赋值的语句



param runtime string='.NET 6'


Bicep 语句中的变量的定义类似于其他语言,但是也有它的奇特之处,我称它为 “Azure Bicep 语法糖”



var myString = 'some string value'
var myNull = null
var location = resourceGroup().location


以上的语句中,我们不难看出,

第一个变量没有类型

第二个变量没有类型,而且变量默认值为 null

第三个变量的默认值为表达式

2,使用参数,变量

常见的情况时在变量声明中使用参数



//targetScope='resourceGroup' Default Deplay Target
param webAppName string = toLower('cnbateblogweb')
param webSiteName string=toLower('${webAppName}-appservice')


变量也是一样的,但是需要注意的时,我们不能在变量使用的时候引入循环,这个是不允许的



var name = 'Allen'
var str= 'Hello, ${name}!'


3,资源属性

除了使用参数和变量之外,还可以使用资源属性来创建变量 planid



//targetScope='resourceGroup' Default Deplay Target
param webAppName string = toLower('cnbateblogweb')
param webSiteName string = toLower('${webAppName}-appservice')
param runtime string = '.NET 6'
param webAppPlanName string = toLower('${webAppName}-appserviceplan')
param location string = resourceGroup().location // Location for all resources

resource appServicePlan 'Microsoft.Web/serverfarms@2020-12-01' = {
name: webAppPlanName
location: location
sku: {
name: 'F1'
capacity: 1
}
}

var planid = '${appServicePlan.id}'

resource webApplication 'Microsoft.Web/sites@2018-11-01' = {
name: webSiteName
location: location
properties: {
serverFarmId: planid
siteConfig: {
linuxFxVersion: runtime
}
}
}


4,模块

如果模块在 outpus 部分中返回一些值,它们也可以用于变量声明。模块在输出中返回完整的存储帐户对象,然后我们在主模板中使用这些对象

main.bicep



module stg 'storageaccount/storage.bicep' = {
name: 'storageDeployment'
params: {
storageAccountName: 'cnbateblogsa'
}
}

var myTag = '${stg.outputs.storageAccount.kind}-${stg.outputs.storageAccount.sku.name}'


storage.bicep



param storageAccountName string

resource stg 'Microsoft.Storage/storageAccounts@2021-02-01' = {
name: storageAccountName
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}

output storageAccount object = stg


 

5,循环

使用循环来初始化变量,并且可以使用循环定义多个资源模块



// Creating a variable using a for-loop
var secretsValues = [for i in range(0, 3): {
name: 'secret${i}'
value: 'supersecretvalue${i}'
}]

// Assuming that a key vault already exists
resource kv 'Microsoft.KeyVault/vaults@2019-09-01' existing = {
name: 'kv-contoso'
}

// Using variable to create multiple resources
resource secrets 'Microsoft.KeyVault/vaults/secrets@2019-09-01' = [for secret in secretsValues: {
name: secret.name
parent: kv
properties: {
value: secret.value
}
}]