Terraform输出值

  1. 输出值声明
  2. 输出值属性
    1. 输出值描述
    2. 隐藏输出值
    3. 输出值依赖
    4. 输出值条件检查

如果把Terraform代码看作是一个函数的话,那么“输入变量”是函数的参数,而“局部值”是函数内部的局部变量,“输出值”就是函数的返回值。
在Terraform代码中可以定义多个输出值。
在执行terraform apply命令成功之后会打印出定义的输出值信息,还可以通过terraform output打印出上一次执行terraform apply成功之后得到的输出值。

输出值声明

Terraform的输出值使用output关键字声明,如:

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

output关键字后紧跟的就是输出值的名称,在当前模块内所有输出值的名称都必须是唯一的。
output块内的value参数就是输出值,它可以引用某个资源的输出属性,也可以是一个合法的表达式。

Terraform输出值只有在执行terraform apply之后才会被计算,仅仅执行terraform plan时并不会计算输出值。
注: 不能在output块中引用当前模块下定义的其他输出值。

输出值属性

output块中除了定义必须的value属性之后,还可以定义一些其他的可选属性。

输出值描述

output块中使用description属性描述输出值的含义,如:

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

隐藏输出值

如果一个输出值设置sensitive属性为true,表示该输出值含有敏感信息,在执行terraform apply命令成功之后会打印<sensitive>取代真实的输出值。
执行terraform output时也是输出<sensitive>取代真实的输出值,但是依然可以通过执行terraform output -json看到真实的输出值。
另外,标记为sensitive的输出值仍然会被记录在状态文件中,任何有权限读取状态文件的人仍然可以读取到敏感数据。

如下代码片段:

terraform {
  required_providers {
    local = {
      source = "hashicorp/local"
      version = "2.4.0"
    }
  }
}

provider "local" {
  # Configuration options
}

resource "local_file" "terraform-introduction" {
  content = "Hi guys, this is the sample of Terraform"
  filename = "${path.module}/terraform-sample.txt"
}

output "file" {
  value = local_file.terraform-introduction.filename # 输出值引用资源的输出属性
  sensitive = true # 将输出值标记为包含敏感信息
}

在执行terraform apply之后不显示真实的输出值:

$ terraform apply
省略部分输出...
Outputs:

file = <sensitive>

执行terraform apply成功之后再次执行terraform output依然不显示真实的输出值:

$ terraform output
file = <sensitive>

执行terraform apply成功之后再次执行terraform output -json时会显示真实的输出值:

$ terraform output -json
{
  "file": {
    "sensitive": true,
    "type": "string",
    "value": "./terraform-sample.txt" # 这里显示的是真实的输出值
  }
}

输出值依赖

一般output很少会需要显示依赖某些资源,但是在一些特殊场景,例如:在当前代码中调用另一个模块时,调用者希望在模块资源全部创建完毕以后才继续后续的创建工作,这时可以为模块设计一个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 = [
        # 先创建安全组,再创建实例
        aws_security_group_rule.local_access,
    ]
}

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

输出值条件检查

从Terraform v1.2.0开始可以在output块中包含一个条件检查块:precondition属性。
output块中定义precondition块用于确保输出值满足某种要求,可以通过precondition来防止Terraform把一个不合法的处置值写入到状态文件中,可以在合适的场景下通过precondition来保护上一次执行terraform apply时留下的合法的输出值。

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

Terraform输出值的precondition对应于输入变量的validation块。

代码示例如下:

output "api_base_url" {
  value = "https://${aws_instance.example.private_dns}:8433/"

  # EC2实例必须拥有一个加密的根卷
  precondition {
    condition     = data.aws_ebs_volume.example.encrypted
    error_message = "The server's root volume is not encrypted."
  }
}

【参考】
Output Values


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^