问题描述
在升级到 Terraform 0.12 版本后,遇到了很多类似的错误:
Error: Error in function call on main.tf line 136, in data "template_file" "inventory": 136: formatlist( 137: 138: 139: 140: |---------------- | module.mongodb.instance_names is tuple with 1 element | module.mongodb.private_ip is list of string with 1 elementCall to function "formatlist" failed: error on format iteration 0: unsupportedvalue for "%s" at 0: string required.
用户提供了相关的代码片段:
connection_strings_mongodb_standalone = join(
"\n",
formatlist(
"%s ansible_host=%s ansible_user=ubuntu",
module.mongodb.instance_names,
module.mongodb.private_ip,
),
以及模块代码:
module "mongodb" {
source = "../modules/mongodb"
instance_count = "1"
environment = var.env
instance_type = "i3.large"
subnet_id = element(tolist(data.aws_subnet_ids.private.ids), 0)
associate_public_ip_address = false
vpc_id = data.aws_vpc.vpc.id
tags = merge(
{
"Environment" = var.env
},
var.default_tags,
)
iam_instance_profile = var.iam_instance_profile
route53_zone_id = data.aws_route53_zone.zone.zone_id
ami = var.ami
}
output "mongodb_private_ip" {
value = module.mongodb.private_ip
}
output "tags" {
value = module.mongodb.instance_names
}
用户认为需要设置输出值的类型,但是找不到如何设置的方法,希望有人能帮助他解决这个问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据错误信息和代码片段,问题出在 module.mongodb.instance_names
和 module.mongodb.private_ip
这两个输出值的类型不匹配上。在 Terraform 0.12 中,对于列表类型的输出值,不再需要使用额外的列表包装。因此,需要将输出值的定义修改为:
output "instance_names" {
value = data.template_file.instance_tags_name.*.rendered
}
这样就可以得到一个平铺的字符串列表,符合 formatlist
函数的要求。
方案2
Terraform 0.12 提供了一个自动配置升级工具,可以在某些情况下自动进行更改。建议使用该工具作为升级过程的起点。它可以为您进行大部分简单的重写工作,并会对一些复杂情况无法处理的情况发出警告。
具体操作步骤如下:
1. 使用自动配置升级工具进行升级。
2. 检查升级后的代码,确保输出值的定义已经修改为:
output "instance_names" {
value = data.template_file.instance_tags_name.*.rendered
}
- 运行 Terraform 命令,验证是否解决了问题。
方案3
如果自动配置升级工具无法解决问题,或者您希望手动进行更改,可以按照以下步骤进行操作:
1. 修改输出值的定义,将其修改为:
output "instance_names" {
value = data.template_file.instance_tags_name.*.rendered
}
- 运行 Terraform 命令,验证是否解决了问题。
请注意,升级到 Terraform 0.12 可能会导致其他代码更改和配置调整。建议在升级之前仔细阅读官方的升级指南,并在升级过程中进行适当的测试和验证。
以上是解决这个问题的几种方案,根据您的具体情况选择适合您的方法进行操作。
正文完