terraform и list, split возвращает последний элемент для неизвестного индекса - PullRequest
1 голос
/ 16 октября 2019

Столкнулся с проблемой во время работы над кодом terraform, написал небольшой пример и надеюсь, что кто-то из вас поможет мне решить мою проблему.

Текущий код выглядит так:

variable "aws-subnets" {
  description = "Test rule"

  default = [
    "10.0.0.0/32:us-east-1-s3",
    "10.0.0.1/32:us-east-2-s3",
    "10.0.0.2/32",
    "",
  ]
}

data "template_file" "ipset-wrapper" {
  count = "${length(var.aws-subnets)}"

  template = <<TXT
$${SUBNET_RANGE} comment $${SUBNET_COMMENT}
TXT

  vars {
    SUBNET_RANGE = "${element(split(":",var.aws-subnets[count.index]),0) != "" ? "${element(split(":",var.aws-subnets[count.index]),0)}" : "no_ip" }"
    SUBNET_COMMENT = "${element(split(":",var.aws-subnets[count.index]),1) != "" ? "${element(split(":",var.aws-subnets[count.index]),1)}" : "no_comment_provided" }"
),2))}"
  }
}

output "ipset-rules" {
  value = "${data.template_file.ipset-wrapper.*.rendered}"
}

Вывод теперь:

Outputs:

ipset-rules = [
    10.0.0.0/32 comment us-east-1-s3
,
    10.0.0.1/32 comment us-east-2-s3
,
    10.0.0.2/32 comment 10.0.0.2/32
,
    no_ip comment 0      no_comment_provided

]

3d-строка, вместо возврата неизвестного элемента или элемента пустого, вернула последний элемент из команды split, поэтому условие:

${element(split(":",var.aws-subnets[count.index]),1) != ""}

не работаетдля меня, как и ожидалось

Каков наилучший подход в этом случае для написания кода, если второй индекс не был определен?

Я понимаю, что код:

    SUBNET_COMMENT = "${element(split(":",var.aws-subnets[count.index]),1) != element(split(":",var.aws-subnets[count.index]),0) ? "${element(split(":",var.aws-subnets[count.index]),1)}" : "no_comment_provided" }"

хорошо работает в этом случае, но если не сработает, если у меня будет более 2 индексов.

любая помощь?

1 Ответ

0 голосов
/ 17 октября 2019

Как насчет этого с использованием нового синтаксиса TF 0,12:

variable "aws-subnets" {
  description = "Test rule"
  type = map(string)
  default = {
    "10.0.0.0/32" = "us-east-1-s3",
    "10.0.0.1/32" = "us-east-2-s3",
    "10.0.0.2/32" = "",
    "" = "",
  }
}

data "template_file" "ipset-wrapper" {
  for_each = var.aws-subnets

  template = <<TXT
$${SUBNET_RANGE} comment $${SUBNET_COMMENT}
TXT

  vars = {
    SUBNET_RANGE   = each.key != "" ? each.key : "no_ip"
    SUBNET_COMMENT = each.value != "" ? each.value : "no_comment_provided"
  }
}

output "ipset-rules" {
  value = data.template_file.ipset-wrapper
}

Результат:

$ terraform apply
data.template_file.ipset-wrapper["10.0.0.0/32"]: Refreshing state...
data.template_file.ipset-wrapper["10.0.0.1/32"]: Refreshing state...
data.template_file.ipset-wrapper["10.0.0.2/32"]: Refreshing state...
data.template_file.ipset-wrapper[""]: Refreshing state...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

ipset-rules = {
  "" = {
    "id" = "a30b544d33f455799f3b6d105d31eee10f326869f483ce22fd0300a56dd18c70"
    "rendered" = "no_ip comment no_comment_provided\n"
    "template" = "${SUBNET_RANGE} comment ${SUBNET_COMMENT}\n"
    "vars" = {
      "SUBNET_COMMENT" = "no_comment_provided"
      "SUBNET_RANGE" = "no_ip"
    }
  }
  "10.0.0.0/32" = {
    "id" = "21372ccabc2941e632a3e7fc8db7629c743689fb8318b8219135468366edd21b"
    "rendered" = "10.0.0.0/32 comment us-east-1-s3\n"
    "template" = "${SUBNET_RANGE} comment ${SUBNET_COMMENT}\n"
    "vars" = {
      "SUBNET_COMMENT" = "us-east-1-s3"
      "SUBNET_RANGE" = "10.0.0.0/32"
    }
  }
  "10.0.0.1/32" = {
    "id" = "87ab002bf580b46c48d580ed613f84c8730c6c238b087c59d6e876ff4838b6f8"
    "rendered" = "10.0.0.1/32 comment us-east-2-s3\n"
    "template" = "${SUBNET_RANGE} comment ${SUBNET_COMMENT}\n"
    "vars" = {
      "SUBNET_COMMENT" = "us-east-2-s3"
      "SUBNET_RANGE" = "10.0.0.1/32"
    }
  }
  "10.0.0.2/32" = {
    "id" = "eaf64bde14c2d9e6921f6cb8f8297cf3335779450cddc734e9cb7f84849d742a"
    "rendered" = "10.0.0.2/32 comment no_comment_provided\n"
    "template" = "${SUBNET_RANGE} comment ${SUBNET_COMMENT}\n"
    "vars" = {
      "SUBNET_COMMENT" = "no_comment_provided"
      "SUBNET_RANGE" = "10.0.0.2/32"
    }
  }
}
...