【问题标题】:How to pass multiple template files to user_Data variable in terraform如何将多个模板文件传递给 terraform 中的 user_Data 变量
【发布时间】:2020-09-15 21:59:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    此类软件的常见选择是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 日志以查看它如何解释配置以及尝试执行这些操作时发生了什么。

    【讨论】:

    【解决方案2】:

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

    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 位于父文件夹中,包含所有子模块所需的所有内容,然后每个模块都添加了自己的特定要求。

    您还可以看到插值的变量之一也是一个模板文件:
    hostname = "${data.template_file.hostname.rendered}"
    这很好,有助于嵌套模板。以防万一你需要它......

    【讨论】:

    • 感谢 Helder 的回复。马丁回答解决了我的问题,但这是我从你的回答中学到的新技巧。所以谢谢你。你能帮我stackoverflow.com/questions/62101009/…
    • @pratik 我也学到了一些东西我以前从未见过cloudinit_config
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2021-04-14
    • 2021-01-20
    • 2018-11-22
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    相关资源
    最近更新 更多