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 变量不可用。这意味着,如果我 运行 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
似乎在 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
我正在使用 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 变量不可用。这意味着,如果我 运行 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
似乎在 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