Skip to content

1. 什么是resource?✅

​ 资源是Terraform中最重要的部分,资源由资源块定义,而资源由provider提供。在Terraform中,一个具体的资源或者云产品/组件称为resource,比如一个ECS、SLB、RDS、VPC等。一个资源可以定义一个或多个基础设施资源对象。每个特定的resource包含了若干可用于描述对应资源或服务的属性字段,通过这些字段来定义一个完整的资源或者服务。

1.1 语法✅

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

1.2 使用说明✅

各字段解释及使用说明:

image.png

其中第一个,**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

image.png

第三个,vsw_terraform1是文件中自定义的资源的唯一名称,不可重复。如果有多个,即用不同的值,如:

yaml
#创建第一个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 实例

  • 可用区
  • 安全组
  • 实例规格
  • 系统盘类型
  • 名称描达
  • 镜像
  • 实例名称
  • 交换机
  • 带宽
  • 付费类型
  • 账户密码
json
## 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
json
## 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 镜像
json
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

json
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"
}