谷歌实例 Terraform 上的启动脚本

谷歌实例 Terraform 上的启动脚本

我正在尝试在我的实例上执行启动脚本但没有任何附加内容,当我登录实例时环境变量不在系统中,有什么想法吗?

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或某些其他监控程序运行任何软件,则这些变量对这些程序将不可见;您需要为监控程序生成配置,以便使用这些变量启动程序。

相关内容