terraform docs [3]

53 阅读1分钟

这是第三篇

terraform变量

上篇文章我们所有的代码都是写死的,如果想要修改,不能灵活的扩展。接下来我们加入变量,尝试着把vpc做成一个模块

  • 首先新建一个vars.tf的文件
variable "vpc_name" {
  type = string
  default = "sz_test_vpc"
}

variable "vpc_cidr" {
  type = string
  default = "172.16.0.0/20"
}

variable "vsw_cidr" {
  type = string
  default = "172.16.1.0/24"
}

variable "vsw_zone" {
  type = string
  default = "cn-shenzhen-f"
}

变量要想被main.tf文件识别,必须是vars.tf|variables.tf文件名。

  • 其中variable为代码块开头,后面跟变量名称,
  • type就很好理解了,分字符串string, list, bool, any等。比较特殊的是any{},跟其他编程语言的对象类似,
  • default表示变量默认值,当没有输入变量文件时,用的就是default的值
main.tf的修改
terraform {
  required_providers {
    alicloud = {
      source = "aliyun/alicloud"
      version = "1.201.2"
    }
  }
}

provider "alicloud" {
    profile = "akProfile"
}

resource "alicloud_vpc" "vpc1" {
  vpc_name   = var.vpc_name
  cidr_block = var.vpc_cidr
}

resource "alicloud_vswitch" "vsw1" {
  vpc_id     = alicloud_vpc.vpc1.id
  cidr_block = var.vsw_cidr
  zone_id    = var.vsw_zone
}
  • 这里更新了aliyun provider,版本为1.201.2,不知道啥原因alicloud_vswitch描述的时候有问题
  • 其他文件通过var.[实际变量名]引用vars文件里定义的变量
多个vpc怎么处理

上面的代码运行terraform plan && terraform apply -auto-approve就会创建一个阿里云的vpc以及vswtich

  • 但我们想创建多个vpc呢?
  • terraform官网给的建议是COPY一份当前的资源,比如
...

resource "alicloud_vpc" "vpc1" {
  vpc_name   = var.vpc_name
  cidr_block = var.vpc_cidr
}

resource "alicloud_vswitch" "vsw1" {
  vpc_id     = alicloud_vpc.vpc1.id
  cidr_block = var.vsw_cidr
  zone_id    = var.vsw_zone
}

resource "alicloud_vpc" "vpc2" {
  vpc_name   = var.vpc_name2
  cidr_block = var.vpc_cidr2
}

resource "alicloud_vswitch" "vsw2" {
  vpc_id     = alicloud_vpc.vpc2.id
  cidr_block = var.vsw_cidr2
  zone_id    = var.vsw_zone2
}

那我们的变量也需要定义两份,明显这样的做法会导致后期代码很难维护,我们可不可以把这部分定义成类似编程里的函数,然后给对外提供呢? 下期写了。^_^