如何使terraform在从CSV文件创建多个循环资源时跳过该块?
嗨,我正在尝试创建一个Terraform脚本,它将以CSV文件的形式从用户那里获取输入,并创建多个Azure资源。 例如,如果用户希望批量创建:ResourceGroup>Vnet>子网,他将提供CSV格式的输入,如下所示:如何使terraform在从CSV文件创建多个循环资源时跳过该块?,terraform,terraform-provider-azure,Terraform,Terraform Provider Azure,嗨,我正在尝试创建一个Terraform脚本,它将以CSV文件的形式从用户那里获取输入,并创建多个Azure资源。 例如,如果用户希望批量创建:ResourceGroup>Vnet>子网,他将提供CSV格式的输入,如下所示: resourcegroup,RG_location,RG_tag,domainname,DNS_Zone_tag,virtualnetwork,VNET_location,addressspace csvrg1,eastus2,Terraform RG,test.s
resourcegroup,RG_location,RG_tag,domainname,DNS_Zone_tag,virtualnetwork,VNET_location,addressspace
csvrg1,eastus2,Terraform RG,test.sd,Terraform RG,csvvnet1,eastus2,10.0.0.0/16,Terraform VNET,subnet1,10.0.0.0/24
csvrg2,westus,Terraform RG2,test2.sd,Terraform RG2,csvvnet2,westus,172.0.0.0/8,Terraform VNET2,subnet1,171.0.0.0/24
我已经编写了以下工作main.tf文件:
# Configure the Microsoft Azure Provider
provider "azurerm" {
version = "=1.43.0"
subscription_id = var.subscription
tenant_id = var.tenant
client_id = var.client
client_secret = var.secret
}
#Decoding the csv file
locals {
vmcsv = csvdecode(file("${path.module}/computelanding.csv"))
}
# Create a resource group if it doesn’t exist
resource "azurerm_resource_group" "myterraformgroup" {
count = length(local.vmcsv)
name = local.vmcsv[count.index].resourcegroup
location = local.vmcsv[count.index].RG_location
tags = {
environment = local.vmcsv[count.index].RG_tag
}
}
# Create a DNS Zone
resource "azurerm_dns_zone" "dnsp-private" {
count = 1
name = local.vmcsv[count.index].domainname
resource_group_name = local.vmcsv[count.index].resourcegroup
depends_on = [azurerm_resource_group.myterraformgroup]
tags = {
environment = local.vmcsv[count.index].DNS_Zone_tag
}
}
To be continued....
这里我面临的问题是,第二个资源组中有什么,用户不想要资源类型,假设用户想要跳过资源组csvrg2中的DNS区域如何使terraform跳过该块?
编辑:我试图实现的是“基于CSV文件中的某些条件,而不是为资源组csvrg2创建azurerm_dns_区域资源”
我提供了一个CSV文件的示例,它的外观如下:
resourcegroup,RG_location,RG_tag,DNS_required,domainname,DNS_Zone_tag,virtualnetwork,VNET_location,addressspace
csvrg1,eastus2,Terraform RG,1,test.sd,Terraform RG,csvvnet1,eastus2,10.0.0.0/16,Terraform VNET,subnet1,10.0.0.0/24
csvrg2,westus,Terraform RG2,0,test2.sd,Terraform RG2,csvvnet2,westus,172.0.0.0/8,Terraform VNET2,subnet1,171.0.0.0/24
使用
depends\u on
函数,您已经有了正确的想法。虽然,您在内部使用了一个计数
,根据我的理解,这导致一旦创建了第一个资源[0],Terraform就会认为依赖关系已经解决,并继续进行
我发现这篇文章有一个变通方法,您可以尝试:
这基本上告诉我们创建一个null\u资源
,如该示例所示:
variable "instance_count" {
default = 0
}
resource "null_resource" "a" {
count = var.instance_count
}
resource "null_resource" "b" {
depends_on = [null_resource.a]
}
在您的示例中,它可能如下所示:
# Create a resource group if it doesn’t exist
resource "azurerm_resource_group" "myterraformgroup" {
count = length(local.vmcsv)
name = local.vmcsv[count.index].resourcegroup
location = local.vmcsv[count.index].RG_location
tags = {
environment = local.vmcsv[count.index].RG_tag
}
}
# Create a DNS Zone
resource "azurerm_dns_zone" "dnsp-private" {
count = 1
name = local.vmcsv[count.index].domainname
resource_group_name = local.vmcsv[count.index].resourcegroup
depends_on = null_resource.example
tags = {
environment = local.vmcsv[count.index].DNS_Zone_tag
}
}
resource "null_resource" "example" {
...
depends_on = [azurerm_resource_group.myterraformgroup[length(local.vmcsv)]]
}
或者取决于您的Terraform版本(0.12+,您正在使用该版本猜测语法)
我希望这有帮助
问候语当它使用资源创建第二个资源组long时,我需要它根据CSV中第一个RG的条件跳过DNS区域和其他资源:csvrg1>>DNS1>>Vnet1>>子网1>>防火墙1,第二个RG csvrg2>>Vnet2>>子网2“基于某些条件,不为csvrg2创建azurerm_dns_区域资源”这是我的要求。CSV中应该有一些条件使其跳过特定块。我尝试了此方法(local.vmcsv[count.index].domainname==0?null:local.vmcsv[count.index].domainname),但terraform采用了“null”“作为名称,而不是空值。请查找每一个,而不是使用count,[for i in…]创建一个列表,该列表可用于消除要跳过的条件表达式()。由于目标不明确,缺少细节,只能提供潜在的查找位置。问题很简单:用户将使用一个CSV文件作为输入,在Azure中提供多个资源。在后端将是一个TF脚本。用户可以创建多个资源组,每个组中有不同类型的资源。一个资源组可能拥有所有网络资源,另一个资源组可能拥有存储资源。我如何做到这一点?据我所知,由于我们使用的是单个CSV文件,该文件将提供“key”=“value”参数,因此我需要某种方法来跳过表示TF脚本中块的特定键。您需要具体说明条件逻辑,以确定是否跳过CSV(csvrg2)中的一行。决定是否创建azurerm_dns_区域的标准是什么。你问题中的哪句话具体说明了这一点?你一直说“想跳过”“在某些条件下”,但从来没有提到条件是什么。请查看我的帖子。我在CSV标题中提到了一个条件,即
DNS\u required
。如果值为1,它将创建,如果为0,它将跳过。但我不知道如何使这种条件起作用。否则,如果我为DNS工作保留空值,也可以。
# Create a resource group if it doesn’t exist
resource "azurerm_resource_group" "myterraformgroup" {
count = length(local.vmcsv)
name = local.vmcsv[count.index].resourcegroup
location = local.vmcsv[count.index].RG_location
tags = {
environment = local.vmcsv[count.index].RG_tag
}
}
# Create a DNS Zone
resource "azurerm_dns_zone" "dnsp-private" {
count = 1
name = local.vmcsv[count.index].domainname
resource_group_name = local.vmcsv[count.index].resourcegroup
depends_on = [azurerm_resource_group.myterraformgroup[length(local.vmcsv)]]
tags = {
environment = local.vmcsv[count.index].DNS_Zone_tag
}
}