【问题标题】:How do I add a private IP output for an instance in GCP using Terraform?如何使用 Terraform 为 GCP 中的实例添加私有 IP 输出?
【发布时间】:2021-06-21 09:49:34
【问题描述】:

我在 outputs.tf 的 TF 代码中定义了这个输出:

output "ip" {
  value = google_compute_address.vm_private_ip.address
}

这是我在main.tf中创建实例的代码:

// Launch an MS SQL Server into GCP
// Configure the Google Cloud provider
provider "google" {
  credentials = file("mycreds.json")
  project     = var.project
  region      = var.region
}

// Terraform plugin for creating random ids
resource "random_id" "instance_id" {
 byte_length = 8
}

// A single Compute Engine instance
resource "google_compute_instance" "default" {
  name         = var.instance_name
  machine_type = var.machine_type
  zone         = var.zone
  tags         = [var.instance_name, var.env_name]
  boot_disk {
    initialize_params {
    size =  var.boot_disk_size
    image = data.google_compute_image.sqlserverimage.self_link
    }

    }

  network_interface {
  subnetwork = var.subnetwork
  subnetwork_project = var.subnetwork_project
 }
}

data "google_compute_image" "sqlserverimage" {
  family  = var.image_family
  project = var.project
}

// Create additional disks
resource "google_compute_disk" "datadisk" {
  name  = var.data_disk_name
  type  = var.data_disk_type
  size  = var.data_disk_size
  zone  = var.zone
  image = data.google_compute_image.sqlserverimage.self_link
  labels = {
    environment = "dev"
    asv = "mycompanytools"
    ownercontact = "myuser"
  }
  physical_block_size_bytes = 4096
}

resource "google_compute_disk" "backupdisk" {
  name  = var.backup_disk_name
  type  = var.backup_disk_type
  size  = var.backup_disk_size
  zone  = var.zone
  image = data.google_compute_image.sqlserverimage.self_link
  labels = {
    environment = "dev"
    asv = "mycompanytools"
    ownercontact = "myuser"
  }
  physical_block_size_bytes = 4096
}

resource "google_compute_disk" "logdisk" {
  name  = var.log_disk_name
  type  = var.log_disk_type
  size  = var.log_disk_size
  zone  = var.zone
  image = data.google_compute_image.sqlserverimage.self_link
  labels = {
    environment = "dev"
    asv = "mycompanytools"
    ownercontact = "myuser"
  }
  physical_block_size_bytes = 4096
}

// Attach additional disks
resource "google_compute_attached_disk" "datadiskattach" {
  disk = google_compute_disk.datadisk.id
  instance = google_compute_instance.default.id
}

resource "google_compute_attached_disk" "backupdiskattach" {
  disk = google_compute_disk.backupdisk.id
  instance = google_compute_instance.default.id
}

resource "google_compute_attached_disk" "logdiskattach" {
  disk = google_compute_disk.logdisk.id
  instance = google_compute_instance.default.id
}

但是当我运行 terraform plan 时,我得到了这个错误:

terraform plan

Error: Reference to undeclared resource

  on outputs.tf line 2, in output "ip":
   2:   value = google_compute_address.vm_private_ip.address

A managed resource "google_compute_address" "vm_private_ip" has not been
declared in the root module.

在创建实例之前不会知道私有 IP。如何获得显示私有 IP 的输出?我不想为实例分配 IP,我只想知道它创建后的 IP。

【问题讨论】:

  • 您能否编辑问题中的代码,使其形成minimal reproducible example?现在看起来您还没有将您的 google_compute_address 资源寻址为 vm_private_ip,但从当前代码中无法准确判断您哪里出错了。
  • 好的,我现在就添加。
  • 好的,我刚刚用我的原始代码更新了 OP。谢谢!
  • 您的代码不包含解释错误的google_compute_address 资源。您想添加一个但还没有添加吗?还是只想要google_compute_instance 资源的IP 地址?
  • 我只想知道实例创建后的IP地址。我不想给它一个。

标签: terraform terraform-provider-gcp


【解决方案1】:

下面的输出块会给你想要的输出值

output "ip" {
  value = google_compute_instance.default.network_interface.0.network_ip
}

【讨论】:

    【解决方案2】:

    要获取通过google_compute_instance 资源创建的Google Compute 实例的默认动态分配IP 地址,您可以访问network_interface.0.network_ip 属性,如the resource documentation 中所述:

    • network_interface.0.network_ip - 实例的内部 IP 地址,手动或动态分配。

    所以你的输出应该是:

    output "ip" {
      value = google_compute_instance.default.network_interface.0.network_ip
    }
    

    【讨论】:

    • 我尝试将其添加到我的输出中:output "ip" { value = network_interface.0.network_ip } 但我得到了这个错误:terraform plan Error: Invalid reference on outputs.tf line 2, in output "ip": 2: value = network_interface.0.network_ip A reference to a resource type must be followed by at least one attribute access, specifying the resource name. 我做错了什么?
    • @bluethundr 您完全错过了提供资源及其标识符名称
    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 2020-09-05
    • 2023-01-24
    • 2020-05-03
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多