Terraform 语法 variable变量 local本地变量的使用

变量分为两种类型,一种为输入变量,另外一种为输出变量。

之前在写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.变量名。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/127566005