Amazon web services Terraform templatefile条件语句生成ansible库存文件 //地形v0.14.9 #变量tf 变量“launch_zk”{ 类型=字符串 description=“是否启动zookeeper” 默认值=false } #main.tf 资源“aws_实例”“zk_ec2”{ count=var.launch\u zk?var.zk\u实例\u计数:0 ... } #output.tf 输出“zk_ips”{ description=“ZK实例的IP” 值={ 对于aws_instance.zk_ec2中的vm: vm.tags.Name=>vm.private\u ip } } 资源“本地文件”“AnsibleInventoryFile”{ content=templatefile(“ansible_inventory.tpl”, { zk private ip=var.zk_instance_count
这就是我正在使用的,现在我想有条件地生成输出文件,包括ansible库存文件。只有当我将布尔真参数传递给我的“launch_zk”变量时,它才应该包括zookeeper的IP和DNS,否则它不应该打印任何内容。在这里,我无法在输出文件和ansible模板tpl文件中执行条件语句。有人能告诉我怎么才能让它工作吗 在这里,我将不得不像这样使用多个条件语句,但我得到下面给出的错误Amazon web services Terraform templatefile条件语句生成ansible库存文件 //地形v0.14.9 #变量tf 变量“launch_zk”{ 类型=字符串 description=“是否启动zookeeper” 默认值=false } #main.tf 资源“aws_实例”“zk_ec2”{ count=var.launch\u zk?var.zk\u实例\u计数:0 ... } #output.tf 输出“zk_ips”{ description=“ZK实例的IP” 值={ 对于aws_instance.zk_ec2中的vm: vm.tags.Name=>vm.private\u ip } } 资源“本地文件”“AnsibleInventoryFile”{ content=templatefile(“ansible_inventory.tpl”, { zk private ip=var.zk_instance_count,amazon-web-services,ansible,terraform,terraform-provider-aws,Amazon Web Services,Ansible,Terraform,Terraform Provider Aws,这就是我正在使用的,现在我想有条件地生成输出文件,包括ansible库存文件。只有当我将布尔真参数传递给我的“launch_zk”变量时,它才应该包括zookeeper的IP和DNS,否则它不应该打印任何内容。在这里,我无法在输出文件和ansible模板tpl文件中执行条件语句。有人能告诉我怎么才能让它工作吗 在这里,我将不得不像这样使用多个条件语句,但我得到下面给出的错误 // Terraform v0.14.9 # var.tf variable "launch_zk"
// Terraform v0.14.9
# var.tf
variable "launch_zk" {
type = string
description = "Whether to launch zookeeper or not"
default = false
}
# main.tf
resource "aws_instance" "zk_ec2" {
count = var.launch_zk ? var.zk_instance_count : 0
...
}
# output.tf
output "zk_ips" {
description = "IPs of ZK instances"
value = {
for vm in aws_instance.zk_ec2 :
vm.tags.Name => vm.private_ip
}
}
resource "local_file" "AnsibleInventoryFile" {
content = templatefile("ansible_inventory.tpl",
{
zk-private-ip = var.zk_instance_count < 10 ? slice(aws_instance.zk_ec2.*.private_ip, 0, 3) : slice(aws_instance.zk_ec2.*.private_ip, 0, 5),
zk-private-dns = var.zk_instance_count < 10 ? slice(aws_instance.zk_ec2.*.private_dns, 0, 3) : slice(aws_instance.zk_ec2.*.private_dns, 0, 5),
}
)
filename = "ansible_inventory"
}
# ansible_inventory.tpl
[zk_servers]
%{ for index, dns in zk-private-dns ~}
${zk-private-ip[index]} server_name=${dns}
%{ endfor ~}
资源“本地文件”“AnsibleInventoryFile”{
content=templatefile(“ansible_inventory.tpl”,
{
zk private ip=var.launch_zk?var.zk_instance_count<10?slice(aws_instance.zk_ec2.*.private_ip,0,3):slice(aws_instance.zk_ec2.*.private_ip,0,5):“”,
zk private dns=var.launch?var.zk_instance_count<10?slice(aws_instance.zk_ec2.*.private_dns,0,3):slice(aws_instance.zk_ec2.*.private_dns,0,5):“”,
}
)
filename=“ansible\u库存”
}
#错误
错误:条件结果类型不一致
在output.tf第67行的资源“local_file”“AnsibleInventoryFile”中:
67:zk private dns=var.launch_zk?aws_instance.zk_ec2.*.private_dns:“”,
|----------------
|aws_instance.zk_ec2是空元组
|var.launch_zk为“false”
true和false结果表达式必须具有一致的类型。给定的
表达式分别是元组和字符串。
如前所述,您的病情类型必须一致:
# ? list : string
zk-private-dns = var.launch_zk ? aws_instance.zk_ec2.*.private_dns : ""
这两个结果值可以是任何类型,但它们必须是同一类型,以便Terraform可以在不知道条件值的情况下确定整个条件表达式将返回的类型
在本例中,返回一个列表和字符串:
resource "local_file" "AnsibleInventoryFile" {
content = templatefile("ansible_inventory.tpl",
{
zk-private-ip = var.launch_zk ? var.zk_instance_count < 10 ? slice(aws_instance.zk_ec2.*.private_ip, 0, 3) : slice(aws_instance.zk_ec2.*.private_ip, 0, 5) : "",
zk-private-dns = var.launch ? var.zk_instance_count < 10 ? slice(aws_instance.zk_ec2.*.private_dns, 0, 3) : slice(aws_instance.zk_ec2.*.private_dns, 0, 5) : "",
}
)
filename = "ansible_inventory"
}
# Error
Error: Inconsistent conditional result types
on output.tf line 67, in resource "local_file" "AnsibleInventoryFile":
67: zk-private-dns = var.launch_zk ? aws_instance.zk_ec2.*.private_dns : "",
|----------------
| aws_instance.zk_ec2 is empty tuple
| var.launch_zk is "false"
The true and false result expressions must have consistent types. The given
expressions are tuple and string, respectively.
确保类型一致的最简单方法是使用空列表:
# ? list : string
zk-private-dns = var.launch_zk ? aws_instance.zk_ec2.*.private_dns : ""
此更改可能需要对代码进行进一步更改,以解释空列表“我无法执行条件语句”-这不是特定的。为什么你不能?你会犯什么错误?你们试了什么?@Marcin,我用错误更新了我的问题谢谢。这很简单。我应该正确地阅读错误消息。您认为ansible_inventory.tpl文件中是否需要进行任何更改,或者只在“[zk_servers]”下输出空白group@user3847894不确定。我会运行它,看看它是如何运行的。我会核实的。