【问题标题】:How to output node's ip from each AZ in Terraform如何从 Terraform 中的每个 AZ 输出节点的 ip
【发布时间】:2018-03-09 13:37:05
【问题描述】:

我正在使用 terraform 定义在东京地区(两个 AZ)的 AWS 上启动 10 个节点。因此,每个 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 的种子列表中。

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 它会不会让 terraform 崩溃?我在输出中添加上述行后,Terraform 崩溃了。恐慌:reflect.Value.SetMapIndex:类型 []interface {} 的值不可分配给类型字符串
    • 很可能,尝试阅读日志,“您可以将 TF_LOG 设置为日志级别 TRACE、DEBUG、INFO、WARN 或 ERROR 之一以更改日志的详细程度。TRACE 是最详细的,并且如果 TF_LOG 设置为日志级别名称以外的名称,则它是默认值。” terraform.io/docs/internals/debugging.html
    • 你能发布一个完整 terraform 的链接吗?
    • Terraform 定义非常庞大,包含大量模块和带密码的私钥。因此将无法共享整个定义。如何在此处附加整个日志?
    • gist.github.com/Nahushp/70cd52a10348bceb2c03a0f39e80ede1 那么'test'资源名称是问题是'cassandra_ebs'在实际定义中的资源名称
    【解决方案2】:

    根据之前的评论想出了一个可行的解决方案

    output "cassandra_ip_zmap" {
      value = "${
        zipmap(
          "${aws_instance.test.*.availability_zone}", "${aws_instance.test.*.private_ip}"
        )
      }"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多