Terraform > Неэкранированные интерполяции
Что это значит:
Note: Inline templates must escape their interpolations (as seen by the double
$ above). Unescaped interpolations will be processed before the template.
с https://www.terraform.io/docs/providers/template/index.html
Конкретный пример:
# Template for initial configuration bash script
data "template_file" "init" {
template = "$${consul_address}:1234"
vars {
consul_address = "${aws_instance.consul.private_ip}"
}
}
1 ответ
${}
синтаксис используется HCL для интерполяции до того, как произойдет рендеринг шаблона, так что если вы просто используете:
# Template for initial configuration bash script
data "template_file" "init" {
template = "${consul_address}:1234"
vars {
consul_address = "${aws_instance.consul.private_ip}"
}
}
Терраформ попытается найти consul_address
шаблон в выходной файл вместо использования переменной шаблона consul_address
(который, в свою очередь, разрешен private_ip
выход из aws_instance.consul
ресурс.
Это проблема только для встроенных шаблонов, и вам не нужно делать это для шаблонов на основе файлов. Например, это было бы хорошо:
int.tpl
#!/bin/bash
echo ${consul_address}
template.tf
# Template for initial configuration bash script
data "template_file" "init" {
template = "${file("init.tpl")}"
vars {
consul_address = "${aws_instance.consul.private_ip}"
}
}
Конечно, если вам необходимо использовать ${}
Синтаксис буквально в вашем выходном шаблоне, то вам нужно было бы удвоить escape с чем-то вроде этого
#!/bin/bash
CONSUL_ADDRESS_VAR=${consul_address}
echo $${CONSUL_ADDRESS_VAR}
Это тогда будет представлено как:
#!/bin/bash
CONSUL_ADDRESS_VAR=1.2.3.4
echo ${CONSUL_ADDRESS_VAR}