1.4.4.1. 输出值

我们在介绍输入变量时提到过,如果我们把一组Terraform代码想像成一个函数,那么输入变量就是函数的入参;函数可以有入参,也可以有返回值,同样的,Terraform代码也可以有返回值,这就是输出值。

大部分语言的的函数只支持无返回值或是单返回值,但是Terraform支持多返回值。在当前模块apply一段Terraform代码,运行成功后命令行会输出代码中定义的返回值。另外我们也可以通过terraform output命令来输出当前模块对应的状态文件中的返回值。

1.4.4.1.1. 输出值的声明

输出值的声明使用输出块,例如:

output "instance_ip_addr" {
  value = aws_instance.server.private_ip
}

output关键字后紧跟的就是输出值的名称。在当前模块内的所有输出值的名字都必须是唯一的。output块内的value参数即为输出值,它可以像是上面的例子里那样某个resource的输出属性,也可以是任意合法的表达式。

输出值只有在执行terraform apply后才会被计算,光是使用terraform plan并不会计算输出值。

Terraform代码中无法引用本目录下定义的输出值。

output块还有一些可选的属性:

1.4.4.1.1.1. description

output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."
}

与输入变量的description类似,我们不再赘述。

1.4.4.1.1.2. sensitive

一个输出值可以标记sensitivetrue,表示该输出值含有敏感信息。被标记sensitive的输出值只是在执行terraform apply命令成功后会打印"\"以取代真实的输出值,执行terraform output时也会输出"\",但仍然可以通过执行terraform output -json看到实际的敏感值。

需要注意的是,标记为sensitive输出值仍然会被记录在状态文件中,任何有权限读取状态文件的人仍然可以读取到敏感数据。

1.4.4.1.1.3. depends_on

关于depends_on的内容将在resource章节里详细介绍,所以这里我们只是粗略地介绍一下。

Terraform会解析代码所定义的各种data、resource,以及他们之间的依赖关系,例如,创建虚拟机时用的image_id参数是通过data查询而来的,那么虚拟机实例就依赖于这个镜像的data,Terraform会首先创建data,得到查询结果后,再创建虚拟机resource。一般来说,data、resource之间的创建顺序是由Terraform自动计算的,不需要代码的编写者显式指定。但有时有些依赖关系无法通过分析代码得出,这时我们可以在代码中通过depends_on显式声明依赖关系。

一般output很少会需要显式依赖某些资源,但有一些特殊场景,例如在当前代码中调用一个模块(可以理解成调用另一个目录中的Terraform代码创建一些资源)时,调用者希望在模块资源全部创建完毕以后才继续后续的创建工作,这时我们可以为模块设计一个output,通过depends_on显式声明依赖关系,以确保该output必须在所有模块资源成功创建以后才能被读取,这样我们就可以在模块尺度上控制资源的创建顺序。

depends_on的用法如下:

output "instance_ip_addr" {
  value       = aws_instance.server.private_ip
  description = "The private IP address of the main server instance."

  depends_on = [
    # Security group rule must be created before this IP address could
    # actually be used, otherwise the services will be unreachable.
    aws_security_group_rule.local_access,
  ]
}

我们不鼓励针对output定义depends_on,只能作为最后的手段加以应用。如果不得不针对output定义depends_on,请务必通过注释说明原因,方便后人进行维护。

1.4.4.1.1.4. precondition

output 块从 Terraform v1.2.0 开始也可以包含一个 precondition 块。

output 块上的 precondition 对应于 variable 块中的 validation 块。validation 块检查输入变量值是否符合模块的要求,precondition 则确保模块的输出值满足某种要求。我们可以通过 precondition 来防止 Terraform 把一个不合法的处置值写入状态文件。我们可以在合适的场景下通过 precondition 来保护上一次 apply 留下的合法的输出值。

Terraform 在计算输出值的 value 表达式之前执行 precondition 检查,这可以防止 value 表达式中的潜在错误被激发。

results matching ""

    No results matching ""