gpt4 book ai didi

azure - 如何在 terraform 中使用嵌套循环

转载 作者:行者123 更新时间:2023-12-01 23:57:19 25 4
gpt4 key购买 nike

我尝试使用 Terraform count 在 Azure 中创建 3 个虚拟机,每个虚拟机需要多个磁盘。有什么办法可以做到这一点吗?我尝试创建磁盘名称和大小的映射,但收到错误,无法同时使用 count 和 for_each?

resource "azurerm_managed_disk" "this" {
for_each = var.disks
count = each.value > 0 ? var.node_count : 0
name = format("%s-%02d-datadisk", each.key, count.index + 1)
location = var.location
resource_group_name = var.resource_group_name
storage_account_type = "Premium_LRS"
create_option = "Empty"
disk_size_gb = each.value

tags = {
environment = "staging"
}
}

resource "azurerm_virtual_machine_data_disk_attachment" "this" {
for_each = var.disks
count = each.value > 0 ? var.node_count : 0
managed_disk_id = azurerm_managed_disk.this.*.id[count.index]
virtual_machine_id = azurerm_virtual_machine.this.*.id[count.index]
lun = "10"
caching = "None"
}

vm.tf
variable "disks" {
description = "Map of disk name and respective disk size"
type = map(string)
default = {
"binlog_disk" = "30"
"innodb_disk" = "20"
"data_disk" = "100"
"tmp_disk" = "10"
"backup_disk" = "150"
}
}

最佳答案

resource for_each 的关键要求就是您构建一个映射,其中为您要创建的每个实例都有一个元素。

在这种情况下,您需要为每个(实例、磁盘)对一个实例,这是 the setproduct function 的一个很好的用例。 。在本例中,由于您的资源之一正在使用 count,因此我们会将其与 the range function 结合起来。生成合适的整数序列来标识实例:

locals {
instance_disks = {
for pair in setproduct(range(length(azurerm_virtual_machine.this)), keys(var.disks)) : "${pair[0]}:${pair[1]}" => {
vm_index = pair[0]
disk_key = pair[1]
disk_size = var.disks[pair[1]]
}
}
}

上面将生成一个映射,其中每对虚拟机索引和磁盘都有一个元素,元素如下:

{
"0:binlog_disk" = {
vm_index = 0
disk_key = "binlog_disk"
disk_size = 30
},
"1:binlog_disk" = {
vm_index = 1
disk_key = "binlog_disk"
disk_size = 30
},
etc...
}

此映射满足资源 for_each 要求,因此我们可以将其用作 azurerm_management_diskazurerm_virtual_machine_data_disk_attachment< 中的 for_each 表达式 资源:

resource "azurerm_managed_disk" "this" {
for_each = local.instance_disks

name = format("%s-%02d-datadisk", each.value.disk_key, each.value.instance_index + 1)
location = var.location
resource_group_name = var.resource_group_name
storage_account_type = "Premium_LRS"
create_option = "Empty"
disk_size_gb = each.value.disk_size

tags = {
environment = "staging"
}
}

resource "azurerm_virtual_machine_data_disk_attachment" "this" {
for_each = local.instance_disks

managed_disk_id = azurerm_managed_disk.this[each.key].id
virtual_machine_id = azurerm_virtual_machine.this[each.value.instance_index].id
lun = "10"
caching = "None"
}

这些资源实例的地址将使用与 map 相同的键,给出如下地址:

  • azurerm_management_disk.this["0:binlog_disk"]
  • azurerm_management_disk.this["1:binlog_disk"]
  • ...
  • azurerm_management_disk.this["0:innodb_disk"]
  • azurerm_management_disk.this["1:innodb_disk"]
  • ...

考虑用于资源的实例键很重要,因为它们决定 Terraform 如何理解底层 map 的更改。特别是在这种情况下,因为我们通过虚拟机在计数序列中的位置来识别虚拟机,所以将虚拟机数量减少一个会被 Terraform 理解为销毁所有虚拟机的请求。具有最高索引的附件。从 var.disks 中删除 innodb_disk 条目会被 Terraform 理解为销毁所有地址以 :innodb_disk 结尾的附件的请求。

关于azure - 如何在 terraform 中使用嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62527070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com