Terraform remote-exec执行EC2命令特殊字符转义报错求解
问题原因
你遇到的报错来自两个HCL语法冲突:
- HCL会自动识别
${}为自身的插值语法,会尝试在配置渲染阶段解析,不会原样传递给EC2实例的shell执行 - 双引号直接嵌套会被HCL识别为字符串结束标记,触发字符格式错误
解决方案
提供两种经过验证的写法,任选一种即可:
方案1:使用单引号包裹的heredoc语法(推荐,无需逐字符转义)
通过heredoc + 单引号标记完全禁用HCL对块内内容的插值,所有命令原样传递给shell执行,格式更整洁:
provisioner "remote-exec" { inline = [ <<-'EOT' VAR=$(cat contents.txt | grep '"token"') VAR="${VAR:11}" VAR="${VAR:0:-1}" # 后续可追加使用$VAR的业务命令 EOT ] }
说明:<<-'EOT'的前缀-会自动忽略行首的制表符,不需要额外调整缩进格式。
方案2:逐字符转义特殊字符
如果需要保持单条inline命令的写法,按以下规则转义即可:
- 用
$$代替$,告知HCL该字符需要保留给shell使用 - 用
\"转义嵌套的双引号,避免被识别为字符串结束
provisioner "remote-exec" { inline = [ "VAR=$(cat contents.txt | grep '\"token\"')", "VAR=\"$${VAR:11}\"", "VAR=\"$${VAR:0:-1}\"" ] }
内容的提问来源于stack exchange,提问作者Pratik das baghel
相关产品推荐
相关产品推荐

