英文:
Attach disks to multiple VMs using Terraform
问题
I want to attach disks of different sizes to a particular VM. My code is as follows.
"Virtual_machine_id" was imported through for loop, but could not be written.
My "output" works fine, but it actually causes problems with the "terraform plan".
- manageddisk.tf
```plaintext
我想将不同大小的磁盘附加到特定的虚拟机上。我的代码如下。
"Virtual_machine_id" 是通过循环导入的,但无法编写。
我的"output"工作正常,但实际上会导致"terraform plan"出现问题。
- manageddisk.tf
- var.tf
variable "vm_template" {
type = map(any)
default = {
vm1 = {
vm_name = "test01"
os_publisher = "MicrosoftWindowsServer"
os_offer = "WindowsServer"
os_sku = "2022-datacenter-azure-edition"
license_type = "Windows_Server"
os_version = "latest"
osdisk_type = "StandardSSD_LRS"
osdisk_size = "1024"
vm_type = "Standard_D4s_v5"
}
vm2 = {
vm_name = "test02"
os_publisher = "MicrosoftWindowsServer"
os_offer = "WindowsServer"
os_sku = "2022-datacenter-azure-edition"
license_type = "Windows_Server"
os_version = "latest"
osdisk_type = "StandardSSD_LRS"
osdisk_size = "1024"
vm_type = "Standard_D4s_v5"
}
}
}
variable "disk_template" {
type = map(any)
default = {
disk1 = {
managed_disk_name = "data"
managed_disk_type = "Standard_LRS"
managed_disk_size = "10"
}
disk2 = {
managed_disk_name = "log"
managed_disk_type = "Standard_LRS"
managed_disk_size = "10"
}
disk3 = {
managed_disk_name = "backup"
managed_disk_type = "Standard_LRS"
managed_disk_size = "10"
}
}
}
However, virtual_machine_id is the problem.
然而,virtual_machine_id 是问题所在。
Successfully attaches disk by acquiring "virtual_machine_id".
通过获取"virtual_machine_id"成功附加磁盘。
I succeeded with the code below. But not yet.
我使用下面的代码成功了。但还没有。
I didn't understand this.
我不明白这个。
Managed Disk
# 托管磁盘
Please let me know if you need further assistance.
英文:
I want to attach disks of different sizes to a particular VM. My code is as follows.
"Virtual_machine_id" was imported through for loop, but could not be written.
My "output" works fine, but it actually causes problems with the "terraform plan".
- manageddisk.tf
##
data "azurerm_virtual_machine" "vm_id" {
for_each = var.vm_template
name = each.value.vm_name
resource_group_name = data.azurerm_resource_group.system_rg_name.name
}
resource "azurerm_managed_disk" "managed_disk" {
for_each = {
for key, value in var.disk_template : key => value
if value.managed_disk_size != "0"
}
name = "${each.value.managed_disk_name}"
location = var.location
resource_group_name = data.azurerm_resource_group.system_rg_name.name
storage_account_type = each.value.managed_disk_type
create_option = "Empty"
disk_size_gb = each.value.managed_disk_size
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
for_each = {
for key, value in var.disk_template : key => value
if value.managed_disk_size != "0"
}
managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
lun = each.value.managed_disk_size
caching = "ReadWrite"
virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
}
output "vm_id" {
value = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
}
- var.tf
variable "vm_template" {
type = map(any)
default = {
vm1 = {
vm_name = "test01"
os_publisher = "MicrosoftWindowsServer"
os_offer = "WindowsServer"
os_sku = "2022-datacenter-azure-edition"
license_type = "Windows_Server"
os_version = "latest"
osdisk_type = "StandardSSD_LRS"
osdisk_size = "1024"
vm_type = "Standard_D4s_v5"
}
vm2 = {
vm_name = "test02"
os_publisher = "MicrosoftWindowsServer"
os_offer = "WindowsServer"
os_sku = "2022-datacenter-azure-edition"
license_type = "Windows_Server"
os_version = "latest"
osdisk_type = "StandardSSD_LRS"
osdisk_size = "1024"
vm_type = "Standard_D4s_v5"
}
}
}
variable "disk_template" {
type = map(any)
default = {
disk1 = {
managed_disk_name = "data"
managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
managed_disk_size = "10"
}
disk2 = {
managed_disk_name = "log"
managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
managed_disk_size = "10"
}
disk3 = {
managed_disk_name = "backup"
managed_disk_type = "Standard_LRS" # Standard_LRS StandardSSD_ZRS Premium_LRS PremiumV2_LRS Premium_ZRS StandardSSD_LRS UltraSSD_LRS
managed_disk_size = "10"
}
}
}
However, virtual_machine_id is the problem.
╷
│ Error: Incorrect attribute value type
│
│ on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│ 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│ ├────────────────
│ │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
╷
│ Error: Incorrect attribute value type
│
│ on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│ 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│ ├────────────────
│ │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
╷
│ Error: Incorrect attribute value type
│
│ on manageddisk.tf line 36, in resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach":
│ 36: virtual_machine_id = { for k,v in data.azurerm_virtual_machine.vm_id : k => v.id }
│ ├────────────────
│ │ data.azurerm_virtual_machine.vm_id is object with 2 attributes
│
│ Inappropriate value for attribute "virtual_machine_id": string required.
╵
Successfully attaches disk by acquiring "virtual_machine_id".
I succeeded with the code below. But not yet.
vm = vm
I didn't understand this.
# ############################
# ### Managed Disk
# ############################
locals {
disk_vm_flat = merge([
for vm, vm_vals in var.vm_template : {
for disk, disk_vals in var.disk_template :
"${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
vm = vm
vm_name = vm_vals.vm_name
managed_disk_name = disk_vals.managed_disk_name
managed_disk_size = disk_vals.managed_disk_size
managed_disk_lun = disk_vals.managed_disk_lun
managed_disk_type = disk_vals.managed_disk_type
} if disk_vals.managed_disk_size != "0"
}
]...)
}
resource "azurerm_managed_disk" "managed_disk" {
for_each = local.disk_vm_flat
name = "${each.value.vm_name}-${each.value.managed_disk_name}"
location = var.location
resource_group_name = data.azurerm_resource_group.system_rg_name.name
storage_account_type = each.value.managed_disk_type
create_option = "Empty"
disk_size_gb = each.value.managed_disk_size
}
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
for_each = local.disk_vm_flat
managed_disk_id = azurerm_managed_disk.managed_disk[each.key].id
lun = each.value.managed_disk_lun
caching = "ReadWrite"
virtual_machine_id = azurerm_windows_virtual_machine.vm[each.value.vm].id
}
答案1
得分: 0
你基本上需要一个双重循环,在使用之前需要将其展开:
locals {
disk_vm_flat = merge([
for vm, vm_vals in var.vm_template : {
for disk, disk_vals in var.disk_template :
"${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
vm_name = vm
managed_disk_name = disk
managed_disk_size = disk_vals.managed_disk_size
} if disk_vals.managed_disk_size != "0"
}
]...) # 不要删除这些点,它们很重要
}
然后
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
for_each = local.disk_vm_flat
managed_disk_id = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
lun = each.value.managed_disk_size
caching = "ReadWrite"
virtual_machine_id = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
}
英文:
You basically need a double for loop, which you need to flatten first before the use:
locals {
disk_vm_flat = merge([
for vm, vm_vals in var.vm_template: {
for disk, disk_vals in var.disk_template:
"${vm_vals.vm_name}-${disk_vals.managed_disk_name}" => {
vm_name = vm
managed_disk_name = disk
managed_disk_size = disk_vals.managed_disk_size
} if disk_vals.managed_disk_size != "0"
}
]...) # do NOT remove the dots. they are important
}
then
resource "azurerm_virtual_machine_data_disk_attachment" "disk_attach" {
for_each = local.disk_vm_flat
managed_disk_id = azurerm_managed_disk.managed_disk[each.value.managed_disk_name].id
lun = each.value.managed_disk_size
caching = "ReadWrite"
virtual_machine_id = data.azurerm_virtual_machine.vm_id[each.value.vm_name].id
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论