1. 什么是resource?✅
资源是Terraform中最重要的部分,资源由资源块定义,而资源由provider提供。在Terraform中,一个具体的资源或者云产品/组件称为resource,比如一个ECS、SLB、RDS、VPC等。一个资源可以定义一个或多个基础设施资源对象。每个特定的resource包含了若干可用于描述对应资源或服务的属性字段,通过这些字段来定义一个完整的资源或者服务。
1.1 语法✅
- 资源来自
Provider
,是Terraform
中最重要的元素。每个资源块描述一个或多个基础对象,例如网络、计算实例或更高级别的组件,例如DNS
记录。 - 资源名称必须以字母或下划线开头,并且只能包含字母、数宇、下划线和破折号。
resource "resource_type" "name" {
// resource_config
}
resource "resource_type" "name" {
// resource_config
}
1.2 使用说明✅
各字段解释及使用说明:
其中第一个,**resource**
是资源的代码块的固定值,描述资源是什么。如,在Terraform模块中是有六大block:
provider
:配置块
resource
:资源
data
:数据源
variable
:变量
output
:输出
locals
:本地变量
第二个,alicloud_vswitch
是每个厂商定义好的资源名称,如:
alicloud_vpc
:vpc
alicloud_vswitch
:vswitch(交换机)
alicloud_security_group
:安全组
alicloud_security_group_rule
:安全组规则
alicloud_instance
:ECS实例
在HashiCorp官方文档中找对应每个云厂商的的资源名称:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/ecs_disk
第三个,vsw_terraform1
是文件中自定义的资源的唯一名称,不可重复。如果有多个,即用不同的值,如:
#创建第一个vsw_terraform1
#"字段"是tf文件中的资源名称,vswitch_name字段是在阿里云上的备注名
resource "alicloud_vswitch" "vsw_terraform1" {
vswitch_name = "vsw_aliyun1"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.0.0/24"
zone_id = "cn-shanghai-b"
}
#创建第二个vsw_terraform2
resource "alicloud_vswitch" "vsw_terraform2" {
vswitch_name = "vsw_aliyun2"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.1.0/24"
zone_id = "cn-shanghai-b"
}
#创建第N个vsw_terraform_jinitaimei666
resource "alicloud_vswitch" "vsw_terraform_jinitaimei666" {
vswitch_name = "vsw_aliyunN"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.6.0/24"
zone_id = "cn-shanghai-b"
}
#创建第一个vsw_terraform1
#"字段"是tf文件中的资源名称,vswitch_name字段是在阿里云上的备注名
resource "alicloud_vswitch" "vsw_terraform1" {
vswitch_name = "vsw_aliyun1"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.0.0/24"
zone_id = "cn-shanghai-b"
}
#创建第二个vsw_terraform2
resource "alicloud_vswitch" "vsw_terraform2" {
vswitch_name = "vsw_aliyun2"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.1.0/24"
zone_id = "cn-shanghai-b"
}
#创建第N个vsw_terraform_jinitaimei666
resource "alicloud_vswitch" "vsw_terraform_jinitaimei666" {
vswitch_name = "vsw_aliyunN"
vpc_id = alicloud_vpc.vpc.id
cidr_block = "10.0.6.0/24"
zone_id = "cn-shanghai-b"
}
- 资源是Terraform中最重要的部分,resource是Terraform中使用最多的块,所有资源由resource创建。
- 在Terraform中,一个具体的资源或者云产品/组件称为resource。
- 一个resource可以定义一个或多个基础设施资源对象。
- 每个resource有唯一确定的名称。
Resource-ECS
资源
https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/instance
定义一台 ECS
实例
- 可用区
- 安全组
- 实例规格
- 系统盘类型
- 名称描达
- 镜像
- 实例名称
- 交换机
- 带宽
- 付费类型
- 账户密码
## alicloud_ecs.tf
resource "alicloud_instance" "myecs" {
// 可用区
availability_zone = var.region
// 安全组,需要提前定义生成
security_groups = alicloud_security_group.group.*.id
// 实例规格
instance_type = "ecs.n1.tiny"
// 系统磁盘类型
system_disk_category = "cloud_efficiency"
// 系统磁盘名称
svstem_disk_name = "tf_svstem_disk_name"
// 系统盘描述
system_disk_description = "tf_system_disk_description"
// 系统镜像ID
image_id = "centos7_5_X64_206_allbase_20211130.vhd"
// 实例名称
instance_name = "mytestecs"
// 交换机,需要提前定义生成
switch_id = alicloud_vswitch.vsw.id
// 带宽
internet_max_bandwidth_out = 1
// 付费类型
internet_charge_type = "PayByTraffic"
// 账号密码
password = "root@123"
}
## alicloud_ecs.tf
resource "alicloud_instance" "myecs" {
// 可用区
availability_zone = var.region
// 安全组,需要提前定义生成
security_groups = alicloud_security_group.group.*.id
// 实例规格
instance_type = "ecs.n1.tiny"
// 系统磁盘类型
system_disk_category = "cloud_efficiency"
// 系统磁盘名称
svstem_disk_name = "tf_svstem_disk_name"
// 系统盘描述
system_disk_description = "tf_system_disk_description"
// 系统镜像ID
image_id = "centos7_5_X64_206_allbase_20211130.vhd"
// 实例名称
instance_name = "mytestecs"
// 交换机,需要提前定义生成
switch_id = alicloud_vswitch.vsw.id
// 带宽
internet_max_bandwidth_out = 1
// 付费类型
internet_charge_type = "PayByTraffic"
// 账号密码
password = "root@123"
}
Resource-DNS
资源
https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/alidns_record
定义一条 DNS
解析记录
- ZoneName: xxx.site
- Type: A
- Record: demo
- 完整域名:demo.xxx.com
## alicloud_dns.tf
## TYPE A
## demo.evescn.com
# 老版本 API
resource "alicloud_dns_record" "record" {
name = "xxx.com"
host_record = "demo"
type = "A"
value = alicloud_instance.mytestecs.public_ip
}
# 新版本 API
resource "alicloud_alidns_record" "record" {
domain_name = "xxx.com"
rr = "demo"
type = "A"
value = alicloud_instance.mytestecs.public_ip
remark = "demo-web"
status = "ENABLE"
}
## alicloud_dns.tf
## TYPE A
## demo.evescn.com
# 老版本 API
resource "alicloud_dns_record" "record" {
name = "xxx.com"
host_record = "demo"
type = "A"
value = alicloud_instance.mytestecs.public_ip
}
# 新版本 API
resource "alicloud_alidns_record" "record" {
domain_name = "xxx.com"
rr = "demo"
type = "A"
value = alicloud_instance.mytestecs.public_ip
remark = "demo-web"
status = "ENABLE"
}
DatSource
数据源
https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/images
datasource
提供资源的数据,可以通过参数过滤数据并供其他模块引用;使用 data
块声明
- 过滤阿里云上 centos_7 x86_64 镜像
data "alicloud_images" "images_ds" {
owners = "system"
name_regex = "^centos_7"
architecture = "x86_64"
}
// output 把值传递出去,给其他地方引用
output "first_image_id" {
value = "${data.alicloud_images.images_ds.images.0.id}"
}
data "alicloud_images" "images_ds" {
owners = "system"
name_regex = "^centos_7"
architecture = "x86_64"
}
// output 把值传递出去,给其他地方引用
output "first_image_id" {
value = "${data.alicloud_images.images_ds.images.0.id}"
}
DatSource
引用
ecs配置创建替换
image_id
resource "alicloud_instance" "myecs" {
availability_zone = var.region
security_groups = alicloud_security_group.group.*.id
instance_type = "ecs.n1.tiny"
system_disk_category = "cloud_efficiency"
svstem_disk_name = "tf_svstem_disk_name"
system_disk_description = "tf_system_disk_description"
// 私有 datasource output 变量,替换此处
image_id = data.alicloud_images.images_ds.images.0.id
instance_name = "mytestecs"
switch_id = alicloud_vswitch.vsw.id
internet_max_bandwidth_out = 1
internet_charge_type = "PayByTraffic"
password = "root@123"
}
resource "alicloud_instance" "myecs" {
availability_zone = var.region
security_groups = alicloud_security_group.group.*.id
instance_type = "ecs.n1.tiny"
system_disk_category = "cloud_efficiency"
svstem_disk_name = "tf_svstem_disk_name"
system_disk_description = "tf_system_disk_description"
// 私有 datasource output 变量,替换此处
image_id = data.alicloud_images.images_ds.images.0.id
instance_name = "mytestecs"
switch_id = alicloud_vswitch.vsw.id
internet_max_bandwidth_out = 1
internet_charge_type = "PayByTraffic"
password = "root@123"
}