这可以实现,但对于 Bicep 来说这不是一个好的解决方案,因为需要修补 OS 磁盘以关联 diskAccess 资源,而目前还没有这种关联可用 - afaik - 作为 ARM 或 Bicep 中的单独资源。因此,需要一些“Bicep module hopping”方法来分阶段实现这种修补。
我为虚拟机扩展了现有的vm.bicep 模板并为磁盘添加了一个子网:
...
{
name: subnetDiskName
properties: {
addressPrefix: subnetDiskPrefix
privateEndpointNetworkPolicies: 'Disabled'
}
}
...
在vm.bicep 的末尾我添加了对这个子网的引用,这样我就可以将它作为参数传递给下一个阶段。修补需要分为 2 个阶段/模块:
- 再次获取/获取操作系统磁盘作为对象
- PATCH / PUT OS 磁盘与现有对象数据 + 引用
diskAccess 资源
...
resource subnetDisk 'Microsoft.Network/virtualNetworks/subnets@2021-02-01' existing = {
name: subnetDiskName
parent: vnet
}
module patchDisk 'get-patch-disk.bicep' = {
name: 'getPatchDisk'
params: {
virtualMachineName: virtualMachineName
diskName: vm.properties.storageProfile.osDisk.name
location: location
subnetId: subnetDisk.id
}
}
对于第 1 阶段 get-patch-disk.bicep,只需将当前 OS 磁盘作为对象检索并传递:
param virtualMachineName string
param diskName string
param location string = resourceGroup().location
param subnetId string
resource vmDiskGet 'Microsoft.Compute/disks@2020-12-01' existing = {
name: diskName
}
module vmDiskPatch 'patch-disk.bicep' = {
name: 'patchDisk'
params: {
virtualMachineName: virtualMachineName
diskName: diskName
vmDiskGet: vmDiskGet
location: location
subnetId: subnetId
}
}
然后在第 2 阶段 patch-disk.bicep 创建 diskAccess 资源以及 privateEndpoint 并将其修补到操作系统磁盘中,方法是从刚刚检索到的对象中传输所有给定属性并添加私有磁盘访问所需的属性。
param virtualMachineName string
param diskName string
param location string = resourceGroup().location
param vmDiskGet object
param subnetId string
var privateEndpointName = 'privateEndpoint${uniqueString(resourceGroup().name)}'
var privateLinkConnectionName = 'privateLink${uniqueString(resourceGroup().name)}'
var diskAccessName = 'diskAccess${uniqueString(resourceGroup().name)}'
resource diskAccess 'Microsoft.Compute/diskAccesses@2020-12-01' = {
name: diskAccessName
location: location
tags: {
vmName: virtualMachineName
}
}
resource privateEndpoint 'Microsoft.Network/privateEndpoints@2020-06-01' = {
name: privateEndpointName
location: location
tags: {
vmName: virtualMachineName
}
properties: {
subnet: {
id: subnetId
}
privateLinkServiceConnections: [
{
name: privateLinkConnectionName
properties: {
privateLinkServiceId: diskAccess.id
groupIds: [
'disks'
]
}
}
]
}
}
resource vmDiskPut 'Microsoft.Compute/disks@2020-12-01' = {
name: diskName
location: vmDiskGet.location
properties: {
diskAccessId: diskAccess.id
networkAccessPolicy: 'AllowPrivate'
creationData: vmDiskGet.properties.creationData
diskSizeGB: vmDiskGet.properties.diskSizeGB
}
}
免责声明
我想更聪明的解决方案是在一个 Bicep 模板中创建 diskAccess 资源以及 VM,然后返回 diskAccess.id 和 vm.properties.storageProfile.osDisk.name 作为输出参数。使用这些输出参数,使用简单的az disk update -n "{diskName}" --network-access-policy AllowPrivate --disk-access "{diskAccessId}" 进行修补。