Terraform с GCP: скопировать экземпляр vm в другой проект gcp - PullRequest
0 голосов
/ 23 июня 2019

Фон

У меня есть два облачных проекта Google: [project1] и [project2].[project1] имеет экземпляр виртуальной машины с именем my-vm.Я хочу скопировать my-vm в [project2].

Шаги, которые я сделал

Итак, я создал этот файл terraform (main.tf):

provider "google" {
  credentials = "${file("service-account.json")}"
  project     = "[project2]"
  region      = "us-central1"
}

сохраненоэто в новый каталог.Теперь выполните следующие команды:

$ terraform init
$ terraform import google_compute_instance.my-vm [project1]/us-central1-a/my-vm
Error: resource address "google_compute_instance.my-vm" does not exist in the configuration.

Before importing this resource, please create its configuration in the root module. For example:

resource "google_compute_instance" "my-vm" {
  # (resource arguments)
}

В этот момент я понял, что пропустил оператор resource "google_compute_instance" "my-vm".Итак, я добавил его в main.tf.Теперь это выглядит так:

provider "google" {
  credentials = "${file("service-account.json")}"
  project     = "[project2]"
  region      = "us-central1"
}
resource "google_compute_instance" "my-vm" {

}

Теперь я запустил ту же команду terraform import, и она прошла успешно.Файл terraform.tfstate создан.НО, файл main.tf не был изменен.Я ожидал увидеть в нем импортированные данные vm, но resource "google_compute_instance" "my-vm" был пуст .Странно ...

Теперь я запустил команду plan и получил это:

$terraform plan

Error: Insufficient network_interface blocks

  on  line 0:
  (source code not available)

At least 1 "network_interface" blocks are required.


Error: Insufficient boot_disk blocks

  on  line 0:
  (source code not available)

At least 1 "boot_disk" blocks are required.


Error: Missing required argument

  on main.tf line 7, in resource "google_compute_instance" "my-vm":
   7: resource "google_compute_instance" "my-vm" {

The argument "name" is required, but no definition was found.


Error: Missing required argument

  on main.tf line 7, in resource "google_compute_instance" "my-vm":
   7: resource "google_compute_instance" "my-vm" {

The argument "machine_type" is required, but no definition was found.

Вопросы:

  1. Почему после импорта ресурса яневозможно вызвать метод плана?
  2. Я видел несколько примеров копирования и развертывания с помощью terraform.Все эти примеры дублировали машину, основываясь на ее базовом изображении.Таким образом, если разработчик добавил некоторые изменения в экземпляр виртуальной машины, он не появится в дублированном ресурсе ([project2]).Возможно ли дублировать виртуальный диск вместо виртуального образа?

1 Ответ

1 голос
/ 24 июня 2019

В настоящее время Terraform не может сгенерировать для вас конфигурацию, import только сохраняет данные в файл состояния.

Текущая реализация импорта Terraform может импортировать только ресурсы в штат. Он не генерирует конфигурацию. Будущая версия Terraform также будет генерировать конфигурацию.

Из-за этого перед запуском импорта terraform необходимо вручную записать блок конфигурации ресурса для ресурса, которому будет сопоставлен импортированный объект.

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

Существуют сторонние инструменты, которые могут генерировать конфигурации Terrafrom для существующего ресурса:

Возможно ли дублировать виртуальный диск вместо виртуального образа?

Вы можете создать шаблон экземпляра из вашей виртуальной машины и использовать его для создания новых виртуальных машин:

...