Как заставить terraform пропускать этот блок при создании нескольких ресурсов в l oop из файла CSV? - PullRequest
0 голосов
/ 24 февраля 2020

Привет! Я пытаюсь создать скрипт Terraform, который будет принимать входные данные от пользователя в виде файла CSV и создавать несколько ресурсов Azure. Например, если пользователь хочет создать: ResourceGroup> Vnet> Su bnet оптом, он предоставит ввод в формате 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 file:

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

Проблема, с которой я сталкиваюсь, это то, что находится во второй группе ресурсов, пользователь не хочет типа ресурса, предположим, что пользователь хочет пропустить зону DNS в группе ресурсов csvrg2. Как мне сделать так, чтобы terraform пропускал этот блок?

Редактировать: я пытаюсь достичь этого "на основе какого-то условия в файле CSV, а не для создания ресурса azurerm_dns_zone для группы ресурсов csvrg2 «

Я привел пример файла 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 голосов
/ 25 февраля 2020

вы уже правильно подумали, используя функцию 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
    }
}

I надеюсь, что это поможет.

Привет

...