当前位置: 首页 > 知识库问答 >
问题:

使用远程执行配置器时,当instance_count大于2时,地形会卡住

阎建中
2023-03-14
  • 我正在尝试使用Terraform的远程执行预配器使用null_resource预配多个Windows EC2实例。

Terraform v0.12.6provider.awsv2.23.0provider.nullv2.1.2

  • 最初,我使用的是三个远程exec Provisioner(其中两个涉及重新启动实例),没有null\u资源,对于单个实例,一切都非常好

用于重现错误消息的地形模板:

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

观察:

  • 对于一个远程执行预配器,如果计数设置为1或2,它可以正常工作。对于计数3,不可预测的是所有预配器每次都会在所有实例上运行。然而,有一件事是肯定的,Terraform永远不会完成,也不会显示输出变量。它一直显示“null_resource.nullresource[count.index]:仍在创建...”
  • 对于本地执行配置器-一切正常。用count的值1、2和7进行测试。
  • 对于文件供应器,它对1、2和3的工作正常,但是对7的工作没有完成,但是文件在所有7个实例上都被复制了。它一直显示“null_resource.nullresource[count.index]:仍在创建...”
  • 此外,在每次尝试中,远程执行预配器都能够连接到实例,而不管count的值如何,只是它不会触发内联命令并随机选择跳过它并开始显示“仍在创建...”消息。
  • 我已经被这个问题困扰了很长一段时间。在调试html" target="_blank">日志中也找不到任何重要的东西。我知道不建议将Terraform用作配置管理工具,但是,如果实例数只有1(即使没有null_resource),即使使用复杂的配置脚本,一切都很好,这表明Terraform应该可以轻松处理这样一个基本的配置需求。
  • TF_DEBUG日志:
  • count=2,TF成功完成并显示应用完成!。
  • count=3,TF在所有三个实例上运行远程执行,但是没有完成并且没有显示输出变量。被困在“仍在创建...”
  • count=3,TF仅在两个实例上运行远程exec并跳过nullResources[1],不完成并且不显示输出变量。被困在“仍在创建...”
  • 任何指点将不胜感激!

共有3个答案

太叔何平
2023-03-14

Terraform 0.12.26为我解决了类似的问题(在部署多个VM时使用多个文件提供程序)

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

公良照
2023-03-14

我在null\u资源中使用了这个触发器,它非常适合我。当实例数量增加时,它也可以工作,并对所有实例进行配置。我正在使用terraform和openstack。

触发器={instance_ids=加入(",",openstack_compute_instance_v2.swarm-集群主机[*]. id)}

元胡媚
2023-03-14

更新:根据本期评论,最终的伎俩是将地形降级到11.14版本。

您可以尝试以下几件事:

  1. 内联远程执行:
resource "aws_instance" "ec2instance" {
  count         = "${var.instance_count}"
  # ...
  provisioner "remote-exec" {
    connection {
      # ...
    }
    inline = [
      # ...
    ]
  }
}

现在,您可以在连接块中引用self来获取实例的私有IP。

resource "null_resource" "nullresource" {
  triggers {
    host    = "${element(aws_instance.ec2instance.*.private_ip, count.index)}" # Rerun when IP changes
    version = "${timestamp()}" # ...or rerun every time
  }
  # ...
}

您可以使用触发器属性重新创建null\u资源,从而重新执行远程执行。

 类似资料:
  • 我为Hive JDBC编写了这个小程序。起初,它执行得很好,但当我现在试图运行时,突然出现了错误。 错误类似于:线程“main”java中的异常。lang.composibleClassChangeError:class com。脸谱网。fb303。FacebookService$客户端具有接口组织。阿帕奇。节约TServiceClient作为超级类 我到底是怎么了?我已经添加了蜂巢所需的所有罐子

  • 我在主机上安装了Windows,在VirtualBox上安装了访客Ubuntu服务器。项目代码位于guest上,RubyMine位于host上。我已经配置了远程Ruby SDK并共享了项目文件夹。这很好。现在我需要配置Git。现在它运行本地(主机)可执行文件。我想通过SSH在guest上运行Git。它只允许设置本地路径(设置 知道如何集成远程Git可执行文件供RubyMine使用吗?

  • 问题内容: 通常,我在端口3000上使用Rails开发服务器。 水豚/黄瓜使用。如果我从默认驱动程序交换到selenium,则看起来它尝试在端口80上进行连接。 我想了解: 使用selenium时,是否需要在测试环境中单独实例化测试服务器。 如果上述问题的答案是肯定的,那么我该如何做才能在Web驱动程序之间无缝切换而不必不断进行更改? 如果有人举了一个env.rb配置示例,可以帮助您,请告诉我!

  • 我们什么时候应该使用Spring boot执行器。如果包括在内,它对应用程序内存和CPU使用有多大影响? 我目前正在使用Spring Boot 2. x。

  • 我想为我们的应用程序配置Spring启动致动器endpoint。下面是我的pom.xml文件,添加了Spring启动执行器依赖项。 当我启动应用程序时,我看不到文档中显示的任何注册的/application/URLendpoint。文件表明,在将致动器相关性添加到pom之后。xml,我应该在启动日志中看到额外的映射,但我没有。这里会有什么问题? 下面是一个启动日志:

  • 我有一个mapreduce代码在我的本地计算机上运行良好。然后,当我在远程服务器上运行它时,我会得到以下执行选项 在我的IntelliJ集成开发环境中,我有一个外部库avro-mapred-1.7.7-hadoop2。jar,我从中构建了工件。当我解压缩工件的jar时,我正确地找到了,并且在组织中正确地找到了AvroKeyInputFormat。阿帕奇。阿夫罗。mapreduce软件包。那么我在这