预配器错误中使用的Terraform count.index函数

时间:2018-10-19 17:23:52

标签: terraform terraform-provider-aws

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

std::getline()

我的节点数有两个正在创建的ec2实例。一切都只在一个实例上运行,因此错误必须是使用count.index语法,或者它在某个地方丢失了,但是无法解决。

但是我得到此错误返回:

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

我已经问过Linux Academy导师,如果不深入研究,他们将看不到错误。我对terraform相当陌生,想与您联系,看看以前是否曾遇到过此问题...我在Google上搜索了很多选项,但看不到类似的东西。

2 个答案:

答案 0 :(得分:0)

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

此致

答案 1 :(得分:0)

在将预配器用于资源并引用自身时,您需要使用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
  }
}