Terraform 常用语法

Posted whale_life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Terraform 常用语法相关的知识,希望对你有一定的参考价值。

Provider

Terraform 通过 provider 管理基础设施,使用 provider 与云供应商 API进行交互;
每个 Provider 都包含相关的资源和数据源;
​Provider​

Terraform

声明 Provider

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

Terraform

配置 Provider

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

Terraform

配置多个 Provider

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

Resource

  • 资源来自 Provider,是 Terraform 中最重要的元素,每个 resource 块描述一个或多个基础对象,例如网络、计算实例、或提供的更高级的组件,比如 mysql 实例,DNS 解析记录等。
  • 资源名称必须以字母或下划线开头,并且只能包含字母、数字、 下划线和破折号、

TerraformResource 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 = alicloud_instance.myecs.public_ip

DataSource

DataSource 提供资源的数据,可以通过参数过滤数据并供其他模块引用
使用 ​​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 = 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​

Terraformvariable 可选参数

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"

Terraformlist

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


output "env_list"
value = var.env_list


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

Terraformobject

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


output "ecs_info"
value = var.ecs_info


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

Terraformvariable 的使用方式

在变量声明后,可以使用 ​​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

Output

output 可以打印已定义的变量,并且可以公开信息以供其他 Terraform 配置使用。输出值类似于编程语言中的返回值。
可选参数:

  • description 变量的描述信息
  • sensitive 限制变量在 UI中显示, true 不显示,false 显示,默认是 flase
  • depends_on 依赖关系
# output.tf
output "dev_dns_name"
value = alicloud_dns_record.record.host_record


# 运行
terraform plan

Terraformoutput 子模块之间的引用

例如:如果一个名称 ​​ecs_server​​ 的子模块声明了一个名为 ​​instance_ip_addr​​ 的输出,则可以将该值作为​​ module.ecs_server.instance_ip_addr​

​module.<MODULE NAME>.<OUTPUT NAME>​

以上是关于Terraform 常用语法的主要内容,如果未能解决你的问题,请参考以下文章

Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥

Terraform azurerm 提供程序尝试使用错误的凭据进行注册

TypeScript 这个语法“-?”是啥意思? (破折号问题)是啥意思?

Postgres 解决由破折号 (-) 引起的语法错误

检查变量是不是存在 - Terraform 模板语法

用 C# 中的常用破折号替换长破折号 [重复]