Terraform 常用语法
Posted whale_life
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Terraform 常用语法相关的知识,希望对你有一定的参考价值。
Provider
Terraform 通过 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
定义一台 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
定义一条 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
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 = 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 = 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
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
output 子模块之间的引用
例如:如果一个名称 ecs_server
的子模块声明了一个名为 instance_ip_addr
的输出,则可以将该值作为 module.ecs_server.instance_ip_addr
module.<MODULE NAME>.<OUTPUT NAME>
以上是关于Terraform 常用语法的主要内容,如果未能解决你的问题,请参考以下文章
Terraform - 尝试使用服务主体在 Azure 中创建资源并从 keyvault 中提取该 SP 密钥
Terraform azurerm 提供程序尝试使用错误的凭据进行注册