我正在尝试在我的实例上执行启动脚本但没有任何附加内容,当我登录实例时环境变量不在系统中,有什么想法吗?
resource "google_compute_instance_template" "vault_template" {
name_prefix = "vault-template-"
machine_type = "n1-standard-2"
region = "${var.google_region}"
scheduling {
automatic_restart = true
on_host_maintenance = "MIGRATE"
}
disk {
disk_type = "pd-standard"
source_image = "${var.google_image_name}"
disk_size_gb = 100
}
lifecycle {
create_before_destroy = true
}
network_interface {
network = "default"
access_config {
}
}
service_account {
email = "${var.google_email}"
scopes = ["storage-rw"]
}
metadata = {
startup_script = <<SCRIPT
export API_ADDR="http://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8200"
export CLUSTER_ADDR="https://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8201"
export VAULT_ADDR="http://127.0.0.1:8200"
SCRIPT
}
}
答案1
bash shell 中的命令export
仅为当前 shell 会话定义新的环境变量。通过这种方式定义的变量在该 shell 会话退出后就会丢失。
为了使其更加具体,在同一脚本中声明这些变量后就可以立即使用这些变量:
export API_ADDR="http://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8200"
export CLUSTER_ADDR="https://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8201"
export VAULT_ADDR="http://127.0.0.1:8200"
echo >/tmp/example.txt "Vault is at ${VAULT_ADDR}"
...但是这些变量对于系统上启动的任何其他程序或通过 SSH 登录创建的 shell 都是不可见的,因为它们只在启动脚本的持续期内存在。
如果您的目标是让这些变量在您通过 SSH 登录系统时可用,则需要将它们添加到您的 shell 在启动新会话时读取的启动脚本之一中。
例如,如果您使用 bash shell,那么您可以编写一个启动脚本,将更多项目附加到.bash_profile
用户主目录中的文件中:
API_ADDR="http://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8200"
CLUSTER_ADDR="https://$(curl -sf -H 'Metadata-Flavor:Google' http://metadata/computeMetadata/v1/instance/network-interfaces/0/ip | tr -d '\n'):8201"
VAULT_ADDR="http://127.0.0.1:8200"
cat >>/home/username/.bash_profile <<EOT
# Added by instance startup script
export API_ADDR=\'"$API_ADDR"\'
export CLUSTER_ADDR=\'"$CLUSTER_ADDR"\'
export VAULT_ADDR=\'"$VAULT_ADDR"\'
EOT
以上假设您的用户主目录是/home/username
,因此您需要将其调整为正确的位置。这是一个生成另一个脚本的脚本,因此不幸的是,它有一些尴尬的转义,以确保即使变量值包含 shell 可能认为很重要的尴尬字符,生成的脚本也是有效的。
请注意,上面生成的脚本仅适用于 shell 和从 shell 启动的程序。如果您正在使用systemd
或某些其他监控程序运行任何软件,则这些变量对这些程序将不可见;您需要为监控程序生成配置,以便使用这些变量启动程序。