【问题标题】:Terraform with GCP: copy vm instance to different gcp project使用 GCP 的 Terraform:将 vm 实例复制到不同的 gcp 项目
【发布时间】:2019-11-05 11:52:12
【问题描述】:

背景

我有两个谷歌云项目:[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 命令 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. 为什么导入资源后无法调用plan方法?
  2. 我看到了一些使用 terraform 复制和部署的示例。所有这些示例都是基于机器的基本图像复制机器。因此,如果开发人员对虚拟机实例添加了一些更改,它就不会出现在重复的资源 ([project2]) 中。这是否可以复制 vm-disk 而不是 vm-image?

【问题讨论】:

    标签: terraform terraform-provider-gcp


    【解决方案1】:

    Terraform 目前无法为您生成配置,import 仅将数据保存到状态文件。

    目前Terraform导入的实现只能将资源导入状态。它不会生成配置。未来版本的 Terraform 也会生成配置。

    因此,在运行 terraform import 之前,需要手动为资源编写一个资源配置块,导入的对象将映射到该资源配置块。

    虽然这看起来很乏味,但它仍然为 Terraform 用户提供了导入现有资源的途径。未来版本的 Terraform 将完全生成配置,从而显着简化此过程。

    有第三方工具可以为现有资源生成 Terrafrom 配置:

    这是否可以复制 vm-disk 而不是 vm-image?

    您可以从您的虚拟机创建instance template 并使用它来创建新的虚拟机:

    【讨论】:

    • 您好,感谢您的回答。你能分享一个terraformer 脚​​本来实现这些目标吗?
    猜你喜欢
    • 2022-01-18
    • 2021-09-26
    • 2020-03-17
    • 1970-01-01
    • 2020-10-26
    • 2020-08-23
    • 2021-06-13
    • 2021-04-22
    • 2019-08-12
    相关资源
    最近更新 更多