Terraform不仅支持单一资源的情况,还可以支持多种资源以及多种资源相互依赖的情况。同一个Terraform的配置文件中,可以包含多个资源,多种类型的资源,甚至是来自不同云供应商的资源。
我们可以以一个示例展示一下配置多资源以及如何在不同资源之间通过资源的属性进行引用的情况。
# Configure the Alicloud Provider
provider "alicloud" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "${var.region}"
}
# Create a web server
resource "alicloud_instance" "web" {
# cn-beijing
provider = "alicloud"
availability_zone = "cn-beijing-c"
image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
instance_type = "ecs.n4.large"
internet_charge_type = "PayByBandwidth"
#is_outdated = "true"
system_disk_category = "cloud_efficiency"
#io_optimized = "optimized"
security_groups = ["${alicloud_security_group.default.id}"]
instance_name = "web"
}
# Create security group
resource "alicloud_security_group" "default" {
name = "default"
provider = "alicloud"
description = "default"
}
va.tf
variable "access_key" { default = "xxxxxxx"}
variable "secret_key" { default = "xxxxxxx"}
variable "region" {
default = "cn-beijing"
}
alicloud_security_group.default.id这种引用表达式就是表示需要alicloud_security_group.default资源的ID属性。
如果运行Terraform apply,则Terraform会创建实例alicloud_instance(web)和安全组alicloud_security_group(default)
隐式依赖和显式依赖
通过引用表达式,Terraform可以自动推断出一个资源与另外的资源的依赖关系。在上面的例子中,${alicloud_security_group.default.id}这种就是创建了对实例名为web的实例的隐式依赖。Terraform使用这个依赖信息来确定创建资源的正确顺序。上述例子中,Terraform就知道alicloud_instance web必须在安全组default之前完成创建。通过这样的引用表达式是Terraform建立资源依赖关系的主要形式,应尽可能在需要的时候使用。
有时候,一些资源的依赖关系对于Terraform是不可见的。这时候,需要使用变量depends_on来创建显式依赖。
例如,若一个运行在Ali ECS实例的应用需要使用到一个特定的Ali OSS bucket,但是这个依赖是在这个应用内部的代码中配置的,对于Terraform不可见。这种情况下,需要使用变量depends_on来明确的声明这一依赖:
# New resource for the bucket our application will use.
resource "alicloud_oss_bucket" "web" {
# NOTE: bucket names must be unique across _all_ ali accounts, so
# this name must be changed before applying this example to avoid naming
# conflicts.
bucket = "terraform"
acl = "private"
}
# Change the alicloud_instance we declared earlier to now include "depends_on"
resource "alicloud_instance" "web" {
image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
instance_type = "ecs.n4.large"
# Tells Terraform that this EC2 instance must be created only after the
# S3 bucket has been created.
depends_on = ["alicloud_oss_bucket.web"]
}