0

我有一个cloud-init配置文件,用于使用Terraform在 AWS 中启动 VM ,我还想使用Multipass在本地运行以进行测试和调试。

cloud-init 文件包含一些 shell 脚本, Terraform 需要重写这些脚本,以便它们引用变量$$var而不是$var. 它还为主机名使用模板变量。

为了能够在云端和本地使用相同的配置文件,我想我可以使用以下命令来扩展模板并启动 Multipass VM,而无需手动替换字符串:

terraform console <<< "templatefile(\"cloud-init.yaml\", {hostname: \"test\"})" | multipass launch -n test --cloud-init -

但事实证明,该templatefile函数将其输出包装在 heredoc 中:

<<EOT
... contents ...
EOT

Multipass 当然不理解这种语法并打印(相当无用的)错误消息:

launch failed: operator[] call on a scalar (key: "users") 

理想情况下,Terraform 命令应该能够在没有 heredoc 包装器的情况下呈现文件。但或者,是否有一个shell技巧可以使这项工作?

4

1 回答 1

0

这有点恶心,但是通过管道传递内容sed '1d;$d'会删除包含heredoc标记的第一行和最后一行:

terraform console <<< 'templatefile("cloud-init.yaml", {hostname: "test"})' | sed '1d;$d' | multipass launch -n test --cloud-init -

这当然是脆弱的,因为例如空白更改可能会破坏标记所在位置的假设。因此,该解决方案应被视为缺乏更好的解决方案的黑客/解决方法。

于 2021-05-30T08:36:46.853 回答