【问题标题】:Case statement in terraform?terraform中的案例陈述?
【发布时间】:2020-03-28 20:35:05
【问题描述】:

您好,我有下面的 terraform 代码块,它为我创建了用于 sql 和 app 角色的虚拟机。

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 语句或循环吗?

【问题讨论】:

  • 不,它仍然不能解决问题,伙计。我相信你的建议是进行 1 次迭代,这很好。但是,我有一组列表,我必须为其执行 terraform config。我不想重复我在这里所做的相同的块。
  • 你的意思是要创建多个不同参数的虚拟机?
  • 是的,伙计!这就是我想要的,如果我的信息不清楚,请道歉。在我调用模块的地方使用相同的块并传递不同的参数。其余参数(或至少大部分)保持不变
  • 恐怕Terraform中没有case语句,如果你使用模块,count也不可用。你可以看看HashiCorp Terraform 0.12 Preview: For and For-Each
  • 您的问题处于什么状态?你想怎么解决吗?

标签: terraform azure-virtual-machine terraform-provider-azure


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尚不支持循环模块(从 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_name 之类的变量,而不是var.rg_name

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2010-10-30
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多