Azure ARM 模板部署:添加独立的现有数据磁盘
Azure ARM template deployment: Adding addtional datadisks unattaches existing
看来我遇到了 ARM 模板的限制,希望有人可以提供解决方法的建议。
我的 deployVM.json 模板使用复制功能创建托管数据磁盘,这没有问题,但是,我需要附加一个不遵循复制模式的附加数据磁盘。
Properties.storageprofile:
"copy": [
{
"name": "dataDisks",
"count": "[length(parameters('sharedVariables').disks.config)]",
"input": {
"name": "[concat(variables('vmName'),'-',parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].name)]",
"diskSizeGB": "[parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].diskSizeGB]",
"lun": "[parameters('sharedVariables').disks.config[copyIndex('dataDisks')].lun]",
"createOption": "Empty",
"managedDisk": {
"storageAccountType": "[parameters('sharedVariables').disks.accountType]"
}
}
}
]
不允许创建 datadisks[]
属性 的第二个实例,
创建整个VM资源的第二个实例也不是
允许,
所以我创建了一个子模板来绕过上述限制。子模板创建数据磁盘并将其附加到虚拟机,但是在执行附加时,它取消附加在deployVM.json中附加的磁盘:
"resources" : [
//Create a managed disk using an existing VHD
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/disks",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"location": "[resourceGroup().location]",
"tags": {
"Purpose": "Managed disk containing VHD of installation media",
"createdBy": "[parameters('sharedVariables').createdBy]"
},
"sku": {
"name": "[parameters('sharedVariables').media.storageAccountType]"
},
"properties": {
"creationData": {
"createOption": "Import",
"sourceUri": "[parameters('sharedVariables').media.sourceVhdUri]"
},
"diskSizeGB": "[parameters('sharedVariables').media.vhdManagedDiskSize]"
}
},
//Attach managed disk to existing VM
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[resourceGroup().location]",
"dependsOn": [ "[concat(parameters('vmName'),'-mediadisk-001')]" ],
"properties": {
"storageProfile": {
"dataDisks": [
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
}
}
}
]
也许我应该在不创建托管数据磁盘的情况下尝试附加。毕竟,它是一个 VHD,所以在子模板中,上面的内容被替换为:
"resources" : [
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[resourceGroup().location]",
"dependsOn": [],
"properties": {
"storageProfile": {
"dataDisks": [
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "FromImage",
"image": {
"uri": "concat(parameters('vmName'),'-mediadisk-001')"
},
"vhd": {
"uri": "[parameters('sharedVariables').media.sourceVhdUri]"
},
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
}
}
}
]
然后它开始抱怨"Addition of a blob based disk to VM with managed disks is not supported
。真的,这就是说不能同时使用托管磁盘和存储帐户磁盘吗?最后一次尝试,我删除了以下行:
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
但同样的错误。
我可以在门户中重新附加磁盘,而我唯一的其他想法是在子模板中创建另一个 copy[]
函数来重新附加,而无需返回存储帐户磁盘。这听起来很疯狂,所以我假设这是一个功能请求,或者我需要学习!
TIA
更新
我已经从 deployVM.json 模板中删除了数据磁盘资源并添加了两个子模板,每个子模板一个 "type" 数据磁盘。 copy() 和单个 VHD,但当第二个子级附加其磁盘时,它仍在从第一个子级分离 copy() 磁盘。
所以它分离现有磁盘是因为它使用声明性方法。您的第二个部署仅定义了 1 个数据磁盘,因此它可以满足您的要求。虚拟机上有 1 个磁盘。
你真的没有很多选择来克服这个问题。使用外部工具(如 powershell)为您创建 json 并直接将其传递或使用 arm 模板创建一个包含所有磁盘的 json 对象并将其传递到资源中。
[
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
},
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
示例 powershell 对象以反映:
@(@{lun=xxx;...},@{...})
看来我遇到了 ARM 模板的限制,希望有人可以提供解决方法的建议。
我的 deployVM.json 模板使用复制功能创建托管数据磁盘,这没有问题,但是,我需要附加一个不遵循复制模式的附加数据磁盘。
Properties.storageprofile:
"copy": [
{
"name": "dataDisks",
"count": "[length(parameters('sharedVariables').disks.config)]",
"input": {
"name": "[concat(variables('vmName'),'-',parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].name)]",
"diskSizeGB": "[parameters('sharedVariables').disks.config[CopyIndex('dataDisks')].diskSizeGB]",
"lun": "[parameters('sharedVariables').disks.config[copyIndex('dataDisks')].lun]",
"createOption": "Empty",
"managedDisk": {
"storageAccountType": "[parameters('sharedVariables').disks.accountType]"
}
}
}
]
不允许创建
datadisks[]
属性 的第二个实例,创建整个VM资源的第二个实例也不是 允许,
所以我创建了一个子模板来绕过上述限制。子模板创建数据磁盘并将其附加到虚拟机,但是在执行附加时,它取消附加在deployVM.json中附加的磁盘:
"resources" : [
//Create a managed disk using an existing VHD
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/disks",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"location": "[resourceGroup().location]",
"tags": {
"Purpose": "Managed disk containing VHD of installation media",
"createdBy": "[parameters('sharedVariables').createdBy]"
},
"sku": {
"name": "[parameters('sharedVariables').media.storageAccountType]"
},
"properties": {
"creationData": {
"createOption": "Import",
"sourceUri": "[parameters('sharedVariables').media.sourceVhdUri]"
},
"diskSizeGB": "[parameters('sharedVariables').media.vhdManagedDiskSize]"
}
},
//Attach managed disk to existing VM
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[resourceGroup().location]",
"dependsOn": [ "[concat(parameters('vmName'),'-mediadisk-001')]" ],
"properties": {
"storageProfile": {
"dataDisks": [
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
}
}
}
]
也许我应该在不创建托管数据磁盘的情况下尝试附加。毕竟,它是一个 VHD,所以在子模板中,上面的内容被替换为:
"resources" : [
{
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[resourceGroup().location]",
"dependsOn": [],
"properties": {
"storageProfile": {
"dataDisks": [
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "FromImage",
"image": {
"uri": "concat(parameters('vmName'),'-mediadisk-001')"
},
"vhd": {
"uri": "[parameters('sharedVariables').media.sourceVhdUri]"
},
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
}
}
}
]
然后它开始抱怨"Addition of a blob based disk to VM with managed disks is not supported
。真的,这就是说不能同时使用托管磁盘和存储帐户磁盘吗?最后一次尝试,我删除了以下行:
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
但同样的错误。
我可以在门户中重新附加磁盘,而我唯一的其他想法是在子模板中创建另一个 copy[]
函数来重新附加,而无需返回存储帐户磁盘。这听起来很疯狂,所以我假设这是一个功能请求,或者我需要学习!
TIA
更新 我已经从 deployVM.json 模板中删除了数据磁盘资源并添加了两个子模板,每个子模板一个 "type" 数据磁盘。 copy() 和单个 VHD,但当第二个子级附加其磁盘时,它仍在从第一个子级分离 copy() 磁盘。
所以它分离现有磁盘是因为它使用声明性方法。您的第二个部署仅定义了 1 个数据磁盘,因此它可以满足您的要求。虚拟机上有 1 个磁盘。
你真的没有很多选择来克服这个问题。使用外部工具(如 powershell)为您创建 json 并直接将其传递或使用 arm 模板创建一个包含所有磁盘的 json 对象并将其传递到资源中。
[
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
},
{
"lun": "[add(length(parameters('sharedVariables').disks.config),1)]",
"name": "[concat(parameters('vmName'),'-mediadisk-001')]",
"createOption": "Attach",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks/', concat(parameters('vmName'),'-mediadisk-001'))]"
}
}
]
示例 powershell 对象以反映:
@(@{lun=xxx;...},@{...})