如何在Terraform中将多个模板文件传递给user_Data变量

时间:2020-05-28 14:28:05

标签: terraform terraform-provider-azure terraform-template-file

将多个模板文件分配给user_Data变量。 由于某些架构模式,我们不想将此模板合并到单个文件中。

我是terraform的新手,所以在这方面苦苦挣扎。

data "template_file" "userdata_lin1" {
  template = <<EOF
#!/bin/bash
crontab cronjobfileremote
EOF
}

data "template_file" "userdata_lin2" {
  template = <<EOF
#!/bin/bash
echo "hello"
EOF
}

 user_data  = "${data.template_file.user_data1.rendered}"

2 个答案:

答案 0 :(得分:3)

这是大多数云平台的基本约束,“用户数据”或“自定义元数据”等(术语因供应商而异)是单个不透明字节串。这些字节的解释取决于您在虚拟机映像中安装了哪些软件才能使用它。

此类软件的常见选择是cloud-init。如果您使用的是cloud-init,则可以在a number of different formats中提供“用户数据”。

cloud-init提供多个不同部分的主要方式是通过a MIME-Multipart archive,它是多个值的组合,这些值中散布着标头,以使cloud-init可以识别边界并了解每个目标的意图要解释的部分。

由于cloud-init是用于解释“用户数据”的非常常见的软件选择,因此Terraform的a cloudinit provider其中包括a data source for constructing a MIME-Multipart archive

data "cloudinit_config" "example" {
  gzip          = false
  base64_encode = false

  part {
    content_type = "text/x-shellscript"
    filename = "userdata_lin1"
    content  = <<-EOF
      #!/bin/bash
      crontab cronjobfileremote
    EOT
  }

  part {
    content_type = "text/x-shellscript"
    filename = "userdata_lin2"
    content  = <<-EOF
      #!/bin/bash
      echo "hello"
    EOT
  }
}

然后您可以将user_data参数设置为此数据源的输出:

  user_data = data.cloudinit_config.example.rendered

请务必注意,从Terraform和您的云计算提供商的角度来看,user_data的内容只是一个任意字符串。处理字符串时遇到的任何问题都必须在目标操作系统本身中进行调试,方法是阅读cloud-init日志以查看其如何解释配置以及在尝试执行这些操作时发生了什么。

答案 1 :(得分:0)

我过去所做的是将两个模板文件合并为一个。
像这样:

data "template_file" "userdata" {
  template = "${format("%s%s", file("${path.module}/../common.sh"), file("${path.module}/fo.sh"))}"

  vars {
    efs_url     = "${var.efs_url}"
    hostname    = "${data.template_file.hostname.rendered}"
    api_key     = "${var.api_key}"
  }
}

如您所见,我正在合并两个模板文件:

  • ../common.sh
  • fo.sh

在我的情况下,这是一个项目的一部分,其中多个terraform模块common.sh位于父文件夹中,并且包含所有子模块所需的一切,然后每个模块都添加了自己的特定要求。

您还可以看到用于插值的变量之一也是template_file:
hostname = "${data.template_file.hostname.rendered}"
很好,可以帮助嵌套模板。万一您需要的话...