Обновление: по состоянию на террафом 0,12, TF теперь поддерживает новый Шаблон синтаксиса
Вы, вероятно, уже знаете, что это нелегко невозможно, чтобы закрепить переменную типа Screice/List в шаблонах, на самом деле, на самом деле нет никаких конструкций петлей в шаблонах TF на данный момент.
Есть надежда, хотя, по их комментарию по этому вопросу GH: https://github.com/hashicorp/terraform/issues/16628.
Так Скажем, мы хотим создать файл JSON с ломтика/массива, который, когда-то закончил, выглядит что-то подобное:
Мы не можем просто проиграть на массиве, чтобы изменить значение EndPointX, так как мы не можем пройти через него.
То, что мы ожидали быть в состоянии сделать, в шаблоне, это что-то подобное
Мы должны были справиться с этим последним, но давайте игнорируем это на данный момент — идея проста, повторяет значения в массиве конечных точек карты и использовать каждый ключ и значение в качестве переменных в этом цикле для генерации файла JSON. Как мы уже знаем, это невозможно, и мы не получим это в ближайшее время.
К счастью, необходимостью является матерью изобретения, и я получил это, чтобы работать с существующими конструкциями петлей снаружи шаблон ; Хотя это не так « чистый », как указано выше, это полезно и производит желаемый результат.
Использование встроенного цикла TFS построить
Чтобы использовать TFS встроенный контурную конструкцию и генерировать желаемый JSON, нам понадобится 2 шаблона файлов, первым будет выглядеть так
// data.json.tmpl { "name": "${name}", "endpoint": "${endpoint}" }
а второй шаблон выглядит так
// service.json.tmpl [ ${value}, {"links": ${links}} ]
Может быть, вы уже знаете, где мы отправляемся с этим, мы теперь оказываем первый шаблон, используя встроенные конструкции петли из TF, используя ресурс данных Template_File
variable "endpoints" { _type_ = "list" _default_ = [ { endpoint1 = "https://endpoint-1.example.com" }, { endpoint2 = "https://endpoint-2.example.com" }, { endpoint3 = "https://endpoint-3.example.com" }, ] } data "template\_file" "data\_json" { _template_ = "${file("${path.module}/data.json.tmpl")}" _count_ = "${length(var.endpoints)}" vars { _endpoint_ = "${element(values(var.endpoints[count.index]), 0)}" _name_ = "${element(keys(var.endpoints[count.index]), 0)}" } }
И затем повторно используйте вывод .rendered в качестве ввода в 2-й шаблон, который действительно просто генерирует список предварительно и пост- исправить переменную стоимости $ [].
variable "links" { _type_ = "list" _default_ = [ "link1", "link2", "link3", ] } data "template\_file" "service\_json" { _template_ = "${file("${path.module}/service.json.tmpl")}" vars { _value_ = "${join(",", data.template\_file.data\_json.\*.rendered)}" _links_ = "${jsonencode(var.links)}" }}
И, наконец, мы используем модуль вывода, чтобы показать нам, что мы сделали, это также то, как вы используете результат в качестве входа в любой другой модуль TF, который принимает JSON.
output "json" { _value_ = "${data.template\_file.service\_json.rendered}" }
а также выход
$ tf apply data.template\_file.data\_json[2]: Refreshing state... data.template\_file.data\_json[0]: Refreshing state... data.template\_file.data\_json[1]: Refreshing state... data.template\_file.service\_json: Refreshing state... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: json = [ { "name": "endpoint1", "endpoint": "[https://endpoint-1.example.com](https://endpoint-1.example.com)" },{ "name": "endpoint2", "endpoint": "[https://endpoint-2.example.com](https://endpoint-2.example.com)" },{ "name": "endpoint3", "endpoint": "[https://endpoint-3.example.com](https://endpoint-3.example.com)" }, {"links": ["link1","link2","link3"]} ]
Преобразование списков/ломтики к JSON
Возможно, вы заметили JSONENCODE в последней части, это помогает преобразовать любую структуру для действительного JSON, и она становится действительным входом на шаблон, так как JSON по сути, это просто текст
variable "links" { _type_ = "list" _default_ = [ "link1", "link2", "link3", ] } data "template\_file" "service\_json" { _[...]_ _links_ = "${jsonencode(var.links)}" }}
использованная литература
- Интерполяционный синтаксис TF
- Перейти шаблон синтаксиса
- GH DEQUEST # 16628 — Используйте шаблон GO в качестве синтаксиса шаблона для шаблона_File источника данных
Оригинал: «https://dev.to/ineedale/terraform-templating-and-loops-479p»