Ansible | 如何使用跳板机/堡垒机?

在公司开发中,为了安全起见,生产环境跟开发环境是相互隔离开来的。也就是说在开发环境网络中无法直接 ssh 登录到生产环境的机器, 如果需要登录生产环境的机器,通常会需要借助跳板机,先登录到跳板机,然后通过跳板机登录到生产环境。

那么,使用 Ansible 时,如何配置,可以直接穿过跳板机呢?

大致的过程如下面的图示:

1
2
3
+-------------+       +----------+      +--------------+
| 开发环境机器A | <---> | 跳板机B | <--> | 生产环境机器B |
+-------------+ +----------+ +--------------+

我们可以通过 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 连接

间接 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
2
3
4
5
# ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q root@192.22.9.21"'
192.22.4.46 | SUCCESS => {
"changed": false,
"ping": "pong"
}

可以成功穿过跳板机。

测试 2

A–>B:一般用户(luke)的互信
C:root 的登录信息

1
2
3
4
5
# ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"'
192.22.4.46 | SUCCESS => {
"changed": false,
"ping": "pong"
}

跳板机普通用户,访问目标机器的 root 目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'ls /root/'
192.22.4.46 | CHANGED | rc=0 >>
1115.txt
anaconda-ks.cfg
deploytelegraf
deploytelegraf.tar.gz
epic-brook.18.11.20.01.tar.gz
epic-josh-threshold.0.1.26.tar.gz
images.tar.gz
metric.tar.gz
python-httplib2-0.9.2-1.el7.noarch.rpm
restates
sensu-1.6.1-1.el7.x86_64.rpm
sshpass-1.06-2.el7.x86_64.rpm
test1115.txt
tl.txt

结论

访问权限取决于目标机器的登录用户。

测试 3

A–>B:一般用户(luke)的互信
C:一般用户(luke)的登录信息

1
2
3
4
5
# ansible all -m ping --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"'
192.22.4.46 | SUCCESS => {
"changed": false,
"ping": "pong"
}
1
2
3
# ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'pwd'
192.22.4.46 | CHANGED | rc=0 >>
/home/luke

跳板机普通用户,目标机普通用户,无法访问 root

1
2
3
# ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q luke@192.22.9.21"' -m command -a 'ls /root/'
192.22.4.46 | FAILED | rc=2 >>
ls: cannot open directory /root/: Permission deniednon-zero return code

目标机器的普通用户无法访问 root 权限的路径。

测试 4

A–>B:root 用户的互信
C:luke 的登录信息

1
2
3
# ansible all --ssh-common-args='-o ProxyCommand="ssh -W %h:%p -q root@192.22.9.21"' -m command -a 'pwd'
192.22.4.46 | CHANGED | rc=0 >>
/home/luke

总结

1、若要使用跳板机功能,需要本机和跳板机的互信,任一用户的互信都可以。

2、目标机器的操作权限,取决于目标机器的登录用户信息,与跳板机的登录信息无关。

3、穿过跳板机,无法保证所有的 Ansible 功能都支持,特别是一些复杂的功能,如 synchronize 模块。后续需要用的模块需要一一测试。

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
  • 本文作者: hoxis | 微信公众号【不正经程序员】
  • 本文链接: https://hoxis.github.io/ansible-jump-server.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!
0%