Terraform:heredoc anchor

时间:2016-06-17 17:00:09

标签: terraform

我正在尝试在我的terraform脚本的provisioner "remote-exec"块中使用多行字符串。然而,每当我使用文档和各种示例中概述的EOT语法时,我都会收到错误消息,抱怨:invalid characters in heredoc anchor

以下是收到此错误的简单provisioner "remote-exec"的示例(两种类型的EOT在单独尝试时都会收到此错误):

provisioner "remote-exec" {
  inline = [
    << EOT 
    echo hi 
    EOT,

    << EOT 
    echo \
    hi 
    EOT,
  ]
}

更新:这是工作解决方案,如果您遇到此问题,请仔细阅读,因为在EOF方面,terraform非常挑剔:

provisioner "remote-exec" {
  inline = [<<EOF

   echo foo
   echo bar

  EOF
  ]
}

请注意,如果要使用EOF,则provisioner "remote-exec"块中使用的所有命令都必须位于EOF内。你不能同时拥有EOF和非EOF。

EOF的第一行必须以这样的方式开始,并且<<EOF之后你不能在这一行中有任何空格,否则它会抱怨invalid characters in heredoc anchor

  inline = [<<EOF

您的EOF必须以EOF]

相同的缩进方式结束。
  EOF
  ]

2 个答案:

答案 0 :(得分:7)

Terraform中的Heredocs对周围的空白特别有趣。

将您的示例更改为以下内容似乎摆脱了heredoc特定错误:

provisioner "remote-exec" {
  inline = [<<EOF
echo hi
EOF,
<<EOF
echo \
hi
EOF
  ]
}

这里根本不需要多个heredoc,因为内联数组是应该在远程主机上运行的命令列表。使用带有多行命令的heredoc应该可以正常工作:

provisioner "remote-exec" {
  inline = [<<EOF
echo foo
echo bar
EOF
  ]
}

答案 1 :(得分:1)

here-document end-delimiter末尾有一个逗号(,)。这是不允许的。

请改为尝试:

provisioner "remote-exec" {
  inline = [
    <<EOT 
    echo hi
EOT
    ,
    <<EOT 
    echo \
    hi 
EOT
    ,
  ]
}

我不知道该文件的语法要求,但是here-document end-delimiter需要匹配其开头使用的单词。

此外,通常(在shell中),分隔符需要首先出现在行上(前面没有空格)。

事实上,Terraform documentation说明了这一点:

  

多行字符串可以使用shell样式&#34;这里doc&#34;语法,用   字符串以<<EOT之类的标记开头,然后是字符串结尾   与EOT在一条线上。字符串和结尾的行   标记不得缩进。