Обновление: по состоянию на террафом 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»