- Я пытаюсь предоставить несколько экземпляров 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}"
}
Наблюдения:
- С одним инициатором удаленного выполнения он отлично работает, если count установлено на 1 или 2. При счетчике 3 непредсказуемо, что все инициаторы будут запускаться каждый раз на всех экземплярах. Однако одно можно сказать наверняка, что Terraform никогда не завершается и не показывает выходные переменные. Он продолжает показывать «null_resource.nullresource [count.index]: Все еще создается ...»
- Для local-exec provisioner - все работает нормально. Протестировано со значением счета 1, 2 и 7.
- Для инициатора файлов его работа для 1, 2 и 3 не завершается для 7, но файл был скопирован на всех 7 экземплярах. Он продолжает показывать «null_resource.nullresource [count.index]: Все еще создается ...»
- Кроме того, при каждой попытке поставщик удаленного выполнения может подключаться к экземплярам независимо от значения счетчика, и просто он не запускает встроенную команду и случайным образом выбирает пропустить ее и начинает показывать сообщение «Все еще создается ...».
- Я застрял в этой проблеме уже довольно давно. Не удалось найти ничего существенного в журналах отладки. Я знаю, что Terraform не рекомендуется использовать в качестве инструмента управления конфигурацией, однако все работает нормально даже со сложными сценариями подготовки, если количество экземпляров равно 1 (даже без null_resource), что указывает на то, что Terraform легко может обрабатывать такие базовые требования к обеспечению.
- Журналы TF_DEBUG:
- count = 2, TF завершается успешно и показывает Применить завершено!.
- count = 3, TF запускает удаленный exec на всех трех экземплярах, но не завершается и не показывает выходные переменные. Застрял на странице "Все еще создаю ..."
- count = 3, TF запускает удаленный exec только в двух экземплярах и пропускает нулевой ресурс [1 ], не завершается и не показывает выходные переменные. Застрял на странице "Все еще создаю ..."
- Будем признательны за любые указатели!