首页 > 解决方案 > 如何将多个模板文件传递给 terraform 中的 user_Data 变量

问题描述

将多个模板文件分配给 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}"

标签: terraformterraform-provider-azureterraform-template-file

解决方案


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

此类软件的常见选择是cloud-init. 如果您正在使用cloud-init,则可以以多种不同格式提供“用户数据” 。

提供多个不同部分的主要方法cloud-init是通过MIME-Multipart 存档,它是多个值的串联,其中散布有标头,以允许 cloud-init 识别边界并了解您打算如何解释每个部分。

由于cloud-init是用于解释“用户数据”的软件非常常见的选择,因此 Terraform 有一个cloudinit提供程序,其中包括用于构建 MIME-Multipart 存档的数据源

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日志以查看它如何解释配置以及尝试采取这些操作时发生了什么。


推荐阅读