Итерация по списку значений ресурсов внутри списка в локальной Terraform - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь получить массив массивов для использования в поле данных Terraform template_file:

data "template_file" "dashboard" {
  template = "${file("${path.module}/files/dashboard.json")}"

  vars {
    metrics = "${jsonencode(local.metrics)}"
  }
}

Но я не нахожу правильный способ получить то, что я хочу.У меня есть ресурс aws_instance со счетчиком 3, и я пытаюсь сгенерировать 3 массива внутри локального на основе каждого из счетчиков ресурсов.Единственное, что я до сих пор придумал:

locals {
  metrics = [
    "collectd", "GenericJMX.gauge.50thPercentile", "Host", "${aws_instance.instance.*.id}", "PluginInstance", "cassandra_client_request-latency"
  ]
}

Очевидно, что это делает, помещает все экземпляры один за другим в один и тот же массив.Я пытаюсь получить массив результатов, который будет выглядеть следующим образом:

["collectd", "GenericJMX.gauge.50thPercentile", "Host", "the id of instance 0", PluginInstance", "cassandra_client_request-latency"], 
["collectd", "GenericJMX.gauge.50thPercentile", "Host", "the id of instance 1", PluginInstance", "cassandra_client_request-latency"], 
["collectd", "GenericJMX.gauge.50thPercentile", "Host", "the id of instance 3", PluginInstance", "cassandra_client_request-latency"]

И это будет расширено в переменной $ {metrics} шаблона.

Есть ли способ достичьчто я хочу, внутри локального, и сделать его пригодным для использования в шаблоне?

1 Ответ

0 голосов
/ 02 марта 2019

источник данных terraform также поддерживает count .

Это функция скрытия, которая никогда не будет задокументирована (https://github.com/hashicorp/terraform/pull/8635)

Произведите некоторые корректировки на вашем dashboard.json, затем используйте приведенные ниже коды для генерации количества ресурсов источника данных template_file.

data "template_file" "dashboard" {
  count = "${length(aws_instance.instance.*.id)}"
  template = "${file("${path.module}/files/dashboard.json")}"

  vars {
    metrics = "${element(aws_instance.instance.*.id, count.index)}"
  }
}

Вы можете ссылаться на него как на ресурсы подсчета terraform

count = "${length(aws_instance.instance.*.id)}"

${data.template_file.dashboard.*.rendered[count.index]}"

Вот полные тестовые данные.

$ cat main.tf
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "instance" {
  count         = 2
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloWorld"
  }
}


data "template_file" "dashboard" {
  count    = "${length(aws_instance.instance.*.id)}"
  template = "${file("${path.module}/files/dashboard.json")}"

  vars {
    metric = "${element(aws_instance.instance.*.id, count.index)}"
  }
}

output "aws_instances" {
  value = "${length(aws_instance.instance.*.id)}"
}

$ cat files/dashboard.json
["collectd", "GenericJMX.gauge.50thPercentile", "Host", "${metric}", PluginInstance", "cassandra_client_request-latency"]

После применения изменения проверьте файл tfstate

            "data.template_file.dashboard.1": {
                "type": "template_file",
                "depends_on": [
                    "aws_instance.instance.*"
                ],
                "primary": {
                    "id": "8e05e7c115a8d482b9622a1eddf5ee1701b8cc4695da5ab9591899df5aeb703d",
                    "attributes": {
                        "id": "8e05e7c115a8d482b9622a1eddf5ee1701b8cc4695da5ab9591899df5aeb703d",
 # the date is here ==> "rendered": "[\"collectd\", \"GenericJMX.gauge.50thPercentile\", \"Host\", \"i-015961b744ff55da4\", PluginInstance\", \"cassandra_client_request-latency\"]\n",
                        "template": "[\"collectd\", \"GenericJMX.gauge.50thPercentile\", \"Host\", \"${metric}\", PluginInstance\", \"cassandra_client_request-latency\"]\n",
                        "vars.%": "1",
                        "vars.metric": "i-015961b744ff55da4"
                    },
                    "meta": {},
                    "tainted": false
                },
                "deposed": [],
                "provider": "provider.template"
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...