Terraform v0.12 多行字符串 EOF shell-style "here doc" 语法在 v0.11 中没有像以前那样解释
Terraform v0.12 Multi-line String EOF shell-style "here doc" syntax not been interpreted as before with v0.11
在 Octopus Deploy 中,我使用他们的 Apply a Terraform 模板设置了 Terraform Apply Step
在我的 Terraform main.tf 文件中,我想使用连接到 运行 Amazon 上的远程执行程序 Linux AWS 中的 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
上的 Public 密钥进行身份验证
我的私钥作为变量存储在我的 Octopus 部署项目中
为了在 Terraform 中将我的私钥正确解释为多行字符串,我必须使用 'here doc' 语法,使用起始 EOF 和结束 EOF
此语法说明可在 Terraform 官方文档中找到,网址为
https://www.terraform.io/docs/configuration-0-11/syntax.html
这是我最初的问题,因为我没有正确处理多行 PEM 文件,所以我的变量语法崩溃了,我通过 Octopus Deploy Support 提出了下面的问题
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。他们提供了一个内置的特殊变量,所以你可以使用不同的二进制文件
但是当我 运行 使用这个二进制文件时,脚本会崩溃并出现以下错误
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\Work190806135350-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 运行 时的预期结果是它可以正常运行并且 运行 我的 Terraform 在 Octopus Deploy 中应用
我希望 Hashicorp 的某个人对此有解决方法,因为我认为这应该用 https://github.com/hashicorp/terraform/pull/20281
解决
但我在撰写本文时使用的是今天下载的 v0.12.6 的最新二进制文件
有任何关于如何在 v0.12 中使用它的建议吗?干杯
"flush heredoc" 的正确语法不包括最后一个标记上的破折号:
aws_key_path = <<-EOF
#{martinTestPrivateKey}
EOF
如果以前的版本接受 -EOF
来结束 heredoc 那么不幸的是这是一个错误,现在已在 Terraform 0.12 中修复,因此向前推进你必须使用 the syntax as documented,带有标记独自在最后一行。
在 Octopus Deploy 中,我使用他们的 Apply a Terraform 模板设置了 Terraform Apply Step
在我的 Terraform main.tf 文件中,我想使用连接到 运行 Amazon 上的远程执行程序 Linux AWS 中的 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
上的 Public 密钥进行身份验证我的私钥作为变量存储在我的 Octopus 部署项目中
为了在 Terraform 中将我的私钥正确解释为多行字符串,我必须使用 'here doc' 语法,使用起始 EOF 和结束 EOF
此语法说明可在 Terraform 官方文档中找到,网址为
https://www.terraform.io/docs/configuration-0-11/syntax.html
这是我最初的问题,因为我没有正确处理多行 PEM 文件,所以我的变量语法崩溃了,我通过 Octopus Deploy Support 提出了下面的问题
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。他们提供了一个内置的特殊变量,所以你可以使用不同的二进制文件
但是当我 运行 使用这个二进制文件时,脚本会崩溃并出现以下错误
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\Work190806135350-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 运行 时的预期结果是它可以正常运行并且 运行 我的 Terraform 在 Octopus Deploy 中应用
我希望 Hashicorp 的某个人对此有解决方法,因为我认为这应该用 https://github.com/hashicorp/terraform/pull/20281
解决但我在撰写本文时使用的是今天下载的 v0.12.6 的最新二进制文件
有任何关于如何在 v0.12 中使用它的建议吗?干杯
"flush heredoc" 的正确语法不包括最后一个标记上的破折号:
aws_key_path = <<-EOF
#{martinTestPrivateKey}
EOF
如果以前的版本接受 -EOF
来结束 heredoc 那么不幸的是这是一个错误,现在已在 Terraform 0.12 中修复,因此向前推进你必须使用 the syntax as documented,带有标记独自在最后一行。