terraform中的案例陈述?

terraform中的案例陈述?,terraform,azure-virtual-machine,terraform-provider-azure,Terraform,Azure Virtual Machine,Terraform Provider Azure,嗨,我下面有一段地形代码,它为我创建了sql和应用程序角色的虚拟机 module "sql_vms" { source = "../../modules/compute/" rg_name = var.resource_group_name location = module.resource_group.external_rg_location vnet_name = v

嗨,我下面有一段地形代码,它为我创建了sql和应用程序角色的虚拟机

module "sql_vms" {
  source                = "../../modules/compute/"
  rg_name               = var.resource_group_name
  location              = module.resource_group.external_rg_location
  vnet_name             = var.virtual_network_name
  subnet_name           = var.sql_subnet_name
  app_nsg               = var.application_nsg
  vm_count              = var.count_vm
  base_hostname         = var.sql_host_basename
  sto_acc_suffix        = var.storage_account_suffix
  vm_size               = var.virtual_machine_size
  vm_publisher          = var.virtual_machine_image_publisher
  vm_offer              = var.virtual_machine_image_offer
  vm_sku                = var.virtual_machine_image_sku
  vm_img_version        = var.virtual_machine_image_version
  username              = var.username
  password              = var.password
  allowed_source_ips    = var.ip_list
}

module "app_vms" {
  source                = "../../modules/compute/"
  rg_name               = var.resource_group_name
  location              = module.resource_group.external_rg_location
  vnet_name             = var.virtual_network_name
  subnet_name           = var.sql_subnet_name
  app_nsg               = var.application_nsg
  vm_count              = var.count_vm
  base_hostname         = var.app_host_basename
  sto_acc_suffix        = var.storage_account_suffix
  vm_size               = var.virtual_machine_size
  vm_publisher          = var.virtual_machine_image_publisher
  vm_offer              = var.virtual_machine_image_offer
  vm_sku                = var.virtual_machine_image_sku
  vm_img_version        = var.virtual_machine_image_version
  username              = var.username
  password              = var.password
  allowed_source_ips    = var.ip_list
}

module "resource_group" {
  source                = "../../modules/resourcegroup/"
  rg_name               = "test_rg"
}
虽然它帮助我完成工作。我不认为这是理想的,因为有很多共同的参数,只有很少的改变,以创建不同的角色

特定于角色的参数如下:

subnet_name
vm_size
vm_publisher
vm_offer
vm_sku
vm_img_version

是否可以在terraform中使用case语句或循环?

我认为您需要做的不是找到要实现的循环,而是尝试为每个变量设置默认值,只为要指定的变量输入特殊值。就像Terraform注册表中的Azure一样,例如。计算有很多变量,但您只需要指定所需的变量。我认为这是您真正需要的方式。

模块循环还不受支持(从terraform v0.12.26开始),但您可以做一件事来解决可重复的公共配置,即传入一个包含所有公共内容的配置变量。然后,在将其插入模块时,将其与包含该特定模块实例的特定元素的映射合并

要使用您的代码作为示例来说明我的意思,可以执行以下操作:

locals {
  common-configuration = {
    rg_name            = var.resource_group_name
    location           = module.resource_group.external_rg_location
    vnet_name          = var.virtual_network_name
    subnet_name        = var.sql_subnet_name
    app_nsg            = var.application_nsg
    vm_count           = var.count_vm
    sto_acc_suffix     = var.storage_account_suffix
    vm_size            = var.virtual_machine_size
    vm_publisher       = var.virtual_machine_image_publisher
    vm_offer           = var.virtual_machine_image_offer
    vm_sku             = var.virtual_machine_image_sku
    vm_img_version     = var.virtual_machine_image_version
    username           = var.username
    password           = var.password
    allowed_source_ips = var.ip_list
  }
}

module "sql_vms" {
  source          = "../../modules/compute/"
  configuration   = merge(local.common-configuration, {
    base_hostname = var.sql_host_basename
  })
}

module "app_vms" {
  source          = "../../modules/compute/"
  configuration   = merge(local.common-configuration, {
    base_hostname = var.app_host_basename
  })
}
这样,阅读和查看模块特定的重要内容就容易多了。您还可以同时更新所有通用配置,因为您不会错过其中一个模块。在驻留在
“../../modules/compute/”
的模块中,您将引用变量,如
var.configuration.rg\u name
,而不是
var.rg\u name

您还可以更进一步,通过使用某种映射层,将配置的结构与模块引用传入变量的方式分开。这还允许您设置不在公共配置中的默认值(或者您确实可以这样做,而不是公共配置,但我发现如果该配置由使用它的模块共同定位,那么维护起来会更容易。它还允许您像您这样传入其他模块的输出)。这方面的一个示例如下所示(假设也使用上述选项):


不,它仍然不能解决问题,伙计。我相信你建议的是1次迭代,这很好。然而,我有一组列表,我必须为其执行terraform配置。我不想重复我在这里所做的相同块。你的意思是你想用不同的参数创建多个虚拟机吗?是的,伙计!这就是我想要的,如果我的信息不清楚,请道歉。使用调用模块的同一块并传递不同的参数。其余的参数(或至少大多数)仍然是sameI,恐怕Terraform中没有case语句,如果使用模块,计数也不可用。你可以看看。你的问题是什么?你想怎么解决就怎么解决?
variable configuration {}

locals {
  rg_name            = var.configuration.resource_group_name
  location           = var.configuration.external_rg_location
  vnet_name          = var.configuration.virtual_network_name
  subnet_name        = var.configuration.sql_subnet_name
  app_nsg            = var.configuration.application_nsg
  # Example of setting a default value if it doesnt exist within the configuration
  vm_count           = lookup(var.configuration, "count_vm", 2)
  sto_acc_suffix     = var.configuration.storage_account_suffix
  vm_size            = var.configuration.virtual_machine_size
  vm_publisher       = var.configuration.virtual_machine_image_publisher
  vm_offer           = var.configuration.virtual_machine_image_offer
  vm_sku             = var.configuration.virtual_machine_image_sku
  vm_img_version     = var.configuration.virtual_machine_image_version
  username           = var.configuration.username
  password           = var.configuration.password
  allowed_source_ips = var.configuration.ip_list
}