在user_data配置文件中实现'for循环'

时间:2018-06-14 10:02:12

标签: amazon-web-services terraform

我目前正在使用template_fileuser_data设置为aws_launch_configuration,如下所示:

resource "aws_launch_configuration" "launch_config" {
    ...
    user_data                     = "${data.template_file.init.rendered}"
}

data "template_file" "init" {
    template = "${file("router-init.sh.tpl")}"

    vars {
        hub_ip_addresses = "${join(",", aws_instance.gridHub.*.private_ip)}"
    }
}

我将一个变量(即hub_ip_addresses)输入到router-init.sh.tpl文件中,在这个文件中,我正在使用这样的参数:

`#!/bin/sh
...  
IFS=',' read -r -a array <<< "$hub_ip_addresses"
for element in "${array[@]}"
do
    #do stuff with $element
done 

基本上,我是基于分隔符拆分字符串,然后循环遍历数组中的每个ip地址。

当我在本地计算机上运行它时,这个bash脚本运行正常 - 但是,当terraform执行它时,它会抛出一个错误: * data.template_file.init: data.template_file.init: failed to render : parse error at 13:25: expected expression but found invalid sequence "@"

我认为'@'符号导致问题。有这样的原因吗?我需要用'\'来逃避吗?

编辑:不确定是否与此问题相关,但在bash脚本的前一行IFS=',' read -r -a array <<< "$hub_ip_addresses"中,<<<似乎导致其他所有内容看起来好像在里面评论(即灰色,好像它在引号'内)。)

1 个答案:

答案 0 :(得分:1)

您需要将模板中的$字符加倍,或者Terraform会尝试将它们作为模板的输入变量进行插值。

template docs cover this briefly虽然给出的示例是内联模板而不是所有模板,包括那些使用file() function加载的模板。

类似于:

#!/bin/sh
...  
IFS=',' read -r -a array <<< "$hub_ip_addresses"
for element in "$${array[@]}"
do
    #do stuff with $$element
done