Terraform с GCP: скопируйте экземпляр vm в другой проект gcp

Фон

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

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

Итак, я создал этот файл терраформа (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 команду agian, и она имела успех. Создан 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]). Можно ли дублировать виртуальный диск вместо виртуального образа?

person No1Lives4Ever    schedule 23.06.2019    source источник


Ответы (1)


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

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

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

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

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

  • GoogleCloudPlatform / terraformer

    Инструмент командной строки для создания файлов терраформирования из существующей инфраструктуры (обратный терраформ).

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

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

person beatcracker    schedule 24.06.2019
comment
Привет, спасибо, что ответили. Можете ли вы поделиться terraformer сценарием для достижения этих целей? - person No1Lives4Ever; 24.06.2019