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}
Другие вопросы по тегам