terraform中的案例陈述?
嗨,我下面有一段地形代码,它为我创建了sql和应用程序角色的虚拟机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
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
}