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 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"

这就是我正在使用的,现在我想有条件地生成输出文件,包括ansible库存文件。只有当我将布尔真参数传递给我的“launch_zk”变量时,它才应该包括zookeeper的IP和DNS,否则它不应该打印任何内容。在这里,我无法在输出文件和ansible模板tpl文件中执行条件语句。有人能告诉我怎么才能让它工作吗

在这里,我将不得不像这样使用多个条件语句,但我得到下面给出的错误

// 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不确定。我会运行它,看看它是如何运行的。我会核实的。