Назад | Перейти на главную страницу

Скрипт запуска на экземпляре google terraform

Я пытаюсь выполнить сценарий запуска на моем экземпляре, но ничего не добавляется, переменные env не находятся в системе, когда я вхожу в систему, есть идеи?

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
  }

}

В export команда в оболочке bash определяет новую переменную среды только для текущего сеанса оболочки. Переменные, определенные таким образом, теряются, как только этот сеанс оболочки завершается.

Чтобы сделать это более конкретным, можно было бы использовать эти переменные сразу после того, как вы объявите их в том же скрипте:

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, потому что они существуют только на время выполнения сценария запуска.

Если вы хотите, чтобы эти переменные были доступны при входе в систему, например через SSH вам необходимо добавить их в один из сценариев запуска, которые ваша оболочка читает при запуске нового сеанса.

Например, если вы используете оболочку bash, вы можете написать сценарий запуска, который добавляет больше элементов в .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, поэтому вам нужно будет отрегулировать его в правильном месте. Это сценарий, который генерирует другой сценарий, поэтому, к сожалению, у него есть некоторая неудобная экранировка, чтобы гарантировать, что полученный сценарий будет действительным, даже если значения переменных содержат неудобные символы, которые оболочка может счесть важными.

Обратите внимание, что созданный выше сценарий применим только к оболочкам и программам, запускаемым из оболочек. Если вы используете какое-либо программное обеспечение, используя systemd или какой-нибудь другой супервизор, тогда эти переменные не будут видны им; вам нужно будет сгенерировать конфигурацию для программы супервизора, чтобы также запускать программы с этими переменными.