我正在使用terraform定义在东京地区的AWS上启动10个节点(两个AZ)。因此,每个AZ都会启动5个节点。
resource "aws_instance" "test" {
count = "${var.dse_cass_node_count}"
ami = "${var.dse_cass_ami}"
instance_type = "${var.dse_cass_instance_type}"
key_name = "${var.dse_cass_key_name}"
subnet_id = "${element(split(",", var.dse_cass_vpc_subnets), count.index)}"
availability_zone = "${element(split(",", var.dse_cass_azs), count.index)}"
vpc_security_group_ids = ["${var.dse_sg_id}"]
tags {
Name = "${var.namespace}-${var.env_name}-${var.dse_cluster_name}-node-${count.index}"
Environment = "${var.env_name}"
DSE_Cluster_Name = "${var.dse_cluster_name}"
}
}
我想在输出中使用基于AZ的节点IP。现在我可以使用下面提到的定义列出输出中所有节点的ip,但不能基于AZ。
output "cassandra_ips" {
value = ["${aws_instance.test.*.private_ip}"]
}
output "cassandra_ips1" {
value = ["${aws_instance.test.0.private_ip}"]
}
output "cassandra_ips2" {
value = ["${aws_instance.test.1.private_ip}"]
}
我想基于AZ来隔离它们。是否可以使用Terraform?我想从每个AZ获得一个节点的ip。 有一些建议会很棒。提前谢谢。
Terraform v0.10.5
P.S - 我希望每个AZ的一个节点的ip添加到Cassandra的种子列表中。
答案 0 :(得分:1)
根据以前的评论找出工作解决方案
output "cassandra_ip_zmap" {
value = "${
zipmap(
"${aws_instance.test.*.availability_zone}", "${aws_instance.test.*.private_ip}"
)
}"
}
答案 1 :(得分:0)
Terraform允许输出地图。语法会是这样的,我没有试过这个。
value(必需) - 输出的值。这可以是一个字符串, 列表或地图。这通常包括输出后的插值 这些都是静态的,通常不会有用。
output "cassandra_ip_map" {
value = {
"${aws_instance.test.*.availability_zone}" = "${aws_instance.test.*.private_ip}"
}
}
https://www.terraform.io/docs/configuration/outputs.html
https://www.terraform.io/docs/providers/aws/d/instance.html#availability_zone