Azure 如何通过Terraform创建多个VM?
我请求为不同的服务器创建多个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" =
{
"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?