变量分为两种类型,一种为输入变量,另外一种为输出变量。
之前在写tf的模板文件的时候用了很多变量,比如在写认证信息的时候,定义的变量存放了阿里云的ak和sk,最后就是region的信息。
变量的使用都是使用variable关键字,后面跟上变量的名称,块里面有变量的类型。
只需要将模块当中经常变化的部分声明为变量,类似于shell。
这些变量也可以跨不同的模块去共享,比如像region信息,当我们有多个模块的时候,既然在同一个region下面,我们就不需要声明很多这种变量了,这样可以实现组合和重用。
可以从终端读取,通过export声明的变量。
tf会去读取文件里面的变量,默认读取的文件terraform.tfvars,当项目里面有这个文件,那么tf在执行的时候会以这里面的变量去读取。
Variables可选参数
在UI当中显示,就是在tf终端当中打印出来的信息,有很多变量我们可以让它不展示出来,这个是个布尔值,如果是true就不展示。可以看到,引用了该变量,在plan下面该变量被打印出来了。
变量参数类型还是很多的,之前在其他语言里面声明了变量,可能是字符串,或者是一个数值,或者是一个布尔值,甚至是any包含了下面的任意对象。
list 列表 里面是类型,如果是string,那么就是字符串列表。
set 序列。object是自定义的对象。
Map
比如要配置dns的数据,dns域名里面可能定义了多个环境,每个环境它的域名可能都不太一样。
那么我们根据key去定义环境,value就是每个环境定义的域名。
上面图片注意,一个是声明变量,另外一个是定义变量,那么tf才能读取进来。
图片左边是声明变量,右边是定义变量。
List
list类型是一个列表,可以说是个数组,通过list可以定义具有相同意义的值。list里面调用值就是通过索引去调用。
output "my_env" {
value = var.env_list[0]
}
variable "env_list" {
type = list(string)
description = "env pro dev uat"
sensitive = false
default = ["dev","uat"]
}
将所有的值都打印出来
output "env_name" {
value = var.env_list
}
+ env_name = [
+ "dev",
+ "uat",
]
Object
object就是一个对象了,这个是自定义的对象。你可以自定义一些属性,它的类型和它的值。
那么创建ecs的时候就可以传递这个变量了,在调用的时候就和map是一样的。
image_id = var.ecs_info.esc_image
instance_name = var.ecs_info.ecs_name
vswitch_id = alicloud_vswitch.vsw.id
+ image_id = "centos_7_04_64_20G_alibase_201701015.vhd"
+ instance_charge_type = "PostPaid"
+ instance_name = "my_ecs"
上面就是变量的优先级了,可以在环境变量里面设置变量,还可以在tfvars里面设置变量。如果是使用json写的,那么可以创建tfvars.json。然后下面是可以覆盖的变量,最后可以在命令行里面传递变量。
在执行tf部署的时候,传递一个变量是region,可以通过-var,如果是传递很多变量,那么就写多个-var,变量类型有很多,比如list类型,注意使用单引号引用起来。
可能将变量写到文件里面,但是它的文件名称不叫terraform.tfvars,它可能叫dev.tfvars,也是我自己定义的文件。这个时候就需要通过-var-file参数进行指定。
最后就是环境变量,所有变量都是以TF_VAR开头,这个时候tf在读取环境变量的时候认为它是tf的变量,加载这里面的值。
Variable-locals
变量分为局部变量和全局变量,locals就是本地的变量,本地的变量非常方便我们做测试,比如一些默认值初始化的时候是非常好用的。
可以通过locals关键字语句块里面声明我们需要的变量。引用就通过local.变量名。