如何使用Terraform将变量更改为值的文件从本地复制到远程?

时间:2019-04-04 20:17:32

标签: shell google-compute-engine terraform

我正在使用Terraform在Google Cloud Platform上创建debian-cloud/debian-9图像。我在本地上有一个目录,正在使用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环境变量的值类似于“ 某值 ”,则全部为${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 个答案:

答案 0 :(得分:2)

您可以使用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}"
    }
  } 

希望有帮助。