为 Ansible 设置 SSH 跳转盒 - 无法连接

为 Ansible 设置 SSH 跳转盒 - 无法连接

我正在尝试使用 Ansible 部署到没有公共 IP 地址的 AWS 主机。我可以通过 ssh 手动访问主机,然后通过 ssh 连接到跳转盒,再在该跳转盒上 ssh 连接到私有机器,如下所示my machine-->bastion-->private server

我认为我无法使用 Ansible 原生支持,因为此剧本使用与其他剧本共享的角色。这些角色依赖于特定的库存组。如果我设置,group_vars那么这将使剧本无法将其部署到非 AWS 基础设施。

我的 ssh 配置文件如下所示:

# Servers in availability zone A
    Host 10.0.0.*
      ProxyCommand ssh -W %h:%p bastion.example.com
      IdentityFile ~/.ssh/key.pem

# Servers in availability zone B
Host 10.0.1.*
  ProxyCommand ssh -W %h:%p bastion.example.com
  IdentityFile ~/.ssh/key.pem

# The bastion host itself
Host bastion.example.com
  User ubuntu
  IdentityFile ~/.ssh/key.pem
  ControlMaster auto
  ControlPath ~/.ssh/ansible-%r@%h:%p
  ControlPersist 5m

请注意,堡垒服务器和私有服务器的密钥是相同的。

当我尝试时,ssh 10.0.0.175 -F /tmp/aws_bastion_ssh_config -vvv我得到以下输出:

    (venv) andrew@dell:~/projects/ansible-playbooks$ ssh 10.0.0.175 -F /tmp/aws_bastion_ssh_config -vvv
OpenSSH_7.2p2 Ubuntu-4ubuntu2.4, OpenSSL 1.0.2g  1 Mar 2016
debug1: Reading configuration data /tmp/aws_bastion_ssh_config
debug1: /tmp/aws_bastion_ssh_config line 6: Applying options for 10.0.0.*
debug1: Executing proxy command: exec ssh -W 10.0.0.175:22 bastion.example.com
debug1: permanently_drop_suid: 1000
debug1: key_load_public: No such file or directory
debug1: identity file /home/andrew/.ssh/key.pem type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/andrew/.ssh/key.pem-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
Permission denied (publickey).
ssh_exchange_identification: Connection closed by remote host

我怎样才能让它工作?

我需要在跳转箱上放置钥匙吗?我该如何配置?

ssh bastion.example.com -F /tmp/aws_bastion_ssh_config编辑:更多信息:- 澄清一下,当我到达堡垒服务器时,我可以从跳转箱连接到私人机器。我已将密钥复制到该服务器,当我连接到私人机器时。理想情况下,我不希望将密钥放在跳转箱上,我只是将其放在那里以确保网络正常运行。ssh [email protected] -i ~/.ssh/key.pem

答案1

使用 ProxyCommand 所做的是启动两个完全独立的 ssh 命令。

  1. 尝试使用代理对 10.0.0.175 进行身份验证,因此您不需要堡垒上的密钥和配置。
  2. 提供代理的一方只需要能够向堡垒进行身份验证。

您对 1. 的命令运行正常,但您看不到 2. 的调试输出。由于您使用了可解析的 TLD,并且其他一切都是通用配置,因此 2. 不会​​出现任何错误 - 但它没有执行您想要的操作,因为它从未从您的配置中提供IdentityFileUser选项。它使用不同的密钥或用户进行身份验证,并被堡垒拒绝(理所当然)。

为了确保 2. 也读取您的配置,请明确传递该选项,如下所示:

# Servers in availability zone A
Host 10.0.0.*
  ProxyCommand ssh -vvv -F /tmp/aws_bastion_ssh_config -W %h:%p bastion.example.com
  IdentityFile ~/.ssh/key.pem

# Servers in availability zone B
Host 10.0.1.*
  ProxyCommand ssh -vvv -F /tmp/aws_bastion_ssh_config -W %h:%p bastion.example.com
  IdentityFile ~/.ssh/key.pem

# The bastion host itself
Host bastion.example.com
  User ubuntu
  IdentityFile ~/.ssh/key.pem
  ControlMaster auto
  ControlPath ~/.ssh/ansible-%r@%h:%p
  ControlPersist 5m

一切正常。确认:

ssh -vvv -F /tmp/aws_bastion_ssh_config 10.0.0.175

然后删除-vvv表格 1. 和 2。如果你将你的移动/tmp/aws_bastion_ssh_config到默认位置,两个-F选项都可以被删除(ssh 将读取/etc/ssh/ssh_config ~/.ssh/config files

相关内容