terraform - 如何在没有 UTF-8 编码的 Terraform 中将文本文件称为用户数据?
问题描述
地形版本:v1.0.4
我正在试验 EC2 实例的 user_data 属性。这是我目前尝试使用的 .txt 文件的内容,
#cloud-config
aws_image: true
以下是我测试过的场景
使用“本地人”。工作正常。
将文件转换为 UTF-8 编码,然后使用模板,工作正常。
使用没有 UTF-8 编码的 .txt 文件,这是有问题的场景,定义的 EC2 实例的用户数据部分变为空。我测试了几个排列,
3.1。
data "template_file" "user_data_test"{
template = filebase64("/Users/home/Desktop/centos_ec2_aws/test-user-data.txt")
}
resource "aws_instance" "my_aws_Linux_vm" {
.
.
user_data_base64 = data.template_file.user_data_test.template
}
3.2.
data "template_file" "user_data_test{
template = filebase64("/Users/home/Desktop/centos_ec2_aws/test-user-data.txt")
}
resource "aws_instance" "my_aws_Linux_vm" {
.
.
user_data = data.template_file.user_data_test.template
}
我正在寻找一种方法,即使我不使用带有 UTF-8 的 .txt 或 .sh 文件,我的部署也可以完成而没有任何错误。让我知道这是否可行。
解决方案
因为模板文件是用 Terraform 语言的模板语法编写的,所以模板本身必须始终采用 UTF-8 编码才能成为有效的语法,但原则上您可以编写一个包含表达式的模板,该表达式将生成 base64 数据,然后分配该结果到user_data_base64
. 话虽如此,我很难想象一个用例是什么,而你没有分享一个,所以我不能举一个真实的例子。
如果您的预期结果仍然是文本,但使用 UTF-8 以外的其他字符编码,那么另一种方法是让模板和模板结果都为 UTF-8,然后将生成的字符串转换为其他字符编码。
这是一个示例,我还用data "template_file"
现代templatefile
功能替换了您对已弃用的使用:
locals {
user_data = templatefile("${path.module}/test-user-data.txt", {})
}
resource "aws_instance" "my_aws_Linux_vm" {
# ...
user_data_base64 = textencodebase64(local.user_data, "UTF-16LE")
}
以上用于textencodebase64
从 UTF-8 转换为 UTF-16LE 编码。
或者,如果您的目标只是将文件逐字发送到 EC2,而不需要 Terraform 对其进行任何模板处理,您可以filebase64
直接在user_data_base64
参数中使用:
user_data = filebase64("${path.module}/test-user-data.txt")
推荐阅读
- javascript - 为什么 JavaScript 排序比较器参数的顺序相反?
- groovy - 我们如何使用 jira 中的 groovy 脚本创建 bitbucket 存储库?
- amp-html - amp-subscriptions 支持 NewsArticle 子类型
- r - 合并行并扩展 r 中的不同列
- bash - 最后执行系统 Bash Shell 初始化脚本
- regex - 正则表达式在 from、left join 和 inner join 子句中获取模式和表名称
- c# - 用 WIA 扫描。设置属性和抽屉 ADF
- prometheus - 了解 Grafana 指标变量
- openldap - Cisco ASA DAP 规则和 LDAP.memberOf 属性无法识别
- reactjs - 如何从本地存储中获取项目?