Azure 如何通过Terraform创建多个VM?

Azure 如何通过Terraform创建多个VM?,azure,terraform,Azure,Terraform,我请求为不同的服务器创建多个VM,例如: { "type" = "ansibleserver" "size" = "Standard_DC2s" "count" = 2 }, { "type" = "frontendserver" "size" = "Standard_DC2s" "count" = 2 }, { "type" = "backendserver" "size" = "Standard_L8s_v2" "count" =

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

参考中提到的建议,并让我知道状态

这个GitHub应该可以帮助你

有关更多信息,请参考本节中提到的建议

像这样的东西,你在向外看:

资源azurerm\u虚拟机服务器{ name=server-${count.index} count=${var.instance\u count} … 存储操作系统磁盘{ name=server-${count.index}-os 缓存=读写 create_option=FromImage 受管磁盘类型=标准磁盘 } } 其他信息:


请告知我们上述内容是否有帮助,或者您是否需要进一步帮助解决此问题。

这里的第一个任务是将您的输入平铺到一个集合中,其中每个元素仅对应于一个虚拟机:

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
}
我们必须通过转换为一个映射来给每个元素一个唯一的键,所以在这里我假设输入列表中的类型应该是唯一的,因此将该类型与索引结合起来生成一个唯一的键就足够了。如果不是这样,您可能还需要在键中包含大小字符串,方法是调整for_中的键表达式


其结果将是具有azurerm_virtual_machine.ansibleserver[ansibleserver01]等地址的实例,这样,当您在未来的Terraform中向列表中添加或删除元素时,它将能够与现有实例关联,以确定需要创建或销毁什么,不干扰无关实例。

什么版本的Terraform?