Terraform зависает, когда instance_count больше 2 при использовании средства удаленного выполнения

  • Я пытаюсь предоставить несколько экземпляров Windows EC2 с помощью средства удаленного выполнения Terraform, используя null_resource.

$ terraform -v Terraform v0.12.6 provider.aws v2.23.0 provider.null v2.1.2

  • Изначально я работал с тремя инициаторами удаленного выполнения (два из них включали перезагрузку экземпляра) без null_resource и для одного экземпляра, все работало абсолютно нормально.
  • Затем мне нужно было увеличить счетчик, и, основываясь на нескольких ссылках, я использовал null_resource. Итак, я сократил проблему до такой степени, что я даже не могу запустить один инициатор удаленного выполнения для более чем двух экземпляров Windows EC2 с использованием null_resource.

Шаблон Terraform для воспроизведения сообщения об ошибке:

//VARIABLES

variable "aws_access_key" {
  default = "AK"
}
variable "aws_secret_key" {
  default = "SAK"
}
variable "instance_count" {
  default = "3"
}
variable "username" {
  default = "Administrator"
}
variable "admin_password" {
  default = "Password"
}
variable "instance_name" {
  default = "Testing"
}
variable "vpc_id" {
  default = "vpc-id"
}

//PROVIDERS
provider "aws" {
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
  region     = "ap-southeast-2"
}

//RESOURCES
resource "aws_instance" "ec2instance" {
  count         = "${var.instance_count}"
  ami           = "Windows AMI"
  instance_type = "t2.xlarge"
  key_name      = "ec2_key"
  subnet_id     = "subnet-id"
  vpc_security_group_ids = ["${aws_security_group.ec2instance-sg.id}"]
  tags = {
    Name = "${var.instance_name}-${count.index}"
  }
}

resource "null_resource" "nullresource" {
  count = "${var.instance_count}"
  connection {
    type     = "winrm"
    host     = "${element(aws_instance.ec2instance.*.private_ip, count.index)}"
    user     = "${var.username}"
    password = "${var.admin_password}"
    timeout  = "10m"
  }
   provisioner "remote-exec" {
     inline = [
       "powershell.exe Write-Host Instance_No=${count.index}"
     ]
   }
//   provisioner "local-exec" {
//     command = "powershell.exe Write-Host Instance_No=${count.index}"
//   }
//   provisioner "file" {
//       source      = "testscript"
//       destination = "D:/testscript"
//   }
}
resource "aws_security_group" "ec2instance-sg" {
  name        = "${var.instance_name}-sg"
  vpc_id      = "${var.vpc_id}"


//   RDP
  ingress {
    from_port   = 3389
    to_port     = 3389
    protocol    = "tcp"
    cidr_blocks = ["CIDR"]
    }

//   WinRM access from the machine running TF to the instance
  ingress {
    from_port   = 5985
    to_port     = 5985
    protocol    = "tcp"
    cidr_blocks = ["CIDR"]
    }

  tags = {
    Name        = "${var.instance_name}-sg"
  }

}
//OUTPUTS
output "private_ip" {
  value = "${aws_instance.ec2instance.*.private_ip}"
}

Наблюдения:


person st_rt_dl_8    schedule 06.08.2019    source источник
comment
Не упрощайте, пожалуйста, это не поможет понять, в чем вы ошибаетесь. Сократите свой пример до минимального воспроизводимого примера, который другие люди могут запустить, но все равно будут видеть ту же ошибку, что и вы.   -  person ydaetskcoR    schedule 06.08.2019
comment
Спасибо за ответ. Я изменил код, чтобы его можно было воспроизвести сейчас.   -  person st_rt_dl_8    schedule 07.08.2019
comment
@ydaetskcoR Добавлен шаблон, чтобы его было легче воспроизвести, чем предыдущий фрагмент.   -  person st_rt_dl_8    schedule 11.08.2019


Ответы (3)


Обновление: трюк в конечном итоге помог понизить Terraform до v11.14 в соответствии с этим комментарий к проблеме.

