【问题标题】:GCE: Setting Environment Variables from MetadataGCE:从元数据设置环境变量
【发布时间】:2021-04-05 11:55:04
【问题描述】:

我正在使用 Packer 在 Google Compute Engine 上生成图像,并使用 Terraform 创建实例。我已经设置了这个元数据:

密钥:env_vars

值:export test=10

Packer 正在使用一个脚本,里面有这样的东西:

curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/env_vars?recursive=tru&alt=text" -H "Metadata-Flavor: Google" -o /tmp/env_vars.sh

source /tmp/env_vars.sh # or . /tmp/env_vars.sh

问题是,当我通过 Terraform 使用此图像创建实例时,env 变量不可用。这意味着,如果我运行 printenvecho $test,它是空的。

即使我为实例写了startup-script,它也不起作用。

但是,如果我通过 SSH 在实例中运行完全相同的脚本,它确实可以工作。

在上述所有场景中,都会创建文件env_vars.sh

我只想从我的元数据中为任何实例设置环境变量。

关于如何实现这一点的任何建议?

编辑:

这是地形代码:

# create instance
resource "google_compute_instance" "default" {
  count        = 1
  name         = var.machine_name
  machine_type = var.machine_type
  zone         = var.region_zone

  tags = ["allow-http-ssh-rule"]
 
  boot_disk {
    initialize_params {
      image = var.source_image
    }
  }
 
  network_interface {
    network = "default"
    access_config {
      // Ephemeral IP
    }
  }
}

【问题讨论】:

  • 能否分享您用于创建 VM 实例的 terraform 代码?以此为起点。 (如果您要在此处分享,请删除任何 PII 信息)
  • 当然!我刚刚更新了我的帖子。我在做什么来设置环境变量有意义吗?

标签: environment-variables terraform google-compute-engine metadata packer


【解决方案1】:

我已经在我自己的项目中重现了您的问题,您是对的,export似乎不适用于分层脚本。

我也试过creating a start-up script in a bucket,但它不起作用。
另一方面,我能够在我的项目中设置环境变量: 我使用的是 debian-9 映像,因此我编辑了 /etc/profile 以添加环境变量。 我使用以下代码创建带有 env 变量的 VM:

provider "google" {
  project = "<<PROJECT-ID>>"
  region  = "us-central1"
  zone    = "us-central1-c"
}

resource "google_compute_instance" "vm_instance" {
  name         = "terraform-instance"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    # A default network is created for all GCP projects
    network = "default"
    access_config {
    }
  }

  # defining metadata
 metadata = {
    foo = "bar"
  }

  metadata_startup_script = "echo  ENVVAR=DEVELOPMENT2 >> /etc/profile"

}

创建实例后,我能够看到正确的值:

$ echo $ENVVAR 
DEVELOPMENT2

【讨论】:

  • 您的代码完全符合我的要求。看起来如果我们希望环境变量持久存在,则需要在启动脚本期间将它们设置在 /etc/profile 中。我非常感谢您的帮助和时间。谢谢! :)
猜你喜欢
  • 2023-03-13
  • 2014-12-17
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2019-08-01
  • 2010-11-03
相关资源
最近更新 更多