Terraform count.index функция, используемая в ошибке инициатора - PullRequest
0 голосов
/ 19 октября 2018

Я использую приведенный ниже код с 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 Academy, и они не могут увидеть ошибку без более глубокого изучения.Я довольно новичок в работе с terraform и хотел бы обратиться сюда, чтобы увидеть, была ли эта проблема замечена раньше ... Я нашел много вариантов, но ничего подобного не вижу.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вам нужно использовать синтаксис self.ATTRIBUTE при использовании провайдеров для ресурса и ссылки на себя.

Таким образом, вместо этого ваш ресурс и провайдер должны выглядеть следующим образом:

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
  }
}

Это также приведено в качестве примеров в документах инициатора .

Обратите внимание, что приведенный выше блок инициатора будет перезаписывать ваш файл aws_worker_nodes_IP при каждом запуске, что будет означать, что он будет отображаться тольковы выводите последний экземпляр, который будет создан в AWS (без гарантии по заказу).

Если вы хотите добавить IP-адреса к файлу, вы можете использовать cat <<EOF >> aws_worker_nodes_IP для добавления всего тела вашего heredoc каждыйвремя или вы можете подумать об использовании отдельного провайдера, который может собирать IP-адреса всех создаваемых вами экземпляров, используя null_resource шаблон :

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
  }
}
0 голосов
/ 19 октября 2018

Я не могу проверить это сам, вы пробовали интерполировать ${self.private_ip}?вместо $ {aws_instance.nodes-opt-us1-k8s. *. public_ip [count.index]}

С уважением,

...