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