Terraform Output 变量输出

2024-04-09 23:20
文章标签 输出 变量 output terraform

本文主要是介绍Terraform Output 变量输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

output可以理解为它是一个变量,只不过它是输出变量,它主要的是帮我们打印变量。

下面是一个输出变量:

Changes to Outputs:+ first_image_id = [+ "centos_7_9_uefi_x64_20G_alibase_20210611.vhd",+ "centos_7_9_uefi_x64_20G_scc_20220906.vhd",+ "centos_7_9_x64_20G_alibase_20220824.vhd",+ "centos_7_8_amd_x64_20G_alibase_20200806.vhd",+ "centos_7_8_tpm_x64_20G_alibase_20200810.vhd",+ "centos_7_8_x64_20G_alibase_20211130.vhd",+ "centos_7_7_x64_20G_alibase_20211130.vhd",+ "centos_7_6_x64_20G_alibase_20211130.vhd",+ "centos_7_5_x64_20G_alibase_20211130.vhd",+ "centos_7_05_64_40G_scc_20190415.raw",+ "centos_7_04_64_20G_alibase_201701015.vhd",+ "centos_7_03_64_20G_alibase_20170818.vhd",+ "centos_7_02_64_20G_alibase_20170818.vhd",]+ my_env         = "prod"

想输出的东西都可以输出。

输出值声明

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_ipdescription = "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_ipdescription = "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.encryptederror_message = "The server's root volume is not encrypted."}
}

output-子模块间的引用

引用的语法:

module.<module_name>.<output_name>

其实每一个目录都可以理解为一个模块,最外层的模块叫做根模块。

比如在写esc代码的时候,创建两台ecs,总不能定义两个ecs资源吧,定义一次,改改参数就行了,或者直接引用。模块其实也帮我们节省代码了,这是管理terraform最佳实践。

如果在自己在本模块当中,资源引用output变量会报错,在本模块当中,还是直接引用资源的属性即可。

output "security_group_id" {value = alicloud_security_group.group.id
}│ Error: Reference to undeclared input variable
│
│   on alicloud_security_group_rule.tf line 19, in resource "alicloud_security_group_rule" "allow_22_tcp":
│   19:   security_group_id = var.security_group_id
│
│ An input variable with the name "security_group_id" has not been declared. This variable can be declared with a        
│ variable "security_group_id" {} block.

正确的引用方式:

provider "alicloud" {region  = var.REGION
}module "data_vpcs" {source = "../modules/data/vpc"REGION = var.REGIONBUSSINESS_DOMAIN=var.BUSSINESS_DOMAINENV = var.ENVBUSSINESS = var.BUSSINESSCIDR_BLOCK = var.CIDR_BLOCK
}module "create_nas" {depends_on = [module.data_vpcs]source = "../modules/nas"VPC_ID = module.data_vpcs.vpcs.vpcs.0.idVSW_ID = module.data_vpcs.vpcs.vpcs.0.vswitch_ids[0]LIFECYCLE_RULE_NAME = var.LIFECYCLE_RULE_NAMERESERVED_DAYS = var.RESERVED_DAYSUSE = var.USEUID_TYPE = var.UID_TYPEUID = var.UIDENV = var.ENVREGION = var.REGIONBUSSINESS_DOMAIN = var.BUSSINESS_DOMAINBUSSINESS = var.BUSSINESSPROTOCOL_TYPE = var.PROTOCOL_TYPESTORAGE_TYPE = var.STORAGE_TYPEFILE_SYSTEM_TYPE = var.FILE_SYSTEM_TYPE
}

这篇关于Terraform Output 变量输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889494

相关文章

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

LibSVM学习(五)——分界线的输出

对于学习SVM人来说,要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。我们这一节不讨论svm-toy怎么使用,因为这个是“傻瓜”式的,没什么好讨论的。这一节我们主要探讨怎么结合训练结果文件

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满