Terraform v0.12多行字符串EOF shell样式的“ here doc”语法在v0.11

时间:2019-08-06 15:33:41

标签: terraform octopus-deploy

在Octopus部署中,我已经使用他们的Apply Terraform模板设置了Terraform Apply步骤

在我的Terraform main.tf文件中,我想使用一个连接在AWS的Amazon Linux EC2实例上运行远程执行程序

    resource "aws_instance" "nginx" {
      ami           = "${var.aws_ami}"
      instance_type = "t2.nano"
      key_name      = "${var.key_name}"

      connection {
        type        = "ssh"
        user        = "ec2-user"
        private_key = "${var.aws_key_path}"
      }

      provisioner "remote-exec" {
        inline = [
          "sudo amazon-linux-extras install epel -y",
          "sudo yum update -y",
          "sudo amazon-linux-extras install nginx1.12 -y",
          "sudo systemctl enable nginx.service",
          "sudo systemctl start nginx.service",
          "sudo systemctl status nginx.service"
        ]
      }
    }

作为连接块的一部分,我们需要使用SSH密钥对和私钥PEM进行连接,以对存储在AWS上的公钥进行身份验证

我的私钥在八达通部署中作为变量存储在我的项目中

为使我的私钥在Terraform中正确解释为多行字符串,我必须使用'here doc'语法,并使用起始EOF和结束EOF

此语法说明可以在Terraform官方文档中找到

https://www.terraform.io/docs/configuration-0-11/syntax.html

这是我最初的问题,因为我没有正确处理多行PEM文件,并且我通过Octopus Deploy支持在下面提出了问题,所以我的变量语法崩溃了

https://help.octopus.com/t/terraform-apply-step-pem-variable-set-to-unix-lf-ucs-2-le-bom/23659

他们友善地将我指向EOF语法的方向

这一切在Terraform v0.11上都很好用,但是我们这边有很多代码是用v0.12的最新HCL2编写的

因此,我想强制Octopus Deploy使用v0.12二进制文件,而不是Octopus Deploy随附的预打包v0.11。而且它们提供了内置的Special var,因此您可以使用其他二进制文件

但是当我使用此二进制文件运行该脚本时,它会因以下错误而崩溃

Error: Unterminated template string
No closing marker was found for the string. 
August 6th 2019 14:54:07 Error
Calamari.Integration.Processes.CommandLineException: The following command: "C:\Program Files\Octopus Deploy\Octopus\bin\terraform.exe" apply -no-color -auto-approve -var-file="octopus_vars.tfvars" 
August 6th 2019 14:54:07 Error
With the working directory of: C:\Octopus\Work\20190806135350-47862-353\staging 
August 6th 2019 14:54:07 Error
Failed with exit code: 1 
August 6th 2019 14:54:07 Error
Error: Unterminated template string 
August 6th 2019 14:54:07 Error
  on octopus_vars.tfvars line 34:

我看过v0.12的官方文档

https://www.terraform.io/docs/configuration/syntax.html#terraform-syntax

我不确定在v0.11中如何管理多行方面是否有什么帮助

这是从我的tfvars文件成功在v0.11中工作的代码块

aws_ami = "#{ami}"
key_name = "#{awsPublicKey}"
aws_private_key = <<-EOF
#{testPrivateKey}
-EOF

当我使用最新版本的Terraform v0.12.6运行此程序时,预期结果是它将正常运行并在Octopus Deploy中运行Terraform Apply

我在这里希望Hashicorp的某人对此有一个解决方法,因为我认为应该使用https://github.com/hashicorp/terraform/pull/20281

解决此问题。

但是在编写今天下载的v0.12.6时,我正在使用最新的二进制文件

有人建议如何在v0.12中运行它吗?干杯

1 个答案:

答案 0 :(得分:2)

“ flush heredoc”的正确语法在最终标记上不包含破折号:

import pandas as pd
a = pd.DataFrame([0,1,2,3,4,5,6,7])
a.values[-1] # returns 7
a.values[-5:-1]# returns 3,4,5,6
a.values[-5:]# returns 3,4,5,6,7


b = []
for i in range(0,len(a)):
    b.append(a.values[-(i+1):-i])


如果先前的版本接受aws_key_path = <<-EOF #{martinTestPrivateKey} EOF 来结束heredoc,那么很遗憾,这是一个错误,现在已在Terraform 0.12中修复,因此,继续前进时,您必须使用the syntax as documented,并且单独使用标记最后一行。