如何使terraform在从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

嗨,我正在尝试创建一个Terraform脚本,它将以CSV文件的形式从用户那里获取输入,并创建多个Azure资源。 例如,如果用户希望批量创建:ResourceGroup>Vnet>子网,他将提供CSV格式的输入,如下所示:

  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
    }
}