Terraform 是否在更改基础架构时处理“known_hosts”?如果是这样,如何?

Ran*_*y L 4 ssh known-hosts terraform

我对 terraform 很陌生,所以也许这不是一个好问题。但是我正在运行 [this Amazon EC2 example] 并且有一次它尝试通过 SSH 连接到机器,我假设安装了 nginx。这对我来说总是轰炸,我只是看到重复尝试登录服务器。

我突然想到,这可能是因为在第一次登录尝试时,SSH 要求我信任远程机器并将其添加到 known_hosts 文件中。没有一点(明显)提示我这样做。

所以现在我想知道,terraform 究竟是如何处理 known_hosts 的。我克隆了 repo 并搜索了 known_hosts,但一无所获。

Mar*_*ins 7

Terraform 不运行ssh命令行工具,也不OpenSSH用作库。相反,它使用用 Go 编写的替代 SSH 客户端实现。

默认情况下,此 SSH 客户端不进行任何主机验证,并且 Terraform 不会覆盖此默认设置。因此,没有必要像在第一次与ssh. 这个 SSH 客户端库不考虑 OpenSSH 配置文件,因此在那里设置有关主机检查的选项将不起作用。

Terraform 反复尝试连接到远程主机,直到成功或超时。超时有两个常见原因:

  • 目标实例的安全组规则不允许从运行 Terraform 的主机在 TCP 端口 22 上进行连接。这可以通过向ingress实例的安全组之一添加新规则来解决。
  • 当安全组期望私有时,Terraform 会尝试使用公共 IP 地址,反之亦然。connection可用于告诉 Terraform 如何连接。对于公共 IP 地址使用${self.public_ip},或者对于私有 IP 地址使用${self.private_ip},其中public_ipprivate_ip都是aws_instance资源类型的属性。

请注意,当 Terraform 连接到实例的公共 IP 地址时,安全组必须允许来自运行 Terraform 的主机的公共IP 地址(实际上可能是 NAT 网关的地址)的SSH 连接,同时连接到私有 IP 地址安全组必须允许 Terraform 主机的私有 IP(假设它在 EC2 实例上运行)或用于从 EC2 外部隧道连接到私有 IP 地址的 VPN 网关的私有 IP。