0
点赞
收藏
分享

微信扫一扫

使用BICEP实现Azure资源自动创建 - BICEP实战

下边就来实际感觉下BICEP的上手体验,首先来对比下ARM Template和BICEP的基础语法,对比完了就能感受到BICEP的语法有多简洁了


定义参数

BICEP

param demoParam string = 'Contoso'

ARM Template

"parameters": {
"demoParam": {
"type": "string",
"defaultValue": "param"
}
}

字符串拼接

BICEP

'${prefix}-vm-{suffix}'

ARM Template

[concat(parameters('prefix'), '-vm', parameters('suffix'))]

获取部署资源的属性

BICEP

nic1.id

ARM Template

[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]

其他的例子还有很多,不过我想这几个应该已经足够有说服力了,可以发现BICEP的语法更偏向于编程语言,给用户的亲和度更高,而如果想实际用BICEP部署一些资源的话,可以先从最简单的说起

首先来部署一个VNET,其中可以包括几个subnet

先把代码准备好,可以发现代码其实都很简单,要比同等级别下ARM Template的代码简单很多,和Terraform非常类似,尤其是resource声明那里

@description('Name of VNET')
param vnetName string = 'BICEP-VNET'

@description('name of subnet')
param subnetName string = 'appsubnet'

@description('ip range of subnet')
param vnetIPRange string = '10.10.0.0/16'

@description('ip range of subnet')
param subnetIPRange string = '10.10.0.0/24'

@description('location which vnet should be deployed')
param location string = resourceGroup().location

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2021-05-01' = {
name: vnetName
location: location
properties: {
addressSpace: {
addressPrefixes: [
vnetIPRange
]
}
subnets: [
{
name: subnetName
properties: {
addressPrefix: subnetIPRange
}
}
]
}
}

代码准备好之后就可以开始部署了,部署的方式和ARM Template是完全一样的,运行的命令都是之前的命令,所有动作都是后台完成的,无需用户干涉,前提是你的AZ CLI或者PowerShell版本一定要够

这里用CLI举例,首先可以用whatif来看下部署之后会发生什么,这个输出结果看起来还是挺清爽的,看着和Terraform plan或者GIT的输出差不多

az deployment group what-if --template-file .\main.bicep --resource-group bicep

使用BICEP实现Azure资源自动创建 - BICEP实战_BICEP


接下来就可以实际部署了

az deployment group create --template-file .\main.bicep --resource-group bicep

使用BICEP实现Azure资源自动创建 - BICEP实战_Azure_02

部署的过程相当快,毕竟只是部署了一个VNET,很快在portal就可以看到了

使用BICEP实现Azure资源自动创建 - BICEP实战_Terraform_03


以上只是最原始的用法,还可以用一些更复杂的语法,比如使用if进行条件判断,使用object类型的变量以及secure string等

代码

@description('location which VM should be deployed')
param location string = resourceGroup().location

@description('username of vm')
param vmUserName string='vmadmin'

@description('pwd of vm')
@secure()
param vmPwd string

@description('vm tag')
param vmTag object = {
EnvironmentName: 'Prod'
Dept: 'Finance'
CreateBy: 'BICEP'
}

@description('Env')
param Env string = 'Prod'


resource NIC 'Microsoft.Network/networkInterfaces@2020-11-01' = {
name: 'vmNic'
location: location
properties: {
ipConfigurations: [
{
name: 'IP'
properties: {
privateIPAllocationMethod: 'Dynamic'
subnet: {
id: resourceId('Microsoft.Network/virtualNetworks/subnets','BICEP-VNET','appsubnet')
}
}
}
]
}
}


resource ubuntuVM 'Microsoft.Compute/virtualMachines@2020-12-01' = {
name: 'BICEPVM'
location: location
tags:vmTag
properties: {
hardwareProfile: {
vmSize: 'Standard_B1ms'
}
osProfile: {
computerName: 'BICEPVM'
adminUsername: vmUserName
adminPassword: vmPwd
}
storageProfile: {
imageReference: {
publisher: 'Canonical'
offer: 'UbuntuServer'
sku: '16.04-LTS'
version: 'latest'
}
osDisk: {
name: 'OS-DISK'
caching: 'ReadWrite'
createOption: 'FromImage'
}

}
networkProfile: {
networkInterfaces: [
{
//隐式关联
id: NIC.id
}
]
}
}
}

resource storageaccount 'Microsoft.Storage/storageAccounts@2021-02-01' = if(Env == 'Prod') {
name: 'sa${take(uniqueString(resourceGroup().id),10)}'
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}



output vmIP string = NIC.properties.ipConfigurations[0].properties.privateIPAddress


whatif进行检查

az deployment group what-if --template-file .\main.bicep --resource-group bicep --parameters Env='Dev'

这里会要求输入pwd,因为是secure string,所以输入时也不会显示

使用BICEP实现Azure资源自动创建 - BICEP实战_IAC_04

因为指定了parameter是DEV,所以storage account没有部署

使用BICEP实现Azure资源自动创建 - BICEP实战_BICEP_05

如果不指定env,使用模板中定义的Prod进行部署,则会部署storage account

az deployment group what-if --template-file .\main.bicep --resource-group bicep

最终部署

az deployment group create --template-file .\main.bicep --resource-group bicep

使用BICEP实现Azure资源自动创建 - BICEP实战_Terraform_06


Tag也出来了

使用BICEP实现Azure资源自动创建 - BICEP实战_BICEP_07

举报

相关推荐

0 条评论