Вот несколько вещей, которые вы можете попробовать:

  1. Встроенный remote-exec:
resource "aws_instance" "ec2instance" {
  count         = "${var.instance_count}"
  # ...
  provisioner "remote-exec" {
    connection {
      # ...
    }
    inline = [
      # ...
    ]
  }
}

Теперь вы можете обратиться к self внутри блока connection, чтобы получить частный IP-адрес экземпляра.

  1. Добавить triggers в null_resource:
resource "null_resource" "nullresource" {
  triggers {
    host    = "${element(aws_instance.ec2instance.*.private_ip, count.index)}" # Rerun when IP changes
    version = "${timestamp()}" # ...or rerun every time
  }
  # ...
}

Вы можете использовать triggers атрибут, чтобы воссоздать null_resource и, таким образом, повторно -выполнить remote-exec.

person Aleksi    schedule 13.08.2019
comment
Спасибо за предложение, Алекси. Я уже пробовал №1 и в итоге использовал null_resource, когда столкнулся с той же проблемой с удаленным exec внутри блока aws_instance. Пробовал # 2, но все еще та же проблема. Terraform пропустил запуск инициатора на одном из экземпляров и застрял на этапе Все еще создает .... - person st_rt_dl_8; 13.08.2019
comment
Как насчет добавления sleep в начало и конец вашей inline команды? Согласно этому ответу. Некоторые люди также сообщают об аналогичной проблеме, устраняемой переходом на terraform v11.14 , это может быть не вариант в вашем случае? - person Aleksi; 13.08.2019
comment
Попробовал еще раз (поставить сон до и после команды). Не работал. Произошло то, что, как упоминалось в исходном сообщении, Terraform запустил инициатор на всех трех экземплярах, показал, что создание одного ресурса завершено, а затем застрял с сообщением Все еще создается ... для двух других экземпляров и никогда не отображал Применить полный! зеленое сообщение. Хотя эта проблема касается инициатора файлов, я все равно попробую понизить версию и скоро обновлю. - person st_rt_dl_8; 13.08.2019
comment
Я понизил версию до v11.14, и это волшебным образом сработало. Похоже на ошибку в v0.12.6. Большое спасибо за то, что уделили этому время! Это действительно отстой - тратить недели на решение проблемы, чтобы потом узнать что-то вроде этого :) Я постараюсь обратить на это внимание Hashicorp. Между тем, не могли бы вы написать то же самое в ответе, чтобы я согласился? - person st_rt_dl_8; 14.08.2019
comment
У меня ОЧЕНЬ похожая проблема с поставщиком chef: ссылка на переполнение стека Я полагаю, что начал все это в более поздней версии, чем 0.11.4, так что он всегда был там ... Я прошел все это время, чтобы обновить синтаксис до соответствия 0.12, но если это решит проблему с несколькими инициаторами, возможно, стоит все вернуть обратно. Я зарегистрировал свою проблему на их github. - person Max Cascone; 19.09.2019
comment
Да ... похоже, это сработало ... 3 параллельных chef положения с использованием null_resource прошли гладко и успешно после понижения версии и возврата синтаксиса к v.0.11.14. Не знаю, как я не нашел эту ветку раньше. Но, по крайней мере, сейчас это работает. - person Max Cascone; 19.09.2019

Я использовал этот триггер в null_resource, и у меня он отлично работает. Он также работает, когда количество экземпляров увеличивается, и он настраивает все экземпляры. Я использую terraform и openstack.

triggers = {instance_ids = join (",", openstack_compute_instance_v2.swarm-cluster-hosts [*]. id)}

person Niaz Hussain    schedule 12.02.2020

Terraform 0.12.26 решил аналогичную проблему для меня (при использовании нескольких средств подготовки файлов при развертывании нескольких виртуальных машин)

Надеюсь, это поможет вам: https://github.com/hashicorp/terraform/issues/22006

person DarrenS    schedule 25.06.2020