多个实例的Terraform Provisioner错误

时间:2018-10-29 20:20:57

标签: amazon-web-services terraform terraform-provider-aws

使用Terraform运行以下文件时,出现以下错误:

  

找不到变量的资源“ aws_instance.nodes-opt-us-k8s”   “ aws_instance.nodes-opt.us1-k8s.id”。

因为我的'count'变量正在创建两个,我是否需要两次包含供应者?当我只为'count'变量添加一个变量时,我得到了我的Ansible剧本需要运行剧本文件的错误,这是因为在我找出此错误之前它是空的。

我处于Terraform和Linux的早期阶段,请原谅我的无知

#-----------------------------Kubernetes Master & Worker Node Server Creations----------------------------

#-----key pair for Workernodes-----

resource "aws_key_pair" "k8s-node_auth" {
  key_name   = "${var.key_name2}"
  public_key = "${file(var.public_key_path2)}"
}

#-----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 >> workers
[workers]
${self.public_ip}
EOF
EOD
  }
  provisioner "local-exec" {
    command = "aws ec2 wait instance-status-ok --instance-ids ${aws_instance.nodes-opt-us1-k8s.id} --profile Terraform && ansible-playbook -i workers Kubernetes-Nodes.yml"
  }
}

2 个答案:

答案 0 :(得分:0)

使用预配器并引用资源时,预配器已附加到您所需要的文件上,因此您需要使用self keyword

因此,在您的情况下,您想使用以下预配器块:

...

  provisioner "local-exec" {
    command = <<EOD
cat <<EOF >> workers
[workers]
${self.public_ip}
EOF
EOD
  }
  provisioner "local-exec" {
    command = "aws ec2 wait instance-status-ok --instance-ids ${self.id} --profile Terraform && ansible-playbook -i workers Kubernetes-Nodes.yml"
  }

答案 1 :(得分:0)

Terraform 0.12.26为我解决了类似的问题(将多个VM部署到Azure时使用多个文件配置程序)

希望这对您有帮助:https://github.com/hashicorp/terraform/issues/22006