首页 > 解决方案 > Terraform 不支持括号中的 shell 变量?

问题描述

我正在使用 Terraform v0.13.1。我正在尝试使用配置器 local-exec 在 EC2 实例上运行一些 shell 命令:

provisioner "local-exec" {
  command = <<EOF
    AWS_PROFILE=test ssh centos@<EC2 instance ID> "filename=test && touch \$filename && mv \$filename \$\{filename//t/a\}"
    EOF
}

运行 terraform apply 后收到以下错误消息:

null_resource.test (local-exec): Executing: ["/bin/sh" "-c" "      AWS_PROFILE=test ssh centos@<instance ID> \"filename=test && touch \\$filename && mv \\$filename \\$\\{filename//t/a\\}\"\n"]
null_resource.test (local-exec): mv: cannot move 'test' to '${filename//t/a}' : No such file or directory


Error: Error running command '      AWS_PROFILE=test ssh centos@<instance ID> "filename=test && touch \$filename && mv \$filename \$\{filename//t/a\}"
': exit status 1. Output: mv: cannot move 'test' to '${filename//t/a}' : No such file or directory

在向美元符号添加转义后,Terraform 似乎能够解析 $filename 变量。但是,在我的情况下,括号 (${filename}) 中的 shell 变量没有被正确解析,即使我在美元符号中添加了转义。

我也尝试过 $$ 和 %${ 但都没有成功。我迷失了这一点。有人可以告知 Terraform 是否支持这一点以及我做错了什么?

标签: amazon-web-servicesshellterraform

解决方案


下面的代码对我有用:

provisioner "local-exec" {
    interpreter = ["/bin/bash", "-c"]
    command = <<EOF
        AWS_PROFILE=test ssh centos@<instance ID> "filename=test && touch \$filename && mv \$filename \$${filename//t/a}"
      EOF
    }

基本上需要将初始标记加倍并转义美元符号。


推荐阅读