amazon-web-services - 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 是否支持这一点以及我做错了什么?
解决方案
下面的代码对我有用:
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
}
基本上需要将初始标记加倍并转义美元符号。
推荐阅读
- java - 修改流阅读器类以从文件而不是 System.in 中读取
- ios - Swift为视图背景绘制弧线
- mysql - 基于一列数据合并MySQL中的2个表
- javascript - 为 clappr 播放器创建暂停链接
- c++ - 有没有办法同时为 C++ 中的多个模板分配一个类型?
- node.js - nodejs/mocha/chai as promise:预期异步函数中使用的变量在外部初始化
- python - 如何使用 Python 抓取该网站上由 AJAX 编写的所有表格内容?
- python - 无法在 Visual Studio 中使用 seaborn 绘图功能
- vba - 同一行的两列中每个可能的值组合的出现频率
- php - 在不同的变量中分隔一个 json