1. Terraform 目录
Terraform 语言的代码存储在文件扩展名为 .tf
的纯文本文件中。该语言还有一种基于 JSON 的变体,以 .tf.json
文件扩展名命名。
1.2 文件类型
*.tf
自定义的工程文件。理解为你期望的Terraform基础设施资源的状态。
terraform.tfvars
读取变量文件。是固定文件名,不可修改,否则会导致Terraform读取不到
.terraform
目录下存放了依赖的providers的缓存文件
.terraform.locl.hcl
依赖锁文件,锁定terraform配置依赖的适配的providers的版本。
terraform.lock.hcl是执行terraforminit命令时在当前工作目录下生成的文件。它记录了当时确定的提供者 (Provider等外部系统及其指定版本)和模块(写在.tf文件中的代码)之间的依赖关系和兼容性。
这样,terraformapply可以在运行时使用相同的决策。
锁文件本身并不是 Terraform 配置的一部分,因此它没有以 .tf
为后缀的文件名。然而,它确实使用了与 Terraform 相同的语言:HashiCorp 配置语言(HCL)。因此锁文件的后缀为 .hcl
。
terraform.tfstate
tfstate 文件,全名为 Terraform State 文件,是 Terraform 用来存储管理的基础设施的当前状态的文件。
Terraform使用状态文件来跟踪有关基础架构的资源和元数据信息。默认情况下,环境状态本地存储在Terraform工作区目录中名为terraform.tfstate的文件中,同时还有一个名为terraform.tfstate.backup的备份文件。在完成至少一个terraform apply之前,状态文件将不存在。
terraform.tfstate.backup
记录Terraform基础设施资源上一个状态(tfstate)。
每次应用Terrafrom时,它都会将基础架构的当前状态写入名为terraform.tfstate的文件。并且它会 将l旧状态文件移动到名为 terraform.tfstate.backup的文件,并创建一个新的 terraform.tfstate文件。
默认情况下,状态文件的备份会写入terraform.tfstate.backup以防状态文件丢失或损坏以简化恢复。 因此,当您运行 terraform apply 时,如果进行了更改,状态将被更新。以前的版本将保存为 terraform.tfstate.backup。
.terraform.tfstate.lock.info
部署过程中加锁文件。一旦部署完自动删除
多人使用Terraform配置项目执行操作时候时候会涉及执行环境和远端状态同步的问题。关于数据库的操作, 同一个数据的修改,或者删除的时候,需要加锁处理。因此,Terraform引l入了锁的机制避免多个执行环境操作同 一个backend导致状态不同步。这里的.terraform.tfstate.lock.info文件就是部署过程中的加锁状态文件。
2. 注释
#
开启单行注释,在行尾结束
//
也开始单行注释,作为 #
的替代方案。
/*
和 */
是可能跨越多行的注释的开始和结束分隔符。
3. 项目层级结构
https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=zh-cn#root-modules
3.1 五种层级说明
合理使用层级结构可以提升运维效率,使得文件更加可读、可看、可用及可维护。我们将代码结构进行分层,有如下好处:
- 有组织的安排代码编写的文件,使得逻辑更加清晰。
- 分层结构能使得简化运维难度,提升运维效率。
- 分层使得工程更加优雅。
单层
所谓单层级,就是将所有文件写在一个文件中。就一个main.tf文件。
# Configure the AliCloud Provider
provider "alicloud" {
access_key = "xxx"
secret_key = "xxx"
}
#创建vpc
resource "alicloud_vpc" "vpc" {
vpc_name = "vpc_1"
cidr_block = "10.0.0.0/16"
}
# 创建vswitch
# alicloud_vswitch是阿里云的资源字段,vsw_1字段是tf文件中的自定义唯一资源名称,vswitch_name字段是在阿里云上的自定义备注名
resource "alicloud_vswitch" "vsw_1" {
vswitch_name = "vsw_aliyun1"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.0.0/24"
zone_id = "cn-shanghai-b"
}
#新建安全组
resource "alicloud_security_group" "nsg1" {
security_group_name = "lyc_aliyun_nsg1"
vpc_id = alicloud_vpc.vpc.id
}
#将nsg_rule1、nsg_rule2加入安全组lyc_aliyun_nsg1中
resource "alicloud_security_group_rule" "nsg_rule1" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "1/65535"
priority = 1
security_group_id = alicloud_security_group.nsg1.id
cidr_ip = "0.0.0.0/0"
}
#创建ECS实例
resource "alicloud_instance" "instance" {
# cn-shanghai
#count = 2 # 创建2台ECS实例,默认不写count,则创建1台ECS实例
availability_zone = "cn-shanghai-b"
security_groups = ["${alicloud_security_group.nsg1.id}"]
instance_type = "ecs.e-c1m1.large" #若实例规格下线,请使用目前售卖中的实例规格
system_disk_category = "cloud_essd" #若磁盘规格下线,请使用目前售卖中的实例规格
system_disk_size = 40 # 系统盘大小,单位为GB
image_id = local.image_id
#instance_name = "lyc-test-${count.index+1}"
instance_name = "lyc-test"
vswitch_id = alicloud_vswitch.vsw_1.id
internet_max_bandwidth_out = 1 # 出网带宽,单位为Mbps
password = local.password
# data_disks {
# name = "data_disk1"
# description = "data_disk1" # 数据盘描述
# size = 20 # 数据盘大小,单位为GB
# category = "cloud_essd" # 数据盘类型
# }
}
# Configure the AliCloud Provider
provider "alicloud" {
access_key = "xxx"
secret_key = "xxx"
}
#创建vpc
resource "alicloud_vpc" "vpc" {
vpc_name = "vpc_1"
cidr_block = "10.0.0.0/16"
}
# 创建vswitch
# alicloud_vswitch是阿里云的资源字段,vsw_1字段是tf文件中的自定义唯一资源名称,vswitch_name字段是在阿里云上的自定义备注名
resource "alicloud_vswitch" "vsw_1" {
vswitch_name = "vsw_aliyun1"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.0.0/24"
zone_id = "cn-shanghai-b"
}
#新建安全组
resource "alicloud_security_group" "nsg1" {
security_group_name = "lyc_aliyun_nsg1"
vpc_id = alicloud_vpc.vpc.id
}
#将nsg_rule1、nsg_rule2加入安全组lyc_aliyun_nsg1中
resource "alicloud_security_group_rule" "nsg_rule1" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "1/65535"
priority = 1
security_group_id = alicloud_security_group.nsg1.id
cidr_ip = "0.0.0.0/0"
}
#创建ECS实例
resource "alicloud_instance" "instance" {
# cn-shanghai
#count = 2 # 创建2台ECS实例,默认不写count,则创建1台ECS实例
availability_zone = "cn-shanghai-b"
security_groups = ["${alicloud_security_group.nsg1.id}"]
instance_type = "ecs.e-c1m1.large" #若实例规格下线,请使用目前售卖中的实例规格
system_disk_category = "cloud_essd" #若磁盘规格下线,请使用目前售卖中的实例规格
system_disk_size = 40 # 系统盘大小,单位为GB
image_id = local.image_id
#instance_name = "lyc-test-${count.index+1}"
instance_name = "lyc-test"
vswitch_id = alicloud_vswitch.vsw_1.id
internet_max_bandwidth_out = 1 # 出网带宽,单位为Mbps
password = local.password
# data_disks {
# name = "data_disk1"
# description = "data_disk1" # 数据盘描述
# size = 20 # 数据盘大小,单位为GB
# category = "cloud_essd" # 数据盘类型
# }
}
最小化模块层级
root
|-- main.tf
|-- outputs.tf
|-- provider.tf
|-- terraform.tfvars
|-- variables.tf
-- version.tf
root
|-- main.tf
|-- outputs.tf
|-- provider.tf
|-- terraform.tfvars
|-- variables.tf
-- version.tf
标准三层级说明
所谓三层级,是将文件分为褪层、模块文件夹层、各模块层。三层结构对应如下图中的红、黄、绿三个矩形框
典型层级树
常用层级文件说明
version.tf,定义Terraform的版本以及provider版本
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = ">= 1.253.0"
}
}
}
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = ">= 1.253.0"
}
}
}
provider.tf 配置provider云厂商的文件
单独一个provider.tf文件。其中provider可自定义,修改成任意名称,Terraform会自动找到内部的provider{}块。建议使用provider.tf或者providers.tf(如果内部配置有多个云厂商,用复数s)比较清晰明了且直观。
#定义云厂商
provider "alicloud" {
region = var.region
access_key = var.ak #修改成自己的ak
secret_key = var.sk #修改成自己的sk
}
#定义云厂商
provider "alicloud" {
region = var.region
access_key = var.ak #修改成自己的ak
secret_key = var.sk #修改成自己的sk
}
配置多个provider
terraform {
#定义terraform 版本
requiredd_version >= "v0.15.4"
#定义provider
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = ">= 1.253.0"
}
aws = {
source = "hashicorp/aws"
version = ">= 6.3.0"
}
}
}
terraform {
#定义terraform 版本
requiredd_version >= "v0.15.4"
#定义provider
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = ">= 1.253.0"
}
aws = {
source = "hashicorp/aws"
version = ">= 6.3.0"
}
}
}
main.tf Terraform的主文件,通常包括引l用各子模块
module "vpc" {
source = "./modules/vpc"
}
module "security_group" {
source = "./modules/security_groups"
vpc_id = module.vpc.vpc_id
}
module "ecs" {
source = "./modules/ecs"
security_groups = module.security_groups.security_groups_id
vswitch_id= module.vpc.vswitch_id
}
module "vpc" {
source = "./modules/vpc"
}
module "security_group" {
source = "./modules/security_groups"
vpc_id = module.vpc.vpc_id
}
module "ecs" {
source = "./modules/ecs"
security_groups = module.security_groups.security_groups_id
vswitch_id= module.vpc.vswitch_id
}
3.2 其他方式
Environment Directory Structure:
Modules Directory Structure:
参考:
规范:
https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=zh-cn