供应商错误中使用的 Terraform count.index 函数

Terraform count.index function used in provisioner error

我将以下代码与 terraform 一起使用:

#-----Workernodes-----

resource "aws_instance" "nodes-opt-us1-k8s" {
  instance_type = "${var.k8s-node_instance_type}"
  ami           = "${var.k8s-node_ami}"
  count         = "${var.NodeCount}"

  tags {
    Name = "nodes-opt-us1-k8s"
  }

  key_name               = "${aws_key_pair.k8s-node_auth.id}"
  vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
  subnet_id              = "${aws_subnet.opt-us1-k8s.id}"

#-----Link Terraform worker nodes to Ansible playbooks-----

  provisioner "local-exec" {
    command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}
EOF
EOD
  }
}

我的节点数有两个正在创建的 ec2 实例。一切都只适用于一个实例,因此错误必须与 count.index 语法有关,或者它在某处丢失,但无法解决。

但是我得到了返回的错误:

错误:aws_instance.nodes-opt-us1-k8s:连接信息不能包含引用自身的 splat 变量

我问过 Linux 学院导师,他们不深入研究就无法发现错误。我对 terraform 还很陌生,想联系这里看看以前是否遇到过这个问题……我用谷歌搜索了很多选项,但没有看到类似的东西。

我自己无法测试,你尝试过插值 ${self.private_ip} 吗?而不是 ${aws_instance.nodes-opt-us1-k8s.*.public_ip[count.index]}

此致,

在为资源使用配置器并引用自身时,您需要使用 self.ATTRIBUTE syntax

因此,您的资源和供应商应该如下所示:

resource "aws_instance" "nodes-opt-us1-k8s" {
  instance_type = "${var.k8s-node_instance_type}"
  ami           = "${var.k8s-node_ami}"
  count         = "${var.NodeCount}"

  tags {
    Name = "nodes-opt-us1-k8s"
  }

  key_name               = "${aws_key_pair.k8s-node_auth.id}"
  vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
  subnet_id              = "${aws_subnet.opt-us1-k8s.id}"

#-----Link Terraform worker nodes to Ansible playbooks-----

  provisioner "local-exec" {
    command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${self.public_ip}
EOF
EOD
  }
}

这也在 provisioner docs 中作为示例给出。

请注意,上面的配置程序块将在每个 运行 上覆盖您的 aws_worker_nodes_IP 文件,这意味着它只会向您显示要在 AWS 中创建的最后一个实例的输出(不保证订单)。

如果你想将 IP 附加到文件中,你可以使用 cat <<EOF >> aws_worker_nodes_IP 每次附加你的 heredoc 的整个主体,或者你可能想考虑使用一个单独的供应商来收集 IP 地址您使用 null_resource pattern:

创建的所有实例
resource "aws_instance" "nodes-opt-us1-k8s" {
  instance_type = "${var.k8s-node_instance_type}"
  ami           = "${var.k8s-node_ami}"
  count         = "${var.NodeCount}"

  tags {
    Name = "nodes-opt-us1-k8s"
  }

  key_name               = "${aws_key_pair.k8s-node_auth.id}"
  vpc_security_group_ids = ["${aws_security_group.opt-us1-k8s_sg.id}"]
  subnet_id              = "${aws_subnet.opt-us1-k8s.id}"
}

resource "null_resource" "cluster" {
  # If any instance IPs change we need to change the list of IPs
  triggers {
    cluster_instance_ips = "${join(",", aws_instance.nodes-opt-us1-k8s.*.public_ip)}"
  }

  provisioner "local-exec" {
    command = <<EOD
cat <<EOF > aws_worker_nodes_IP
[workers]
${aws_instance.nodes-opt-us1-k8s.*.public_ip}
EOF
EOD
  }
}