Terraform是否可以在多云部署中并行执行?

时间:2019-07-05 13:17:40

标签: terraform terraform-provider-aws terraform-provider-azure terraform-provider-gcp

我想通过一个Terraform脚本在不同的云提供商中创建虚拟机使用Terraform的GCP,AWS,Azure。 因此,我想知道,Terraform会在所有公共云中并行创建VM实例吗?

1 个答案:

答案 0 :(得分:1)

Terraform构建有向的非循环图形(也称为DAG)以了解事物之间的依赖关系。如果某些内容不依赖于其他内容,它将并行执行它,直到-parallelism flag指定的数字为止,默认为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记录上工作。