我相当肯定我已经在ansible文档中看到了一个功能,您可以告诉它连接到某些主机,它首先需要通过DMZ主机。但是,我似乎无法在邮件列表的某些辩论之外找到任何文档。
我知道在此页http://alexbilbie.com/2014/07/using-ansible-with-a-bastion-host/中使用ssh配置进行黑客攻击,但这对于任何类型的温和监管环境中的极其常见的要求来说都是过于复杂的问题。
有没有办法在不使用自定义ssh配置包含和voodoo netcat巫术的情况下执行此操作?
答案 0 :(得分:23)
使用Ansible 2,这是built-in option:
如何配置跳转主机以访问我无法直接访问的服务器?
使用Ansible 2,您可以在 ansible_ssh_common_args 广告资源变量中设置 ProxyCommand 。当连接到相关主机时,此变量中指定的任何参数都将添加到sftp / scp / ssh命令行。请考虑以下库存组:
[gatewayed] foo ansible_host=192.0.2.1 bar ansible_host=192.0.2.2
您可以使用以下内容创建 group_vars / gatewayed.yml :
ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p -q user@gateway.example.com"'
当尝试连接到 gatewayed 组中的任何主机时,Ansible会将这些参数附加到命令行。 (除 ansible.cfg 中的任何 ssh_args 之外,还使用这些参数,因此您无需在中重复全局 ControlPersist 设置ansible_ssh_common_args 。)
请注意, ssh -W 仅适用于OpenSSH 5.4或更高版本。对于旧版本,必须在堡垒主机上执行 nc%h:%p 或一些等效命令。
答案 1 :(得分:8)
如果您的跳转框需要私钥文件进行连接(即使它与用于私有子网实例的密钥相同),请改用:
ansible_ssh_common_args: '-o ProxyCommand="ssh -i <path-to-pem-file> -W %h:%p -q user@gateway.example.com"'
我花了好几个小时试图修复一个现在看似简单而明显的解决方案的问题。
答案 2 :(得分:3)
由于Ansible使用SSH,您可以使用标准SSH配置方式指定堡垒主机:
e.g。通过堡垒主机连接所有名称为“* .amazonaws.com”的服务器:
Host *.amazonaws.com
ProxyCommand ssh -W %h:%p my_bastion_host.example.org
当ansible
或ansible-playbook
运行时,它将读入您的SSH配置文件并将其应用于连接。您还可以使用ANSIBLE_SSH_ARGS
环境变量或在调用命令时使用-F
标志来指定读取哪个SSH配置文件。
您还可以在ansible.cfg中指定更多SSH参数。