如何从CSV文件循环创建多个资源时,如何使Terraform跳过该块?

时间:2020-02-24 17:51:52

标签: terraform terraform-provider-azure

嗨,我正在尝试创建一个Terraform脚本,它将以CSV文件的形式接收来自用户的输入并创建多个Azure资源。 例如,如果用户要批量创建:ResourceGroup> Vnet> Subnet,他将以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_zone资源”

我提供了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

1 个答案:

答案 0 :(得分:0)

使用depends_on函数,您已经有了正确的想法。尽管您使用的是内部的count,根据我的理解,这导致创建了第一个资源[0]后,Terraform认为依赖关系已解决,并且也可以继续进行。

我发现此信息具有解决方法,您可以尝试以下方法: https://github.com/hashicorp/terraform/issues/15285#issuecomment-447971852

这基本上告诉我们要创建一个null_resource,如该示例:

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 +)

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

我希望能帮上忙。

问候