Объедините два списка в отформатированную строку в Terraform - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужно создать строковый параметр для передачи в aws-cli через local-exec, поэтому нужно объединить два списка из удаленного состояния в требуемый формат, не могу придумать хороший способ сделать это с помощью встроенных функций интерполяции.

Требуемый формат строки

"SubnetId=subnet-x,Ip=ip_x SubnetId=subnet--y,Ip=ip_y SubnetId=subnet-z,Ip=ip_z"

У нас есть подсети и соответствующие cidr в двух отдельных списках.

["subnet-x","subnet-y","subnet-z"]
["cidr-x","cidr-y","cidr-z"]

Думал, что могу использовать функцию cidrhost для полученияIP-адреса, но не вижу способа отформатировать два списка в одну строку.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Один из парней на работе придумал это,

 variable "subnet_ids" {
   default = ["subnet-345325", "subnet-345243", "subnet-345234"]
 }

 variable "cidrs" {
   default = ["10.0.0.0/24", "10.0.1.0/24", "10.0.2.0/23"]
 }

 resource "null_resource" "subnet_strings_option_one" {
   count = "${length(var.subnet_ids)}"

   triggers {
     value = "SubnetId=${var.subnet_ids[count.index]},Ip=${cidrhost(var.cidrs[count.index],11)}"
   }
 }

 output "subnet_strings_option_one" {
   value = "${join("",null_resource.subnet_strings_option_one.*.triggers.value)}"
 }

Это дает следующий вывод

    null_resource.subnet_strings_option_one[1]: Creating...
      triggers.%:     "" => "1"
      triggers.value: "" => "SubnetId=subnet-345243,Ip=10.0.1.11"
    null_resource.subnet_strings_option_one[2]: Creating...
      triggers.%:     "" => "1"
      triggers.value: "" => "SubnetId=subnet-345234,Ip=10.0.2.11"
    null_resource.subnet_strings_option_one[0]: Creating...
      triggers.%:     "" => "1"
      triggers.value: "" => "SubnetId=subnet-345325,Ip=10.0.0.11"
    null_resource.subnet_strings_option_one[2]: Creation complete after 0s (ID: 852839482792384695)
    null_resource.subnet_strings_option_one[1]: Creation complete after 0s (ID: 5439264637705543321)
    null_resource.subnet_strings_option_one[0]: Creation complete after 0s (ID: 1054498808481879719)

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

    Outputs:

    subnet_strings_option_one = SubnetId=subnet-345325,Ip=10.0.0.11 SubnetId=subnet-345243,Ip=10.0.1.11 SubnetId=subnet-345234,Ip=10.0.2.11
0 голосов
/ 11 февраля 2019

Попробуйте использовать formatlist , а затем join .

locals {
   # this should give you 
   formatted_list = "${formatlist("SubnetId=%s,Ip=%s", var.subnet_list, var.cidrs_list}"

   # combine the formatted list of parameter together using join
   cli_parameter = "${join(" ", locals.formatted_list)}"
}

EDIT: вам нужно будет использовать null_resource для преобразования CIDR в IP-адреса, напримерв другом ответе.Тогда вы можете просто построить formatted_list и cli_parameter аналогично предыдущему.

locals {
   subnet_list = ["subnet-x","subnet-y","subnet-z"]
   cidr_list = ["cidr-x","cidr-y","cidr-z"]

   # this should give you 
   formatted_list = "${formatlist("SubnetId=%s,Ip=%s", var.subnet_list, null_resource.cidr_host_convert.*.triggers.value)}"

   # combine the formatted list of parameter together using join
   cli_parameter = "${join(" ", locals.formatted_list)}"
}

resource "null_resource" "cidr_host_convert" {
   count = "${length(locals.cidr_list}"

   trigger = {
      # for each CIDR, get the first IP Address in it. You may need to manage
      # the index value to prevent overlap
      desired_ips = "${cidrhost(locals.cidr_list[count.index], 1)}"
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...