Terraform 在更改基础设施时会处理“known_hosts”吗?如果是,如何处理?

Terraform 在更改基础设施时会处理“known_hosts”吗?如果是,如何处理?

我对 terraform 还很陌生,所以这个问题可能不太好回答。但我正在运行 [这个 Amazon EC2 示例],有一次它尝试通过 SSH 连接到机器,我假设是为了安装 nginx。这对我来说总是失败,我只看到反复尝试登录服务器。

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

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

答案1

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

默认情况下,此 SSH 客户端不执行任何主机验证,Terraform 不会覆盖此默认设置。因此,无需像第一次连接时那样验证主机 ID ssh。此 SSH 客户端库不考虑 OpenSSH 配置文件,因此在那里设置有关主机检查的选项将不起作用。

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

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

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

答案2

最有可能的是使用以下 ssh 选项:

-o 'StrictHostKeyChecking no'

是绕过检查的方法。我想将其添加为评论而不是答案,但我做不到

相关内容