pra*_*tik 4 terraform terraform-template-file terraform-provider-azure
将多个模板文件分配给 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}"
Run Code Online (Sandbox Code Playgroud)
大多数云平台的基本约束是“用户数据”或“自定义元数据”等(术语因供应商而异)是单个不透明的字节串。这些字节的解释取决于您在虚拟机映像中安装的使用它的软件。
此类软件的常见选择是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
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将user_data
参数设置为此数据源的输出:
user_data = data.cloudinit_config.example.rendered
Run Code Online (Sandbox Code Playgroud)
需要注意的是,从 Terraform 和您的云计算提供商的角度来看, 的内容user_data
只是一个任意字符串。处理字符串中的任何问题都必须在目标操作系统本身内调试,通过读取cloud-init
日志来查看它如何解释配置以及尝试采取这些操作时发生了什么。
我过去所做的是将两个模板文件合并为一个。
像这样:
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}"
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我组合了两个模板文件:
../common.sh
fo.sh
就我而言,这是一个具有多个 terraform 模块的项目的一部分,common.sh
位于父文件夹中,并包含所有子模块所需的所有内容,然后每个模块添加了自己的特定要求。
您还可以看到插值的变量之一也是 template_file:
hostname = "${data.template_file.hostname.rendered}"
这非常好并且有助于嵌套模板。以防万一你需要的话...
归档时间: |
|
查看次数: |
3040 次 |
最近记录: |