Terraform 常用语法

寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述Terraform 常用语法相关的知识,希望能为你提供帮助。
ProviderTerraform 通过 provider 管理基础设施,使用 provider 与云供应商 API进行交互;
每个 Provider 都包含相关的资源和数据源;
??Provider??

声明 Provider
每个 Terraform 模块必须声明它需要哪些 Provider,以便 Terraform 可以安装和使用他们。
提供者要求在一个 ??required_providers??块中声明。

配置 Provider
关键字 ??provider?? ,一般是主体部分的配置参数。

配置多个 Provider
可以为同一个 Provider 定义多个配置,并选择基于每个资源或每个模块使用那一个,这样做的主要原因是支持一个云平台的多个区域。
引用方式:alicloud.beijing


Resource

  • 资源来自 Provider,是 Terraform 中最重要的元素,每个 resource 块描述一个或多个基础对象,例如网络、计算实例、或提供的更高级的组件,比如 mysql 实例,DNS 解析记录等。
  • 资源名称必须以字母或下划线开头,并且只能包含字母、数字、 下划线和破折号、
Resource alicloud-ECS
??alicloud_docs??
定义一台 ECS 实例:包括如下选项
~# cat alicloud_instance.tf
resource "alicloud_instance" "myecs"
# 可用区
availability_zone = "cn-beijing-b"
# 安全组
security_groups= alicloud_security_group.group.*.id
# 实例规格
instance_type= "ecs.t5-lc2m1.nano"
# 系统盘类型、名称、描述
system_disk_category= "cloud_efficiency"
system_disk_name= "test_foo_system_disk_name"
system_disk_description= "test_foo_system_disk_description"
# 使用镜像
image_id= "centos_7_5_x64_20G_alibase_20211130.vhd"
# 实例名称
instance_name= "test_foo"
# Vswitch ID
vswitch_id= alicloud_vswitch.vsw.id
# 带宽
internet_max_bandwidth_out = 1
# 付款方式
instance_charge_type = "PaybyTraffic"
# 账号密码
password = "Test1234567"

  • 可用区
  • 安全组
  • 实例规格
  • 系统盘类型、名称、描述
  • 镜像
  • 实例名称
  • 带宽
  • 交换机
  • 付费类型
  • 账号密码
Resource DNS
??alicloud_dns_record_docs??
定义一条 DNS 解析记录
~# cat alicloud_dns.tf
resource "alicloud_dns_record" "record"
name= "whale.com"
host_record = "test"
type= "A"
value= https://www.songbingjia.com/android/alicloud_instance.myecs.public_ip

DataSourceDataSource 提供资源的数据,可以通过参数过滤数据并供其他模块引用
使用 ??data??块声明
使用 ??output?? 块进行展示引用


data "alicloud_images" "images_centos"
owners= "system"
name_regex= "^centos_7_9"
architecture = "x86_64"
status= "Available"
os_type= "linux"
output_file= "./outputs.json"

output "first_image_id"
value = https://www.songbingjia.com/android/data.alicloud_images.images_centos.images

# resource 引用
image_id = data.alicloud_images.images_centos.images[0].id

Variable变量允许自定义 Terraform 模块,而无需更改模块自己的代码。这可以实现跨不同的 Terraform 配置共享模块,使模块可组合和可重用。
  • 在??variables.tf?? 中定义变量;
  • 在同一个模块的所有变量中必须是唯一的;
  • 可以从环境变量或者文本文件中读取;
  • Terraform 默认读取??terraform.tfvars??
variable 可选参数
variable "region"
type = string
description = "region name"
default = "cn-beijing"
sensitive = true

  • ??default?? 变量的默认值
  • ??type?? 变量的类型
  • ??describtion?? 变量的描述信息
  • ??validation?? 定义变量的验证规则
  • ??sensitive?? 限制变量在 UI 中显示
  • ??nullable?? 变量是否可为空
variable 参数类型
  • any
  • string
  • number
  • bool
  • list
  • set
  • map
  • object
  • tuple
map DNS
# variables.tf
variable "dns_record"
type = map(string)
description = "custom dns record"

# terraform.tfvars
dns_record =
"dev" = "dev.whale.com",
"stag" = "stag.whale.com",
"prod" = "prod.whale.com"

list
# variables.tf
variable "env_list"
type = list(string)
description = "env list"


output "env_list"
value = https://www.songbingjia.com/android/var.env_list


# terraform.tfvars
env_list = [ "dev", "stag", "prod" ]

object
# variables.tf
variable "ecs_info"
type = object(ecs_image = string, ecs_name = string)


output "ecs_info"
value = https://www.songbingjia.com/android/var.ecs_info


# terraform.tfvars
ecs_info =
ecs_image = "centos_7_5_64_20G_alibase_20G_20211130.vhd",
ecs_name = "mydemoecs"

variable 的使用方式
在变量声明后,可以使用 ??var.VAR_NAME?? 的方式引用;VAR_NAME即 variables.tf 中的定义
  • 环境变量
  • ??terrform.tfvars?? |??terrform.tfvars.json??
  • ??*.auto.tfvars?? |??*.auto.tfvars.json??
  • 命令行 -var | -var-file
# -var
terraform plan -var="region=cn-hangzhou"
terraform plan -var=env_list=["dev", "stag"] -var="region=cn-hangzhou"

# -var-file
terraform plan -var-file="dev.tfvars"

##ENV
export TF_VAR_region=cn-beijing
export TF_VAR_env_list=env_list=["dev", "stag"]

locals-局部变量局部、本地变量;局部值有助于避免在配置中多次重复相同的值或表达式;
# 定义局部变量
locals
ecs_name = "mydemoecs"
owner = "whale"


# 引用局部变量
local.ecs_name
local.owner

Outputoutput 可以打印已定义的变量,并且可以公开信息以供其他 Terraform 配置使用。输出值类似于编程语言中的返回值。
可选参数:
  • description 变量的描述信息
  • sensitive 限制变量在 UI中显示, true 不显示,false 显示,默认是 flase
  • depends_on 依赖关系
# output.tf
output "dev_dns_name"
value = https://www.songbingjia.com/android/alicloud_dns_record.record.host_record


# 运行
terraform plan

output 子模块之间的引用
例如:如果一个名称 ??ecs_server?? 的子模块声明了一个名为 ??instance_ip_addr??的输出,则可以将该值作为?? module.ecs_server.instance_ip_addr??
【Terraform 常用语法】??module.< MODULE NAME> .< OUTPUT NAME> ??

    推荐阅读