在公司开发中,为了安全起见,生产环境跟开发环境是相互隔离开来的。也就是说在开发环境网络中无法直接 ssh 登录到生产环境的机器, 如果需要登录生产环境的机器,通常会需要借助跳板机,先登录到跳板机,然后通过跳板机登录到生产环境。
那么,使用 Ansible 时,如何配置,可以直接穿过跳板机呢?
大致的过程如下面的图示:
1 | +-------------+ +----------+ +--------------+ |
我们可以通过 ssh 命令的 ProxyCommand
选项来解决以上问题。
通过 ProxyCommand 选项,机器 A 能够灵活使用任意代理机制与机器 C 上的 SSH Server 端口建立连接,接着机器 A 上的 SSH Client 再与该连接进行数据交互,从而机器 A 上的 SSH Client 与机器 C 上的 SSH Server 之间建立了与一般直接 SSH 连接不太一样的间接 SSH 连接。
不过由于间接 SSH 连接的透明性,逻辑上可认为机器 A 上的 SSH Client 与机器 C 上的 SSH Server 建立了直接 SSH 连接。
原理
ssh 命令自提供的代理机制,在机器 A 上另外单独建立与 B 的 SSH 连接,该 SSH 连接的 B 端侧与机器 C 上的 SSH Server 端口建立连接,该 SSH 连接的 A 端侧与机器 A 上的 SSH Client建立连接。
测试环境
A-本机:192.22.9.23
B-跳板机:192.22.9.21
C-目标机:192.22.4.46
条件:A->B的互信
测试步骤
测试 1
A–>B:root 用户的互信
C:root 的登录信息
1 | # ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q root@192.22.9.21"' |
可以成功穿过跳板机。
测试 2
A–>B:一般用户(luke)的互信
C:root 的登录信息
1 | # ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' |
跳板机普通用户,访问目标机器的 root 目录
1 | # ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'ls /root/' |
结论
访问权限取决于目标机器的登录用户。
测试 3
A–>B:一般用户(luke)的互信
C:一般用户(luke)的登录信息
1 | # ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' |
1 | # ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'pwd' |
跳板机普通用户,目标机普通用户,无法访问 root
1 | # ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'ls /root/' |
目标机器的普通用户无法访问 root 权限的路径。
测试 4
A–>B:root 用户的互信
C:luke 的登录信息
1 | # ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q root@192.22.9.21"' -m command -a 'pwd' |
总结
1、若要使用跳板机功能,需要本机和跳板机的互信,任一用户的互信都可以。
2、目标机器的操作权限,取决于目标机器的登录用户信息,与跳板机的登录信息无关。
3、穿过跳板机,无法保证所有的 Ansible 功能都支持,特别是一些复杂的功能,如 synchronize 模块。后续需要用的模块需要一一测试。