我想使用 Terraform 从单个 Terraform 脚本(例如 GCP、AWS、Azure)在不同的云提供商中创建一个 VM。所以,我想知道,Terraform 会在所有公共云中并行创建 VM 实例吗?
问问题
224 次
1 回答
1
Terraform 构建了一个有向的、非循环的图形(也称为 DAG)来理解事物之间的依赖关系。如果某些东西不依赖于其他东西,那么它将并行执行它,直到-parallelism
标志指定的数量,默认为 10。
如果事情在多个提供商之间完全分开(您只是在n 个云提供商中创建相同的堆栈),那么它将在这些堆栈之间轻松地并行。
但是,我建议不要像这样同时应用多个环境/云提供商,因为爆炸半径问题,并且通常错误地最小化一个操作中的多少变化。
如果你有跨提供者依赖,那么 Terraform 非常适合处理这个问题,但它仍然依赖于构建 DAG,以便它可以理解你的依赖。
例如,您可能想在 GCP 中创建一个实例并使用 DNS 来解析 IP 地址,但对所有 DNS 使用 AWS 的 Route53。为此,您可以使用以下内容:
resource "google_compute_instance" "test" {
name = "test"
machine_type = "n1-standard-1"
zone = "us-central1-a"
tags = ["foo", "bar"]
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
// Local SSD disk
scratch_disk {
}
network_interface {
network = "default"
access_config {
// Ephemeral IP
}
}
metadata = {
foo = "bar"
}
metadata_startup_script = "echo hi > /test.txt"
service_account {
scopes = ["userinfo-email", "compute-ro", "storage-ro"]
}
}
data "aws_route53_zone" "example" {
name = "example.com."
}
resource "aws_route53_record" "www" {
zone_id = "${data.aws_route53_zone.example.zone_id}"
name = "www.${data.aws_route53_zone.example.name}"
type = "A"
ttl = "300"
records = ["${google_compute_instance.test.network_interface.0.access_config.0.nat_ip}"]
}
这将构建一个图表,该图表同时aws_route53_record.www
依赖于data.aws_route53_zone.example
数据源和google_compute_instance.test
资源,因此 Terraform 知道这两个都需要完成,然后才能开始处理 Route53 记录。
于 2019-07-05T13:47:02.150 回答