1.7.5.1. console

有时我们想要一个安全的调试工具来帮助我们确认某个表达式是否合法,或者表达式的值是否符合预期,这时我们可以使用 terraform console 启动一个交互式控制台。

1.7.5.1.1. 用法

terraform console [options] [options]

console 命令提供了一个用以执行和测试各种表达式的命令行控制台。在编码时如果我们不确定某个表达式的最终结果时(例如使用字符串模版),我们可以在这个控制台中搭配当前状态文件中的数据进行各种测试。

如果当前状态是空的或还没有创建状态文件,那么控制台可以用来测试各种表达式语法以及内建函数。假如当前根模块有状态,console 命令将会对状态加锁,这使得我们无法在运行其他可能会修改状态的操作时使用 console 命令。

在控制台中可以使用 exit 命令或是 Ctrl-C 或是 Ctrl-D 退出。

当使用的是 local Backend 时,terraform console 可以使用 -state 遗留参数:

  • -state=path:指向本机状态文件的路径。表达式计算会使用该状态文件中记录的值。如果没有指定,则会使用当前工作区(Workspace)关联的状态文件

1.7.5.1.2. 脚本化

terraform console 命令可以搭配非交互式脚本使用,可以使用管道符将其他命令输出接入控制台执行。如果没有发生错误,只有最终结果会被打印。

样例:

echo 'split(",", "foo,bar,baz")' | terraform console
tolist([
  "foo",
  "bar",
  "baz",
])

1.7.5.1.3. 远程状态

如果使用了远程 Backend 存储状态,Terraform 会从远程 Backend 读取当前工作区的状态数据来计算表达式。

1.7.5.1.4. 搭配既有计划文件运行

默认情况下,terraform console 根据当前 Terraform 状态计算表达式,因此对于尚未通过 Apply 创建的资源实例,结果通常非常有限。

您可以使用 -plan 选项首先生成执行计划,就像运行 terraform plan 一样,然后根据计划的状态进行计算,以描述 Terraform 期望在应用计划后应得的值。这通常会在控制台提示出现之前引发更长的延迟,但作为回报,可知的表达式范围中将有一组更完整的可用值。

一个好的 Terraform 配置代码,在 Plan 阶段不应对实际远程对象进行任何修改,但我们可以编写一个在 Plan 时可以执行重要操作的配置。例如,使用 hashcorp/external Provider 程序的 external 数据源的配置可能会在 Plan 阶段运行设置的的外部命令,这意味着该外部命令也会被 terraform console -plan 运行。

我们不建议编写在 Plan 阶段进行更改的配置。如果您不顾该建议而编写了此类配置,则在 Plan 模式下针对该配置使用控制台时请务必小心。

1.7.5.1.5. 例子

terraform console 命令将从配置的 Backend 读取当前工作目录中的 Terraform 配置和 Terraform 状态文件,以便可以根据配置和状态文件中的值计算表达式。

假设我们有如下的 main.tf

variable "apps" {
  type = map(any)
  default = {
    "foo" = {
      "region" = "us-east-1",
    },
    "bar" = {
      "region" = "eu-west-1",
    },
    "baz" = {
      "region" = "ap-south-1",
    },
  }
}

resource "random_pet" "example" {
  for_each = var.apps
}

执行 terraform console 会进入交互式 shell,我们可以在其中计算表达式:

打印一个 map:

> var.apps.foo
{
  "region" = "us-east-1"
}

根据给定值过滤 map:

> { for key, value in var.apps : key => value if value.region == "us-east-1" }
{
  "foo" = {
    "region" = "us-east-1"
  }
}

确认特定值是否为尚不知晓(Known after apply)值:

> random_pet.example
(known after apply)

测试各种函数:

> cidrnetmask("172.16.0.0/12")
"255.240.0.0"

results matching ""

    No results matching ""