如何通过Terraform创建多个VM?

时间:2019-09-05 11:22:32

标签: azure terraform

我请求为不同的服务器创建多个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循环?

2 个答案:

答案 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"
  }
} 

其他信息:azurerm_virtual_machine

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能够与现有实例相关联,以找出需要创建或创建的内容。销毁,而不会打扰无关的实例。