使用远程执行配置程序时,当 instance_count 大于 2 时,Terraform 会卡住

2024-04-01

  • 我正在尝试使用 null_resource 通过 Terraform 的远程执行配置程序来配置多个 Windows EC2 实例。

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

  • 最初,我正在使用三个远程执行配置程序(其中两个涉及重新启动实例),没有 null_resource 和对于单个实例,一切都工作得非常好。
  • 然后我需要增加计数,并根据几个链接,最终使用了 null_resource。因此,我已将问题减少到甚至无法使用 null_resource 为 2 个以上 Windows EC2 实例运行一个远程执行配置程序。

用于重现错误消息的 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}"
}

观察结果:

  • 对于一个远程执行配置程序,如果计数设置为 1 或 2,则可以正常工作。如果计数设置为 3,则无法预测所有配置程序每次都会在所有实例上运行。然而有一件事是肯定的,Terraform 永远不会完成并且不显示输出变量。它不断显示“null_resource.nullresource[count.index]:仍在创建...”
  • For the 本地执行供应者- 一切正常。使用 count 的值为 1、2 和 7 进行测试。
  • For 文件提供者它在 1、2 和 3 中工作正常,但在 7 中无法完成,但文件已复制到所有 7 个实例上。它不断显示“null_resource.nullresource[count.index]:仍在创建...”
  • 此外,在每次尝试中,remote-exec 配置程序都能够连接到实例,而不管计数的值如何,只是它不会触发内联命令并随机选择跳过该命令并开始显示“仍在创建...”消息。
  • 我已经被这个问题困扰有一段时间了。在调试日志中也找不到任何重要的内容。我知道不建议将 Terraform 用作配置管理工具,但是,如果实例计数仅为 1(即使没有 null_resource),即使使用复杂的配置脚本,一切也能正常工作,这表明 Terraform 应该可以轻松处理这样的情况基本供应要求。
  • TF_DEBUG 日志:
  • count=2,TF 成功完成并显示Apply Complete! https://gist.github.com/anand-swaroop-git/cd84b62226f2a3a9e8a225f8c0039ab4.
  • count=3,TF 在所有三个实例上运行远程执行,但未完成且不显示输出变量。卡在“仍在创建...” https://gist.github.com/anand-swaroop-git/92015c1c8fc82ef3731d48d6258e89d4
  • count=3,TF 仅在两个实例上运行远程执行并跳过 nullresource[1] ,不完成且不显示输出变量。卡在“仍在创建...” https://gist.github.com/anand-swaroop-git/0355d7a60a609dcaaf7fbb31bf096f6c
  • 任何指示将不胜感激!

Update:最终的伎俩是将 Terraform 降级为v11.14按照这个发表评论 https://github.com/hashicorp/terraform/issues/22006#issuecomment-509588621.

您可以尝试以下几件事:

  1. Inline remote-exec:
resource "aws_instance" "ec2instance" {
  count         = "${var.instance_count}"
  # ...
  provisioner "remote-exec" {
    connection {
      # ...
    }
    inline = [
      # ...
    ]
  }
}

现在你可以参考self https://www.terraform.io/docs/configuration-0-11/interpolation.html#attributes-of-your-own-resource在 - 的里面connection阻止获取实例的私有IP。

  1. Add triggers to 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属性 https://www.terraform.io/docs/providers/null/resource.html#triggers重新创造null_resource从而重新执行remote-exec.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用远程执行配置程序时,当 instance_count 大于 2 时,Terraform 会卡住 的相关文章

