Рубрики
Uncategorized

Шаблон и петли террафора

Обновление: по состоянию на террафом 0,12, TF теперь поддерживает новый синтаксис шаблона Вы, наверное, уже знаете, это н … Помечено террафором, дежоптом, шаблоном, иди.

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

использованная литература

Оригинал: «https://dev.to/ineedale/terraform-templating-and-loops-479p»