具有计数索引的 Terraform 模块

问题描述 投票:0回答:1

我正在努力调整我们的 Terraform 代码并进行一些测试以找出可能的选项。

我正在尝试创建一个模块来创建虚拟机。我希望可以选择使用计数运算符创建超过 1 个虚拟机。根模块将适用于不同的服务器角色类型及其对磁盘等的特定资源块要求,但都将通过相同的 VM 子模块创建基本 VM(如果可能)。

在根模块中,我想调用VM子模块来创建VM及其vnic,然后在根模块中我创建一个数据磁盘,然后创建一个磁盘附件,但磁盘附件需要VM ID,我可以将计数运算符添加到磁盘附件,但如何引用模块中创建的虚拟机的计数索引? 这可能吗?我考虑过使用虚拟机输出,但我不相信可以使用计数,所以我有点卡住了。 您甚至可以引用在子模块中创建的资源索引吗?

通过在输出中使用 [*] 创建计数为 1 时,我确实完成了大部分配置,但当将计数增加到 2 时,显然一切都不喜欢它。

resource "azurerm_virtual_machine_data_disk_attachment" "ddisk-b 
attach" { 
count = var.instance_count
managed_disk_id = azurerm_managed_disk.ddisk01[count.index].id 
virtual_machine_id = 
lun = "1"
caching = "ReadWrite"
depends_on = [module.virtual_machine] } 

以上是需要数据盘的特定服务器角色的根模块。 是否有可能从创建磁盘将连接到的虚拟机的虚拟机子模块中提取 count.index 值,以便能够填充“virtual_machine_id”输入?

在从根调用的子VM模块中设置了一个计数。 就像我说的,我尝试了模块中的输出,但不能使用计数。 还有其他方法可以做到这一点吗? 谢谢

indexing module count terraform
1个回答
0
投票

您可以多次运行该模块,而不是在模块中创建多个虚拟机? 我发现当模块尽可能简单时,通常更容易管理。

无论哪种方式,都非常有可能使用迭代创建的对象的输出。 这是如何执行此操作的简化示例。

variable "instances" {
  type = list(string)
}

resource "some_resource" "this" {
  count = length(var.instances)
  name = instance[count.index]
}
# can be written as [ for i in some_resource.this : i.id ]
output "ids" {
  value = some_resource.this.*.id
}

然后你就可以这样使用它

module "my_module" {
  source = "path"
  instances = ["test-1", "test-2", "test-3"]
}

resource "some_other_resource" "this" {
  count = length(module.my_module.ids)
  reference_id = module.my_module.ids[count.index]
}

请记住,由于 count 生成列表,因此资源由其索引引用。 这意味着,如果您删除一个索引,所有后续索引都会发生变化,并且 terraform 会将其解释为其配置的更改。

© www.soinside.com 2019 - 2024. All rights reserved.