我用这个简单的问题回答了堆栈。
假设我需要创建几个实例资源,那么我如何从tf变量迭代以收集所有私有it并将其传递给ansible清单文件。
因为我发现我必须使用*,就像这里:
k8s_master_name = "${join("\n", azurerm_virtual_machine.k8s-master.*.name)}"但我认为对我来说,它会是这样的:
inst_ip = "${join("\n", ${aws_instance.*.private_ip})}"但是我得到了一个错误:
Error: Invalid reference
on crc.cloud.connect.tf line 72, in resource "local_file" "servers1":
72: inst_ip = "${join("\n", aws_instance.*.private_ip)}"
A reference to a resource type must be followed by at least one attribute
access, specifying the resource name.完整的tf文件:
resource "aws_instance" "sp-1" {
ami = "cmi-993E674A"
instance_type = "c5.large"
monitoring = true
source_dest_check = false
user_data = file("user_data.sh")
subnet_id = "subnet-F6C45280"
private_ip = "172.31.16.18"
vpc_security_group_ids = ["sg-230C7615"]
key_name = "mmk-key"
#network_interface {
# network_interface_id = "${aws_network_interface.ni-sp-1.id}"
# device_index = 0
#}
tags = {
desc = "sp-1"
group_name = "sp"
}
}
resource "aws_instance" "sp-2" {
ami = "cmi-993E674A"
instance_type = "c5.large"
monitoring = true
source_dest_check = false
user_data = file("user_data.sh")
subnet_id = "subnet-F6C45280"
private_ip = "172.31.16.19"
vpc_security_group_ids = ["sg-230C7615"]
key_name = "mmk-key"
tags = {
desc = "sp-2"
group_name = "sp"
}
}
resource "local_file" "servers1" {
content = templatefile("${path.module}/templates/servers1.tpl",
{
inst_ip = "${join("\n", ${aws_instance.*.private_ip})}"
}
)
filename = "../ansible/inventory/servers1"
}发布于 2021-01-01 03:43:38
根据Terraform documentation,您需要引用资源类型及其相关名称。
在配置文件中,您有一个名为sp-1的aws_instance资源。如果您希望访问资源的private_ip属性,则需要这样做:aws_instance.sp-1[*].private_ip。
发布于 2021-01-01 06:13:52
您正在创建单实例aws_instance.sp-1,而不是多个实例。要创建多个实例,您需要使用count或for_each,或者通过aws_autoscaling_group配置实例。
因此,要访问private_ip,您并不真正需要在本例中使用splat *和join (但如果您愿意,仍然可以使用它们),因为您只有一个实例,并且只有一个private_ip。以下内容应该足够了:
inst_ip = aws_instance.sp-1.private_iphttps://stackoverflow.com/questions/65522942
复制相似问题