随机推荐

  • 我需要在 asp.net 中屏蔽文本框

    该文本框中只能包含数字 条目必须在 100 到 500 之间 文本框需要包含 3 位小数 我不希望在将值插入数据库时 出现任何错误 我需要使用 jQuery 或 ASP NET 验证控件吗 如果 jQuery 有用 那么我会使用哪个插件 或
  • R 中的对称非负矩阵分解

    I am trying to implement NMF in R based on the following formula H is initially guess and then iteratively update based
  • 何时在 Angular + Java 项目中使用 DTO 和 Matpstruct

    好吧 我有一个大项目 我想把它做好 但我什至不知道规范是什么 Problem 我有几个具有关系的实体 我需要将它们一起显示在页面上 在视图中显示前 3 个事件 凡是Event有关系到事件实例 a 取消政策 并且对多个Pricing 截止日期
  • 获取用户在当前之前浏览过的页面

    代替 login php ref http mysite com lastpage 我可以通过其他方式获得之前的页面吗 尝试了 HTTP REFERER 但无法让它工作 Notice Undefined index HTTP REFERER
  • 渲染 svg 文件并使用 Express 提供服务

    我想知道如何使用 Express 渲染和提供 svg 文件 现在 我可以将 svg 作为原始 XML 文件提供 这是我正在做的事情 route router get status function req res next res setH
  • Rails 中的共享 JS(咖啡)

    如果我想在不同文件之间共享一些 JavaScript 函数应用程序 资产 javascript组织目录结构的最佳方法是什么 假设我有共享 js 咖啡 sharedFunction gt Hello 现在 我如何在其他地方使用它 就像这里一样
  • Solr 复制和 Solr 云有什么区别?

    我支持 Rails 项目 其中包含 Rails 应用程序和 Solr 的附加实例 我的环境 rails 3 2 1 ruby 2 1 2 sunspot 2 1 0 Solr 4 1 6 Problem 云提供商不稳定 我不能使用其他云提供
  • Pandas groupby - 计算相对点的距离

    假设我有一些看起来像这样的东西 df pd DataFrame Event A A A A A B B B B B Number 1 2 3 4 5 6 7 8 9 10 Ref False False False False True F
  • Nexus One - Android 2.1 版本,2.1 的 SDK 在哪里?

    搭载 2 1 操作系统的 Nexus Android 手机今天上市 我的朋友 刚刚订购了两个 隔夜运送 我想这意味着明天或后天就会在他手中 人们在他们的生活中拥有 2 1 版本 这怎么可能接受呢 在开发人员接触 SDK 之前就动手 我已经有
  • Selenium:查找基本 URL

    我在不同的机器上使用 Selenium 来自动测试 MVC Web 应用程序 我的问题是我无法获取每台机器的基本网址 我可以使用以下代码获取当前网址 IWebDriver driver new FirefoxDriver string cu
  • 80 端口上的 heroku + nginx

    我正在尝试在 heroku 免费环境中启动 nginx 服务器 我准备了任何操作方法和教程 但我无法运行它 首先 我想在端口 80 上启动 nginx 作为默认 Web 服务器 然后我想将 nginx 配置为 underline expre
  • 3个表之间的内连接

    我在数据库中有这些表 country id country 1 USA 2 Brazil 和段表 id country 1 USA 2 Brazil 我有第三张表 Id segment id country id 其中segment id是
  • GSON 转换为 LinkedHashMap 而不是我的对象

    我有这段代码 public abstract class Repository
  • SQL:查找表中缺失的层次结构文件夹(路径)

    我有一个包含文件夹路径的表 我需要找到层次结构中这些文件夹之间的所有 间隙 我的意思是 如果表包含这 3 个文件夹 A A B C A B C D E F G 我需要在层次结构中找到以下丢失的文件夹 A B A B C D A B C D
  • Sonar 5.1 问题列表 - 如何按问题类型分组

    我们如何识别当前代码库中项目中最常见的问题类型 我们最近从 Sonar 4 5 升级到 5 1 在4 5中 我们曾经查看特定项目中的问题列表 并且问题按问题类型分组 例如 在一个项目中 规则 使用记录器记录此异常 可能是最常见的关键规则 有
  • 如何检查mysql中的二进制字符串是否为UTF-8?

    我找到了一个 Perl 正则表达式 可以检查字符串是否为 UTF 8 正则表达式来自w3c site http www w3 org International questions qa forms utf 8 en php field m
  • matplotlib 中的等高线图显示不正确的线型

    我正在使用轮廓图在 matplotlib 中绘制一个具有正值和负值的二维矩阵 它应该显示正值的实线和负值的虚线 loc matplotlib ticker MaxNLocator 20 Z psi lvls loc tick values
  • 在SSIS中使用执行进程任务和WinSCP进行SFTP传输

    我有一个User file txt文件放置在 WinSCP 根文件夹 USERDATA 中 我正在尝试将其下载到给定位置C User Local Executable C Program Files x86 WinSCP WinSCP ex
  • React 组件安装两次

    在我的 React Redux ReactRouterV4 应用程序的一小部分中 我有以下组件层次结构 Exhibit Parent ExhibitOne ExhibitTwo ExhibitThree 在 Exhibit 的子级中 还可以
  • 使用远程执行配置程序时,当 instance_count 大于 2 时,Terraform 会卡住

    我正在尝试使用 null resource 通过 Terraform 的远程执行配置程序来配置多个 Windows EC2 实例 terraform v Terraform v0 12 6 provider aws v2 23 0 prov