如何从Terraform中的每个AZ输出节点的ip

时间:2017-09-27 23:01:56

标签: amazon-web-services amazon-ec2 amazon-cloudformation terraform

我正在使用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的种子列表中。

2 个答案:

答案 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