地形:计入资源名称

时间:2018-12-14 15:21:49

标签: google-cloud-platform terraform

我确定这是一个快速的方法。

我正在尝试通过count创建资源,并相应地命名资源。这里有两个问题。.一个我不确定是否可以解决,所以我猜我将不得不使用以下解决方法。

这是我的实例创建,一个用于磁盘,另一个用于计算实例:

resource "google_compute_disk" "us-am-build" {
  count = "${var.us_am_count}"
  name  = "am${count.index}-disk"
  type  = "pd-standard"
  size  = "200"
  zone  = "us-east1-b"
}
resource "google_compute_instance" "us-am-build" {
  count                     = "${var.us_am_count}"
  project                   = "${var.gcp_project}"
  name                      = "am${count.index}"
  machine_type              = "n1-standard-1"
  zone                      = "us-east1-b"
  allow_stopping_for_update = "true"

  tags = "${var.am_instance_tags}"

  service_account {
    email = "${var.service_account}"
    scopes = [ "cloud-platform" ]
  }

  boot_disk {
    initialize_params {
      image = "${var.compute_image}"
    }
  }
  attached_disk {
    source      = "${google_compute_disk.us-am-build.self_link}"
    device_name = "${google_compute_disk.us-am-build.name}-1"
  }
  network_interface {
    subnetwork         = "${var.us-east-1-subnet}"
    subnetwork_project = "${var.gcp_project}"
    access_config      = {}
  }
  metadata {
    certname        = "am0-us.forgerock.com"
    shutdown-script = "${file("${path.module}/scripts/node_termination_publish.sh")}"
    startup-script  = "${file("${path.module}/scripts/startup.sh")}"
  }
}

第一个问题是我想遍历4个数,其中2个在美国东部,而另外2个在欧盟西部。我想不出一种能够遍历并将它们放置在不同区域的方法。

另一个问题是上述演示,以及磁盘和计算实例之间的实例名称。

count = "${var.us_am_count}"

假设上述设置为2(对于美国)。

name  = "am${count.index}-disk"

第一个磁盘的名称是否为am0-disk?

我得到的错误:

   * module.am-deploy.google_compute_instance.us-am-build[1]: Resource 'google_compute_disk.us-am-build' not found for variable 'google_compute_disk.us-am-build.self_link'
* module.am-deploy.google_compute_instance.us-am-build[0]: Resource 'google_compute_disk.us-am-build' not found for variable 'google_compute_disk.us-am-build.self_link'

1 个答案:

答案 0 :(得分:1)

第一个问题,根据计数更改区域属性。我看到了几个选项(其中1个对我来说听起来最好):

1)使此代码块成为输入为countregion的模块。实例化2个模块,每个区域一个,并计数2个(硬编码或传入)。

2)创建一个具有区域数量的局部,然后使用mod运算符选择要对哪个区域进行mod区域数量。

locals {
  regions = ["us-east1-b", "eu-west-1b"]
}

zone = "${element{local.regions, count.index % length(local.regions)}"

3)用每个计数所需的区域作为本地人(这很简陋,您可能不想这样做):

locals {
  region_per_count = ["us-east1-b", "us-east-1b", "eu-west-1b", "eu-west-1b"]
}

然后从此列表中选择

zone = "${element(local.region_per_count, count.index")

引起第二个问题是因为您没有选择特定的google_compute_disk.us-am-build来获得self_link属性。做这样的事情:

source      = "${element(google_compute_disk.us-am-build.*.self_link, count.index)}"

.*.将该资源组放入列表上下文,然后使用element选择哪个资源。