我对 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_ip
和private_ip
都是aws_instance
资源类型的属性。
请注意,当 Terraform 连接到实例的公共 IP 地址时,安全组必须允许来自民众运行 Terraform 的主机的 IP 地址(实际上可能是 NAT 网关的地址),而为了连接到私有 IP 地址,安全组必须允许 Terraform 主机的私有 IP(假设它在 EC2 实例上运行)或用于从 EC2 外部隧道连接到私有 IP 地址的 VPN 网关。
答案2
最有可能的是使用以下 ssh 选项:
-o 'StrictHostKeyChecking no'
是绕过检查的方法。我想将其添加为评论而不是答案,但我做不到