Terraform работает параллельно в мультиоблачных развертываниях? - PullRequest
0 голосов
/ 05 июля 2019

Я хочу создать виртуальные машины в другом облачном провайдере из одного скрипта Terraform, например GCP, AWS, Azure с использованием Terraform. Итак, я хотел знать, будет ли Terraform делать экземпляры виртуальных машин параллельно во всех общедоступных облаках?

1 Ответ

1 голос
/ 05 июля 2019

Terraform создает направленную, ациклическую графику (также называемую DAG), чтобы понять зависимости между вещами.Если что-то не зависит от чего-то другого, то оно выполнит это параллельно до числа, указанного в -parallelism флаг , который по умолчанию равен 10.

Если вещи совершенно разныенесколько провайдеров (вы просто создаете один и тот же стек в n облачных провайдерах), тогда он будет удобно параллелен между этими стеками.

Однако я бы рекомендовал не применять несколько сред / облаковпровайдерам в то же время это нравится из-за проблем с радиусом взрыва и, в общем, из-за ошибки, сводящей к минимуму количество изменений в одной операции.

Если у вас есть взаимозависимости между провайдерами, то Terraform отлично справляется с этим, но все же полагается на построениеэтот DAG, чтобы он мог понять ваши зависимости.

Например, вы можете создать экземпляр в GCP и использовать DNS для разрешения IP-адреса, но используйте AWS Route53 для всех ваших DNS.Для этого вы можете использовать что-то вроде этого:

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.

...