我正在使用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"
}
}
答案 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}"
}
}
希望有帮助。