本地变量
本地变量可以理解为模块中的临时变量,其作用范围在所声明的模块内,通过关键字 locals 进行声明。本地变量适用于配置中有重复定义相同值或表达式的场景,可以减少代码冗余,并且易于修改。同时过度使用本地变量会导致变量的实际值被隐藏,代码晦涩,不利于维护,因此建议合理使用本地变量。
输入变量就像函数参数。
输出变量就像函数返回值。
本地变量就像函数的临时局部变量。
本地变量声明
一组相关的局部变量可以在一个locals 块中一起声明:
locals {
service_name = "forum"
owner = "Community Team"
}本地变量的赋值不仅限于文本常量,它们还可以引用模块中的其他值以进行转换或组合,包括变量、资源属性或其他本地值:
locals {
security_group_ids = concat(ctyun_security_group.sg1.id, ctyun_security_group.sg2.id)
}
locals {
common_tags = {
Service = local.service_name
Owner = local.owner
}
}本地变量的引用
声明了局部值,您就可以在表达式中引用它 local.<NAME>。
resource "ctyun_ecs" "ecs_test" {
instance_name = local.service_name
...
}输入变量
输入变量声明
输入变量是一种无需更改模块自身的源代码,可以自定义名称和输入值。输入变量允许您在不同的 Terraform 配置之间共享模块,从而使您的模块可组合且可重用。
在配置的根模块中声明变量时,可以使用 Terraform CLI 输入或者通过环境变量设置它们的值。在子模块中声明变量时,调用模块应该在module代码块中传递值。
variable "image_id" {
type = string
}
variable "password" {
type = string
sensitive = true
nullable = false
description = "手动输入密码"
}
variable "dns" {
type = list(string)
default = [
"114.114.114.114",
"8.8.8.8",
"8.8.4.4"
]
}
variable "az_info" {
type = list(object({
availability_zone_name = string
availability_zone_count = number
node_type = string
}))
default = [
{
availability_zone_name = "cn-gs-qyi2-1a-public-ctcloud"
availability_zone_count = 1
node_type = "master"
}
]
}上述是 variable 的定义,关键字 variable 后的标签是变量名称,该名称在同一模块的所有变量中必须是唯一的。变量名称由用户自定义,但用户需要注意一下字段不可作为变量名称:source, version, providers, count, for_each, lifecycle, depends_on 和 locals。关于 {} 中定义的属性可参考输入变量参数的内容。
输入变量参数
Terraform CLI 为变量声明定义了以下可选参数
default:配置variable的默认值,当配置默认值后,CLI交互时可不为变量赋值type:声明variable的值类型,如果未明确指定变量类型,则默认为 string。取值分为以下几种:stringnumber
bool
list(<TYPE>)
set(<TYPE>)
map(<TYPE>)
object(<ATTR NAME> = <TYPE>, ...)
tuple([<TYPE>,...])
description:变量的备注validation:输入值约束,可定义一个验证规则用于限制变量取值范围sensitive:将变量定义为敏感变量,定义后,Terraform UI不会将其打印出来。取值范围为true或falsenullable:控制是否可以将值分配null给该变量,默认值为true,当nullable为时true,null是变量的有效值,并且模块配置必须始终考虑变量值为 null 的可能性
输入变量的引用
输入变量可以通过 var.<变量名称> 的形式访问,且只能在声明该变量的模块内访问:
variable "vpc_cidr" {
type = string
description = "the CIDR of VPC"
}
resource "huaweicloud_vpc" "vpc_example" {
name = "tf-vpc"
cidr = var.vpc_cidr
description = "terraform测试使用"
enable_ipv6 = true
}设置变量方式
通过命令行中 -var 选项指定
通过变量定义文件 (.tfvars),在命令行中指定或自动加载
设置环境变量
命令行变量定义
要在命令行上指定单个变量,请 -var 在运行 terraform plan 和 terraform apply 命令时使用该选项:
terraform apply -var="image_id=ami-abc123"
terraform apply -var='image_id_list=["ami-abc123","ami-def456"]' -var="instance_type=t2.micro"
terraform apply -var='image_id_map={"us-east-1":"ami-abc123","us-east-2":"ami-def456"}'您可以多次使用 -var 在单个命令中设置几个不同的变量。
变量定义 (.tfvars) 文件
如果配置中使用了很多变量,建议使用变量定义文件来设置这些变量,然后通过 -var-file 选项指定该文件:
terraform apply -var-file="examples.tfvars" 变量定义文件使用与 Terraform 语言文件相同的基本语法,但仅包含变量名称分配:
image_id = "ami-abc123"
dns = [
"114.114.114.114",
"8.8.8.8",
"8.8.4.4"
]Terraform 还会自动加载一些变量定义文件:
文件名为 terraform.tfvars 或 terraform.tfvars.json 的文件
文件名称以 .auto.tfvars 或 .auto.tfvars.json 结尾的文件
对于以 .json 结尾的文件,需要使用 JSON对象表示:
{
"vpc_name": "my_vpc"
"az_info": [
{
availability_zone_name = "cn-gs-qyi2-1a-public-ctcloud"
availability_zone_count = 1
node_type = "master"
}
]
}环境变量定义变量
作为定义变量的备用方案,Terraform 在其自身进程的环境中搜索以 TF_VAR_ 声明变量的名称命名的环境变量。
在自动化运行 Terraform 时,或者使用相同变量连续运行一系列 Terraform 命令时非常有用。例如,在bashUnix 系统的提示符下:
$ export TF_VAR_image_id=ami-abc123
$ terraform plan
...变量定义优先级
您可以自由组合使用上述设置变量的方式。对于复合类型的变量,为了提高可读性并避免转义带来的问题,建议使用变量定义文件来设置。如果为同一个变量分配了多个值,Terraform 将使用最后一个值进行覆盖。Terraform 根据以下顺序加载变量 (根据顺序,后面的源优于前面的源):
环境变量
terraform.tfvars 或 terraform.tfvars.json 文件
*.auto.tfvars 或 *.auto.tfvars.json 文件
命令行中的 -var 和 -var-file 选项
输出变量
输出变量声明
输出变量可在命令行上提供用户需要的信息,并可公开其他 Terraform 配置使用的信息。输出变量类似于编程语言中的返回值,是一种对外公开部分信息的方式。
输出变量有多种用途:
子模块可以使用输出将其资源属性的子集公开给父模块。
根模块可以在运行
terraform apply/output后 在CLI上打印特定值。
按照约定,输出变量通过“output”关键字进行声明:
output "az_name" {
value = data.ctyun_zones.az.zones[0]
}关键字 output 后面紧跟的标签是 output 名称,它必须是有效的标识符。在根模块中,此名称显示给用户;在子模块中,它可用于访问输出的值。
参数 value 采用一个赋值表达式,将结果返回给用户。在本例中,该表达式指的是将data source ctyun_zones中变量*az.zones[0]*输出。任何有效的表达式都可以作为输出值。
输出变量参数
output 块可以选择性地包含 description、sensitive 和 depends_on 参数,这些内容将在以下章节中进行描述。
description:输出变量注释sensitive:限制是否在CLI 上输出depends_on:明确输出依赖关系
output "eip_addr" {
value = ctyun_eip.eip_example.address
description = "EIP实例的公网地址"
}
output "db_password" {
value = ctyun_mysql_instance.mysql_examples.password
description = "mysql实例的root密码"
sensitive = true
}
output "instance_ip_addr" {
value = ctyun_eip.eip_example.address
description = "EIP实例的公网地址"
depends_on = [
ctyun_security_group_rule.sg_rule_example,
]
}注意:标记为敏感项的输出变量在输出时会自动被隐藏,但其输出值仍然可以通过以下方式可见:
输出变量的值记录在 state 文件中,其值对所有能够访问state 文件的用户均可见.
子模块中敏感输出变量值被父模块调用,通过父模块的相关输出和资源引用后可以在CLI中显示。