linux - terraform 的问题,为什么在尝试规划特定资源时双引号被忽略

标签 linux terraform virtual-machine

我正在尝试运行一个针对特定模块的 terraform plan 命令,该模块是使用每个 . 这是执行 terraform 计划的示例命令

terraform plan -target=module.virtualmachinescaleset.azurerm_linux_virtual_machine_scale_set.this["x"]

我不断收到以下错误 索引括号必须包含文字数字或文字字符串

最佳答案

当您在 shell 提示符下键入命令时,该命令首先由 shell 本身解析,以确定您传递的参数(例如,这可能取决于评估环境变量),然后 shell 传递一个参数数组到您运行的程序。

您没有提到您使用哪个 shell,但 Unix shell 的典型约定是引号字符 " 标记一系列字符的开始和结束,其中空格字符 not 表示两个参数之间的分隔。如果没有引号,空格将用作分隔参数的标记。

即使引号内没有空格,shell 仍然将它们视为特殊的,因此它会在处理过程中删除它们,导致解析为 Terraform 的参数数组如下所示(每个参数一行,所有Terraform 完全按照字面意思理解):

terraform
plan
-target=module.virtualmachinescaleset.azurerm_linux_virtual_machine_scale_set.this[x]

由于 shell 在其工作中删除了引号,Terraform 发现 -target= 之后的字符不是有效的资源实例地址,因为在该位置它需要十进制数字(对于具有 count 的资源)或带引号的字符串(对于具有 for_each 的资源)。

鉴于此,我们需要做的是告诉 shell 它应该按字面意思获取整个资源实例地址,而不需要任何特殊解释,例如替换环境变量或删除引号。 Unix shell 中的常用语法是单引号 ',它类似于双引号 " 的更强版本,禁用除了字面意义上的空格之外,特殊字符的解释:

terraform plan -target='module.virtualmachinescaleset.azurerm_linux_virtual_machine_scale_set.this["x"]'

当 shell 扫描这个命令行中的字符时,第一个 ' 将导致 shell 切换到文字模式(并且 shell 会丢弃文字 >'),因此它将按字面意思处理其他所有内容,直到找到第二个 ',它再次将 shell 返回到正常解析模式。

因此,这次的结果正是 Terraform 所期望的:

terraform
plan
-target=module.virtualmachinescaleset.azurerm_linux_virtual_machine_scale_set.this["x"]

剩下的一个需要注意的警告是,在您的实例 key 本身包含文字 ' 字符的罕见情况下该怎么办。由于这是 shell 在 ' 中视为特殊的一个字符,我们仍然需要以一种特殊的方式转义它,我们可以通过以 ' 结束文字序列来实现这一点>,然后使用 \ 转义字符包含文字引号,然后使用另一个 ' 重新打开一个新的文字序列,给出相当困惑的序列 '\'' 😬,在更完整的示例中更容易看到:

terraform plan -target='module.virtualmachinescaleset.azurerm_linux_virtual_machine_scale_set.this["it'\''s annoying to deal with single quotes"]'

幸运的是,这种情况并不经常出现,因此我提及它只是为了完整性。大多数时候,只需将地址放在单引号 ' 中就足够了。


( future 读者请注意:上述内容对于 Unix 风格系统(如 Linux 和 macOS)上的标准 shell 来说是正确的,但对于 Windows 来说则不然,Windows 有自己不同的处理命令行参数的规则。在 Windows 上键入命令提示符时转义引号的不同策略。)

关于linux - terraform 的问题,为什么在尝试规划特定资源时双引号被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72720095/

相关文章:

c# - Linux-coreclr-rc1下使用System.Data.SqlClient

linux - 将此linux语句转换为windows命令提示符支持的语句

azure - 可用作 AKS 节点的最便宜的 VM 是多少?

azure - 带有 https + 负载均衡器的 Terraform Azure Linux VM 无法正常工作

linux - 在 headless (headless)虚拟机上禁用监视器

linux - 我的 shell 脚本在执行后停止

linux - 如何强制linux在高(64位)地址空间中分配内存

amazon-web-services - Terraform - 无法在 AWS ECS 中使用负载均衡器

linux - 无法启动Hadoop虚拟机

java - 1 台本地主机上 2 台 Virtual Box 计算机之间的 TCP 连接