먼저 Project Bicep, Azure Explorer 템플릿 DSL 보기
나는 ARM 템플릿을 오랫동안 사용해서 복잡한 자원을 구축할 때 읽기 쉽고 명확하며 중용성 사이에서 진퇴양난을 겪는다.나는 간단한 템플릿을 가지고 읽기 쉽지만, 환경을 뛰어넘는 여러 배치에 보급하기는 쉽지 않다.
예를 들어, 명명 규칙템플릿에서 명명 규칙을 강제로 사용하려면 복잡한 사용자 함수와 변수를 만들어서 템플릿을 읽고 수정하기 어려울 수 있습니다.
ARM에서 사용하는 JSON 구문은 복잡할 수 있습니다.그것을 배우는 데는 시간과 노력이 필요하다.그것은 원활하지 않아서, 너는 다섯 가지 부분 (매개 변수, 변수, 함수, 자원, 출력) 이 필요하다.ARM 템플릿을 사용하여 프로젝트를 시작한 팀이 PowerShell, Azure CLI 또는 포털을 사용하여 프로젝트를 종료하는 것을 자주 볼 수 있습니다.때로는 한두 사람만이 ARM에서 충분한 실험을 했고 인프라에서 코드로 일했기 때문에 그들은 배치 과정에서 제한을 받았다.
그러나 최근에 마이크로소프트가 새로운 프로젝트를 시작하여Azure에서 Infra를 코드로 하는 속도를 가속화하는 데 도움을 주었다.이두근 계획.Bicep은 보다 쉽게 배우고 조작할 수 있는 팔 템플릿으로 영역별로 특정된 언어다.그것은 편역되었다.bicep 파일을 ARM JSON으로 변환하여 Azure에 리소스를 배치하여 JSON 구문을 Azure API 사이의 중간 언어로 만듭니다.
그것은 여전히 시험 단계에 있어서 현재 아직 생산에서 사용하는 것을 건의하지 않는다.
우리들은 이 언어를 깊이 탐구합시다
우선, 이두근 이진 파일을 설치해야 합니다.검사Project Github Page의 설명
그리고 첫 번째 이두근 파일을 만들 수 있습니다.test라는 디렉토리에 빈 Bicep 파일을 만듭니다.이두근.다음을 입력합니다.
Bicep build test.bicep
Bicep 언어로 VM을 구성하여 보다 실제적인 예를 만들어 보겠습니다.스토리지 계정, Vnet, 서브넷, 데이터 디스크와 NIC가 있는 VM이 필요합니다.JSON 프로젝트의 경우 입력부터 시작해야 합니다.ARM 템플릿의 입력은 사용자가 입력한 매개변수와 동적 및 정적 값의 변수 두 부분으로 나뉘어 있습니다.
이두근 문법에서 사용할 수 있다
param name type
이두근 파일이 JSON 파일로 구축되기 때문에 가능하면 camel case (my Resource) 명칭 약정을 따라야 합니다.그러나 만약 네가 규칙을 잊었다면 모든 것은 일어나지 않을 것이다다섯 개의 가능한 값이 있습니다:string, int,array,object,bool.일부 내용이 부족하다고 생각되면, securestring과 secureobject를 선택하십시오.사실은 그렇지 않다.그것들은 문자열과 대상 형식의 수식자로 실현되었다.
param localAdminPassword string {
secure: true
}
매개 변수에 수식자를 하나 이상 도입하는 것을 볼 수 있습니다.수정자는 JSON ARM 템플릿의 수정자와 유사합니다.허용 값, 기본값, 문자열, 그룹의 제한, 정수의 최소값, 최대값을 실현할 수 있습니다.설명을 추가할 수도 있습니다.param vmPrefix string {
minLength: 1
maxLength: 9
}
변수는 상수, 영원히 변하지 않는 값과 계산 값으로 사용할 수 있다.변수를 선언하려면 다음과 같이 하십시오.
var defaultLocation = 'francecentral'
너는 계산을 좀 할 수 있다.예를 들어 두 개의 매개 변수를 연결하여 서버 이름을 구축할 수 있다.param environmentName string {
allowed: [
'prod'
'dev'
]
}
param vmPrefix string {
minLength: 1
maxLength: 9
}
var defaultVmName = '${vmPrefix}-${environmentName}'
ARM 템플릿에서처럼 Concat 함수를 사용할 수도 있습니다.var VmName = concat('${vmPrefix}','-','${environmentName}')
두 가지 차이점은 첫 번째는 Format ARM 함수를, 두 번째는 Concat ARM 함수를 사용한다는 점입니다.너도 이두근에서 표정을 사용할 수 있다.비교 연산자, 수학 표현식, 일반적인 ARM 템플릿 표현식(예: resourceGroup) 사용 가능
var diskSku = environmentName == 'prod' ? 'Premium_LRS' : 'Standard_LRS'
리소스 정의는 ARM 템플릿 리소스 선언의 단순화입니다.Bicep의 리소스는 resource 키워드 및 식별자로 시작합니다.식별자는 자원 이름이 아닙니다. 이 값은 Bicep 파일의 다른 자원 중의 자원을 인용하는 데 사용됩니다.식별자 뒤에는 자원 유형 및 API 버전이 xxx/형식으로 표시됩니다.xxx@20XX-XX-XX 및 리소스 resource vmDataDisk 'Microsoft.Compute/disks@2019-07-01' = {
name: '${defaultVmName}-vhd'
location: defaultLocation
sku: {
name: 'Premium_LRS'
}
properties: {
diskSizeGB: 32
creationData: {
createOption: 'empty'
}
}
보시다시피 리소스 바디는 JSON 버전의 단순화 버전입니다.인상적인 것은 (적어도 나에게는) 의존 관계를 관리할 필요가 없다는 것이다.이두근 자동 처리.이전 예에서 vmDataDisk를 식별자로 하는 데이터 디스크 자원을 만들었습니다.가상 시스템에서 디스크 접속에 필요한 ID를 검색하는 데 사용할 수 있습니다.
dataDisks: [
{
name: '${defaultVmName}-vhd'
createOption: 'attach'
caching: 'ReadOnly'
lun: 0
managedDisk: {
id: vmDataDisk.id
}
}
]
디스크를 연결하려면 JSON에서처럼 ResourceID()를 사용할 필요가 없습니다. 식별자만 사용하면 됩니다.Bicep은 생성된 JSON 파일에서 ResourceId()로 변환됩니다. "managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks', format('{0}-vhd', variables('defaultVmName')))]"
또한 Bicep은 배포 명령에 필요한 dependsOn 자문을 작성했습니다."dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
"[resourceId('Microsoft.Compute/disks', format('{0}-vhd', variables('defaultVmName')))]",
"[resourceId('Microsoft.Network/networkInterfaces', variables('defaultVmNicName'))]"
]
전체 해결 방안을 보십시오. 서브넷이 있는 Vnet 하나, vm 진단에 사용되는 저장 계정 하나, 데이터 디스크 하나,nic 하나, vm 하나.// Global Data
param environmentName string {
allowed: [
'prod'
'dev'
]
}
var defaultLocation = resourceGroup().location
// Storage Account data
param storageAccountName string {
minLength: 3
maxLength: 24
}
var sku = environmentName == 'prod' ? 'Standard_GRS' : 'Standard_LRS'
resource diagsAccount 'Microsoft.Storage/storageAccounts@2019-06-01' = {
name: storageAccountName
location: defaultLocation
sku: {
name: sku
}
kind: 'Storage'
}
// Vm Related Data
param numberOfVM int {
minValue: 1
maxValue: 3
}
var diskSku = environmentName == 'prod' ? 'Premium_LRS' : 'Standard_LRS'
param vmSku string {
allowed: [
'Standard_F2s'
'Standard_B2ms'
]
}
param vmOS string {
default: '2019-Datacenter'
allowed: [
'2016-Datacenter'
'2016-Datacenter-Server-Core'
'2016-Datacenter-Server-Core-smalldisk'
'2019-Datacenter'
'2019-Datacenter-Server-Core'
'2019-Datacenter-Server-Core-smalldisk'
]
}
param localAdminPassword string {
secure: true
metadata: {
description: 'password for the windows VM'
}
}
param vmPrefix string {
minLength: 1
maxLength: 9
}
var defaultVmName = '${vmPrefix}-${environmentName}'
var defaultVmNicName = '${defaultVmName}-nic'
resource vmNic 'Microsoft.Network/networkInterfaces@2017-06-01' = {
name: defaultVmNicName
location: defaultLocation
properties: {
ipConfigurations: [
{
name: 'ipconfig1'
properties: {
subnet: {
id: '${vnet.id}/subnets/front'
}
privateIPAllocationMethod: 'Dynamic'
}
}
]
}
}
resource vmDataDisk 'Microsoft.Compute/disks@2019-07-01' = {
name: '${defaultVmName}-vhd'
location: defaultLocation
sku: {
name: 'Premium_LRS'
}
properties: {
diskSizeGB: 32
creationData: {
createOption: 'empty'
}
}
}
resource vm 'Microsoft.Compute/virtualMachines@2019-07-01' = {
name: defaultVmName
location: defaultLocation
properties: {
osProfile: {
computerName: defaultVmName
adminUsername: 'localadm'
adminPassword: localAdminPassword
windowsConfiguration: {
provisionVmAgent: true
}
}
hardwareProfile: {
vmSize: ' Standard_F2s'
}
storageProfile: {
imageReference: {
publisher: 'MicrosoftWindowsServer'
offer: 'WindowsServer'
sku: vmOS
version: 'latest'
}
osDisk: {
createOption: 'FromImage'
}
dataDisks: [
{
name: '${defaultVmName}-vhd'
createOption: 'attach'
caching: 'ReadOnly'
lun: 0
managedDisk: {
id: vmDataDisk.id
}
}
]
}
networkProfile: {
networkInterfaces: [
{
properties: {
primary: true
}
id: vmNic.id
}
]
}
diagnosticsProfile: {
bootDiagnostics: {
enabled: true
storageUri: diagsAccount.properties.primaryEndpoints.blob
}
}
}
}
//Network related data
param vnetName string {
metadata: {
description: 'name of the Virtual network'
}
}
var vnetConfig = {
vnetprefix: '10.0.0.0/21'
subnet: {
name: 'front'
addressPrefix: '10.0.0.0/24'
}
}
resource vnet 'Microsoft.Network/virtualNetworks@2020-05-01' = {
name: vnetName
location: defaultLocation
properties: {
addressSpace: {
addressPrefixes: [
vnetConfig.vnetprefix
]
}
subnets: [
{
name: vnetConfig.subnet.name
properties: {
addressPrefix: vnetConfig.subnet.addressPrefix
}
}
]
}
}
우선, 변수, 매개 변수, 자원이 완전히 혼합된 것을 볼 수 있다.나는 이런 방식으로 자원을 관리하는 것을 좋아한다. 한 자원과 관련된 변수와 파라미터를 사용하는 것이 더욱 간단하다.이두근은 이런 행위를 허용한다.또한 Bicep에서 한 줄 주석(//)과 여러 줄 주석(//**/
현재 이두근 파일을 구축할 수 있다.
Bicep build vm.bicep
가상 머신을 생성합니다.json 파일은 같은 디렉터리에 있습니다.이제 JSON 파일을 새 az Resource Group Deployment와 함께 사용하여Azure에 자원을 만들 수 있습니다.이두근 프로젝트는 여전히 알파 단계에 있다.버그를 발견할 수 있습니다. (이 예에서 issue on Github 를 만들고 거기에 some now limitations.현재 기본적인 이두근 파일만 만들 수 있습니다.이 항목은 활성 상태이며 새 기능은 이 도구를 강화합니다.Bicep은 머지않아 Azure 코드로서의 창작 인프라를 더욱 쉽게 만들 것이다.
Reference
이 문제에 관하여(먼저 Project Bicep, Azure Explorer 템플릿 DSL 보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/omiossec/first-look-at-project-bicep-an-azure-resource-manager-templates-dsl-4jif텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)