如何解决GCE:从元数据设置环境变量
我使用 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 创建使用此图像的实例时,环境变量不可用。这意味着,如果我运行 printenv
或 echo $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
似乎不适用于 str-up 脚本。
我也试过 creating a start-up script in a bucket 但它不起作用。
另一方面,我能够在我的项目中设置 env var:
我使用的是 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。