
我们在日常的香港服务器运维自动化过程中,Ansible 是我们核心的批量管理工具,在一次例行的批量更新任务中,我们发现在管理位于香港机房的一批服务器时,Ansible 执行任务全部失败,提示无法连接目标主机。然而,同样的Playbook在其他区域(如新加坡、东京)的服务器上执行正常。这一异常引起了我们的关注。
这批香港服务器的网络结构与其他区域不同:它们处于一个隔离的私有网络中,需通过跳板机(Jump Host/Bastion Host)进行访问。这一架构上的差异,最终成为我们排查问题并优化 Inventory 配置的关键线索。
一、问题描述
1.1 执行Ansible命令失败
$ ansible all -i hosts_hk -m ping
host_192.168.10.15 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.10.15 port 22: Connection timed out",
"unreachable": true
}
所有目标主机均返回“UNREACHABLE”,提示SSH连接超时。
1.2 手动SSH登录测试
我们从Ansible控制节点(控制机)直接执行SSH命令测试:
$ ssh 192.168.10.15
ssh: connect to host 192.168.10.15 port 22: Connection timed out
同样失败。但如果先SSH到跳板机,再从跳板机登录目标服务器,则连接成功:
$ ssh jump.hongkong.datacenter
$ ssh 192.168.10.15
说明目标服务器正常运行,问题在于无法直连,需要配置多跳SSH。
二、问题分析
Ansible默认采用SSH直连目标主机的方式进行远程操作,若中间存在跳板机,而配置中未明确指出,Ansible将无法自动穿透。
通过分析Ansible的连接模型,我们确认需要使用 ProxyJump(SSH跳板)或更早版本支持的 ProxyCommand 来实现多跳连接。
三、原始Inventory配置(错误示例)
[hongkong_servers]
192.168.10.15
192.168.10.16
[hongkong_servers:vars]
ansible_user=root
ansible_port=22
这种配置适用于目标主机可直接访问的情况,不适用于当前的多跳网络结构。
四、解决方案:优化Inventory配置支持SSH多跳
4.1 方法一:使用 ansible_ssh_common_args + ProxyJump
[hongkong_servers]
192.168.10.15
192.168.10.16
[hongkong_servers:vars]
ansible_user=root
ansible_port=22
ansible_ssh_common_args='-o ProxyJump=your_user@jump.hongkong.datacenter'
这种方式适用于OpenSSH 7.3及以上版本,简洁直观。
4.2 方法二:使用 ProxyCommand(兼容旧版SSH)
[hongkong_servers]
192.168.10.15
192.168.10.16
[hongkong_servers:vars]
ansible_user=root
ansible_port=22
ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p your_user@jump.hongkong.datacenter"'
这一方式适用于较老版本OpenSSH或者更复杂的链式跳板。
4.3 方法三:结合SSH配置文件优化
为了避免重复配置,还可以在 ~/.ssh/config 文件中集中定义跳板机策略:
Host hk-server-*
ProxyJump your_user@jump.hongkong.datacenter
User root
Port 22
Host 192.168.10.*
ProxyJump your_user@jump.hongkong.datacenter
User root
Port 22
然后在Inventory中这样写:
[hongkong_servers]
hk-server-01 ansible_host=192.168.10.15
hk-server-02 ansible_host=192.168.10.16
Ansible会自动读取SSH配置文件并应用跳板设置。
五、案例验证
优化配置后再次执行:
$ ansible all -i hosts_hk -m ping
host_192.168.10.15 | SUCCESS => {
"changed": false,
"ping": "pong"
}
host_192.168.10.16 | SUCCESS => {
"changed": false,
"ping": "pong"
}
连接成功,问题解决。
六、经验与技巧分享
- Ansible在多跳SSH场景下需显式声明跳板机连接方式,否则默认直连会失败。
- ansible_ssh_common_args 是关键参数,可直接嵌入跳板配置。
- 推荐使用SSH配置文件统一管理复杂网络连接规则,让Ansible配置更简洁。
- 排查时要回归基本网络连通性测试,确认是物理连通性问题还是配置失误。
- 在不同环境测试同一Playbook时,应充分考虑网络结构差异,不可盲目迁移配置。
七、附加建议
- 对于大型多区域架构,可使用动态Inventory或Inventory插件(如 constructed、yaml)管理多环境变量。
- 在团队内部统一跳板策略、SSH配置规范,有助于运维工作标准化。
- 定期对跳板机做安全加固,包括双因素认证、日志审计等措施。
以上即为本次香港服务器Ansible批量管理失效的排查与优化过程,希望能为在类似网络结构下工作的工程师们提供有价值的参考。











