Resource声明
Resource 是 Terraform 语言中最重要的组成部分,通过关键字 resource 进行声明。每个resource代码块描述了一个或多个云资源,如ctyun_ecs 表示ECS,ctyun_vpc表示VPC等。terraform会根据多个resource定义的业务逻辑进行隐性或手动显性的关联,例如:在创建ctyun_ecs之前一定需要先将ctyun_vpc创建完成,resource关联属性将在本页后面介绍。
# 创建vpc
resource "ctyun_vpc" "vpc_example" {
...
}
# 创建subnet
resource "ctyun_subnet" "subnet_example" {
...
}
# 创建ecs
resource "ctyun_ecs" "ecs_example" {
subnet_id = ctyun_subnet.subnet_example.id
vpc_id = ctyun_vpc.vpc_example.id
...
}上述resource块声明三个云资源,分别为:
ctyun_vpc
ctyun_subnet
ctyun_ecs
resource 声明块初次执行会触发创建(create)云资源动作,后续再执行会触发更新(update)或者替换(replace)操作。
访问Resource属性
ctyun_ecs 资源引用了ctyun_vpc 和 ctyun_subnet 资源,引用语法为:<资源类型>.<资源名称>.<字段名称>,具体可以表示为:ctyun_vpc.vpc_example 和 ctyun_vpc.vpc_example.id。每个 resource 声明模块中需要填充的字段信息可参考 这里,除 provider 定义的参数外,Terraform 本身还定义了一些适用于所有资源类型的元参数,具体可参考 Meta-arguments。
Resource依赖关系
隐式排序
配置中的大多数资源没有任何特定的关系,并且 Terraform 可以并行对几个不相关的资源进行更改。但是,某些资源必须在其他特定资源之后进行处理;有时这是因为资源的工作方式,有时资源的配置只需要另一个资源生成的信息。大多数资源依赖关系都是自动处理的。Terraform 会分析代码块中的每个 resource,以查找对其他对象的引用,并在创建、更新或销毁资源时将这些引用视为隐式排序要求。由于大多数对其他资源具有行为依赖关系的资源也会引用这些资源的数据,因此通常无需手动指定资源之间的依赖关系。创建ctyun_ecs就是典型的隐式排序,Terraform 根据引用关系优先创建ctyun_vpc和ctyun_subnet资源,最后再创建ctyun_ecs。
显式排序
但是某些依赖项无法在配置中隐式识别,在这类较为罕见的情况下:可以使用 depends_on 元参数显式声明,指定依赖关系。示例如下:
# 创建postgresql数据库账户
resource "ctyun_postgresql_account" "account_test" {
...
}
# datasource查询postgresql账户列表
data "ctyun_postgresql_accounts" "accounts" {
depends_on = [ctyun_postgresql_account.account_test]
...
}上述示例中,利用 depends_on 声明ctyun_postgresql_accounts资源依赖ctyun_postgresql_account的执行完成。实际效果是再postgresql实例创建好数据库账户后,才会执行查询postgresql账户列表的datasource。