Создайте случайную переменную в Terraform и передайте ее в скрипт запуска GCE - PullRequest
1 голос
/ 23 октября 2019

Я хочу запустить metadata_startup_script при использовании Terraform для создания экземпляра GCE.

Этот сценарий должен создать пользователя и назначить этому пользователю произвольный пароль.

Я знаю, что могу создать произвольную строку в Terraform с чем-то вроде:

resource "random_string" "pass" {
  length  = 20
}

И мой startup.sh в какой-то момент будет выглядеть так:

echo myuser:${PSSWD} | chpasswd

Как связать генерацию ресурса random_string с соответствующим вызовом сценария через параметр metadata_startup_script?

Вот определение ресурса google_compute_instance:

resource "google_compute_instance" "coreos-host" {
  name         = "my-vm"
  machine_type = "n1-stantard-2"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
      size = 20
      type = "pd-standard"
    }
  }

  network_interface {
    network = "default"

    access_config {
        network_tier = "STANDARD"
    }
  }

  metadata_startup_script = "${file("./startup.sh")}"

}

, где startup.shвключает в себя строку выше, устанавливающую пароль неинтерактивно.

1 Ответ

2 голосов
/ 23 октября 2019

Если вы хотите передать переменную Terraform в шаблонный файл, вам нужно использовать шаблон.

В Terraform <0,12 вы захотите использовать источник данных <a href="https://www.terraform.io/docs/providers/template/d/file.html" rel="nofollow noreferrer">template_file вот так:

resource "random_string" "pass" {
  length  = 20
}

data "template_file" "init" {
  template = "${file("./startup.sh")}"
  vars = {
    password = "${random_string.pass.result}"
  }
}

resource "google_compute_instance" "coreos-host" {
  name         = "my-vm"
  machine_type = "n1-stantard-2"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
      size = 20
      type = "pd-standard"
    }
  }

  network_interface {
    network = "default"

    access_config {
        network_tier = "STANDARD"
    }
  }

  metadata_startup_script = "${data.template_file.startup_script.rendered}"
}

и измените ваш скрипт startup.sh на:

echo myuser:${password} | chpasswd

Обратите внимание, что шаблон использует ${} для интерполяции переменных, которые Terraform передает вскрипт. Если вам нужно использовать $ где-нибудь еще в вашем скрипте, вам нужно будет его избежать, используя $$, чтобы получить литерал $ в вашем отрендеренном скрипте.

В Terraform 0.12+ естьновая templatefile функция , которую можно использовать вместо template_file источника данных, если вы предпочитаете:

resource "random_string" "pass" {
  length  = 20
}

resource "google_compute_instance" "coreos-host" {
  name         = "my-vm"
  machine_type = "n1-stantard-2"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
      size = 20
      type = "pd-standard"
    }
  }

  network_interface {
    network = "default"

    access_config {
        network_tier = "STANDARD"
    }
  }

  metadata_startup_script = templatefile("./startup.sh", {password = random_string.pass.result})
}

В дополнение вы также должны заметитьпредупреждение о random_string:

Этот ресурс использует криптографический генератор случайных чисел.

Исторически предполагаемое использование этого ресурса было неоднозначным, как в первоначальном примереэто в пароле. Для обратной совместимости он будет продолжать существовать. Для уникальных идентификаторов, пожалуйста, используйте random_id, для чувствительных случайных значений, пожалуйста, используйте random_password.

В качестве такового вы должны вместо этого использовать random_password ресурс :

resource "random_password" "password" {
  length = 16
  special = true
  override_special = "_%@"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...