GCE:从元数据设置环境变量

GCE: Setting Environment Variables from Metadata

我正在使用 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
    }
  }
}

我已经在我自己的项目中重现了你的问题,你是对的,export似乎在 strat-up 脚本上不起作用。

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

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