Как скопировать файл с переменной, измененной на значение, с локального на удаленный, используя Terraform? - PullRequest
0 голосов
/ 04 апреля 2019

Я использую Terraform для создания debian-cloud/debian-9 изображения на Google Cloud Platform .У меня есть каталог на локальном компьютере, который я копирую в созданный экземпляр, используя gcloud compute scp --recurse [LOCAL_DIR] [INSTANCE-NAME]:[REMOTE_LOCATION].
В локальном каталоге есть несколько .conf файлов, которые выглядят примерно так:

<source>
  @type tail

  format syslog

  path /var/log/syslog
  pos_file /var/lib/google-fluentd/pos/syslog.pos
  read_from_head true

  #Here's the variable I wanna replace
  tag ${instance-name}-syslog
</source>

Я создал эти .conf файлы и добавил переменную $ {instance-name}.Теперь я хотел бы, чтобы эта переменная была заменена значением переменной среды Terraform / linux.

например: если переменная среды Terraform / linux имеет значение типа " some-value ", то ${instance-name} из всех файлов .conf должнозаменить на это и выглядеть примерно так:

<source>
  @type tail

  format syslog

  path /var/log/syslog
  pos_file /var/lib/google-fluentd/pos/syslog.pos
  read_from_head true

  #Here's the variable I wanna replace
  tag some-value-syslog
</source>

Я ищу заменить значение только на удаленном (экземпляр GCE), куда я скопировал каталог, а не в файлы на моем локальном компьютере.
Изменение файлов для замены переменной на сервере также является приемлемым вариантом в моем случае, но я не совсем уверен, является ли это хорошим способом сделать это.Если это так, я не уверен, какой скрипт будет читать файлы один за другим и заменять переменные.

РЕДАКТИРОВАТЬ: Добавление скрипта Terraform для создания экземпляра Debian и копирования каталога с локального на сервер

resource "google_compute_instance" "default" {
  name         = "${var.instance_name}"
  project      = "${var.project}"
  machine_type = "${var.machine-type}"
  zone         = "${var.instance-zone}"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral IP
    }
  }


  #If replace the variables using shell script, this script will be used
  metadata_startup_script = "replace_var.sh"

  #One way
  provisioner "local-exec" {
    command = "gcloud compute scp --recurse [LOCAL-DIR] ${var.instance_name}:/etc/google-fluentd"
  }

  #Another way
  provisioner "file" {
    source      = "[LOCAL-DIR]"
    destination = "/etc/google-fluentd"
  }
}

1 Ответ

2 голосов
/ 05 апреля 2019

Вы можете использовать template_dir ресурс terraform для рендеринга шаблонов в локальный каталог, а затем загрузить их с помощью поставщика файлов:

resource "template_dir" "config" {
  source_dir      = "${path.module}/path/to/fluent/templates/"
  destination_dir = "/tmp/fluent-templates"

  vars = {
    instance-name = "${var.instance_name}"
  }
}

resource "google_compute_instance" "default" {
  name         = "${var.instance_name}"
  project      = "${var.project}"
  machine_type = "${var.machine-type}"
  zone         = "${var.instance-zone}"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral IP
    }
  }

  provisioner "file" {
    source      = "${template_dir.config.destination_dir}"
    destination = "/etc/google-fluentd"
  }
}

Вы также можете добавить шаг для очистки временногосгенерированные файлы:

  resource "null_resource" "cleanup" {
    depends_on = ["google_compute_instance.default"]

    provisioner "local-exec" {
      command = "rm -rf ${template_dir.config.destination_dir}"
    }
  } 

Надеюсь, это поможет.

...