我请求为不同的服务器创建多个VM,例如:
{
"type" = "ansibleserver"
"size" = "Standard_DC2s"
"count" = 2
},
{
"type" = "frontendserver"
"size" = "Standard_DC2s"
"count" = 2
},
{
"type" = "backendserver"
"size" = "Standard_L8s_v2"
"count" = 3
}
对于所有3种服务器,我必须创建不同大小和数量的服务器,现在我只能以一种非常糟糕的方式来做到这一点:
resource "azurerm_virtual_machine" "ansibleserver" {
count = "${lookup(var.ansibleserver, "count")}"
name =
......
}
resource "azurerm_virtual_machine" "frontendserver" {
count = "${lookup(var.frontendserver, "count")}"
name =
......
}
然后,如果有任何新的要求,我不仅需要更改变量,还需要更改脚本,这太复杂了。有没有办法以更体面的方式更改整个创建过程,例如代码中的for循环?
答案 0 :(得分:3)
请参阅link中提到的建议,并让我知道状态
此GitHub article应该会为您提供帮助
有关更多信息,您可以参考此link中提到的建议。
您正在寻找类似的东西
resource "azurerm_virtual_machine" "server" {
name = "server-${count.index}"
count = "${var.instance_count}"
…
storage_os_disk {
name = "server-${count.index}-os"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}
}
Need to create multile vms in azure through terraform
请告知我们以上内容是否对您有帮助,或者您在此问题上需要进一步的帮助。
答案 1 :(得分:1)
这里的第一个任务是将输入拼合到一个集合中,其中每个元素仅对应一个虚拟机:
locals {
servers_flat = flatten([
for s in var.servers : [
for n in range(s.count) : {
type = s.type
size = s.size
index = n
}
]
])
}
完成此操作后,可以使用for_each
为集合的每个元素创建一个资源实例。
resource "azurerm_virtual_machine" "ansibleserver" {
for_each = { for s in var.servers_flat : format("%s%02d", s.name, s.index) => s }
name = each.key # a string like "ansibleserver01"
size = each.value.size
}
我们必须通过转换为映射为每个元素赋予唯一键,因此在此我假定“类型”在输入列表中应该是唯一的,因此将其与索引结合以产生唯一键就足够了。如果不是这样,则可能还需要通过调整size
中的键表达式来在密钥中包含for_each
字符串。
此操作的结果将是地址为azurerm_virtual_machine.ansibleserver["ansibleserver01"]
的实例,以便将来在Terraform中向列表中添加或删除元素时,Terraform能够与现有实例相关联,以找出需要创建或创建的内容。销毁,而不会打扰无关的实例。