Terraform принимает входные данные из командной строки, но уничтожает ресурсы, добавленные в прошлый раз - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь запустить скрипт terraform, который принимает параметр размера виртуальной машины, сведений о сети и изображения, чтобы ускорить новую виртуальную машину от пользователя. Если я запускаю сценарий второй раз, он уничтожает ресурсы, созданные в первый раз, что мне не нужно. Что может быть возможным решением сохранить ресурсы, которые он создал в первый раз?

Только проблеск того, через что я пробегаюсь:

resource "google_compute_network" "custom" {
  name = "test-ntwrk"
  auto_create_subnetworks = false,
}

resource "google_compute_subnetwork" "custom-subnet" {
  count = "${var.count}"
  name = "${var.name[count.index]}",
  ip_cidr_range = "${var.cidrs[count.index]}",
  region = "asia-south1",
  network = "${google_compute_network.custom.self_link}"
}

Это делает подсеть с заданным диапазоном, который, скажем, ["10.0.1.0/24", "10.0.2.0/24"].

Когда я повторно запускаю тот же сценарий, чтобы добавить еще 2 подсети с диапазоном CIDR ["10.0.3.0/24, 10.0.4.0/24] к уже созданному сценарию, план terraform показывает мне что-то вроде этого:

Google_compute_subnetwork.custom-subnet[0] (new resource required)
      id:                        "asia-south1/subnet-tf-0" => <computed> (forces new resource)
      creation_timestamp:        "2019-02-06T11:34:34.371-08:00" => <computed>
      gateway_address:           "10.0.1.1" => <computed>
      ip_cidr_range:             "10.0.1.0/24" => "10.3.0.0/24" (forces new resource)
      name:                      "subnet-tf-0" => "subnet-tf-0"
      network:                   "https://www.googleapis.com/compute/v1/projects/cio-demopoc-project-228209/global/networks/test-ntwrk" => "https://www.googleapis.com/compute/v1/projects/cio-demopoc-project-228209/global/networks/test-ntwrk"
      project:                   "xxxxxxxxxx" => <computed>
      region:                    "asia-south1" => "asia-south1"
      secondary_ip_range.#:      "0" => <computed>
      self_link:                 "https://www.googleapis.com/compute/v1/projects/cio-demopoc-project-228209/regions/asia-south1/subnetworks/subnet-tf-0" => <computed>

-/+ google_compute_subnetwork.custom-subnet[1] (new resource required)
      id:                        "asia-south1/subnet-tf-1" => <computed> (forces new resource)
      creation_timestamp:        "2019-02-06T22:31:39.600-08:00" => <computed>
      fingerprint:               "rt9soQpV_Nw=" => <computed>
      gateway_address:           "10.0.2.1" => <computed>
      ip_cidr_range:             "10.0.2.0/24" => "10.0.4.0/24" (forces new resource)
      name:                      "subnet-tf-1" => "subnet-tf-1"
      network:                   "https://www.googleapis.com/compute/v1/projects/cio-demopoc-project-228209/global/networks/test-ntwrk" => "https://www.googleapis.com/compute/v1/projects/cio-demopoc-project-228209/global/networks/test-ntwrk"
      project:                   "xxxxxxxxxx" => <computed>
      region:                    "asia-south1" => "asia-south1"
      secondary_ip_range.#:      "0" => <computed>
      self_link:                 "https://www.googleapis.com/compute/v1/project

Запуск этого сценария во второй раз заставляет создавать ресурсы и заменять существующий, который мне не нужен.

Ожидаемый результат: Все 4 подсети должны быть созданы в VPC.

1 Ответ

0 голосов
/ 23 января 2019

Мне нужно увидеть выходные данные плана Terraform, чтобы точно узнать , почему ресурсы воссоздаются.Указанные изменения будут помечены как "(новый ресурс)" .

Это может быть результатом вычисленных / сгенерированных значений / параметров, которые Terraform не может заранее увидеть, какими будут выходные данные.Например, рандомизированному значению, назначаемому переменной, или использованию переменной "disabled_on" в ресурсе.Последний может запускать Terraform для вычисления значений apply-time вместо plan-time , в этом случае он всегда помечает зависимый ресурс как необходимый для воссоздания.

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

Пожалуйста, запустите terraform plan и проверьте, какая переменная вызывает новый ресурс.Обойдя их один за другим и оценив, что происходит, вы сможете определить, является ли Terraform логичным для воссоздания ресурса.

Если вы хотите получить дополнительную помощь, пожалуйста, опубликуйте результаты здесь, желательно такжеКод Terraform.

ОБНОВЛЕНИЕ: Глядя на выходные данные вашего плана Terraform, кажется, что два новых блока CIDR назначаются вашим существующим ресурсам.Вы уверены, что добавили два блока CIDR к предыдущим, в результате чего получился массив, содержащий всего 4 блока CIDR?

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

...