momo's Blog.

ansible 使用堡垒机or跳板机功能时, SSH连接随机断开问题

字数统计: 610阅读时长: 2 min
2022/04/28 Share

前言

一般我们在管理多机房,多地域不同网段的机器时,都会使用到跳板机进行中转连接。

一般配置为这样

1
2
3
4
5
6
7
8
~/.ssh/config
Host 10.66.*
user root
ProxyJump thailand-jump


ansible/hosts
ansible_ssh_common_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ProxyCommand="ssh -W %h:%p -q thailand-jump"'

这样实际使用过程中也没有问题, 并且ansible和ssh都可以直接内网进行连接。

背景

先说一下背景。

全局管理的主机大概有300+
其中大部分的节点都分布在不同地域,并且走的是ProxyCommand进行转发ssh连接。

300台节点同时执行一些io比较长的任务的时候,ansible执行的效率就会变的非常的慢。

那么我们一般都是会去增加forks 来提高并发执行的效率。 但是当我将 forks 从 10 提高 20时,ssh就会随机的出现各种异常。

最常见的就是 Connect closed, 各种超时,甚至有提示秘钥不正确的,总之各种错误都出现了。

但是当你单独连接这些报错的节点的时候, 你会发现这些节点单独执行都是正常的。

思路

首先想到的就是,所有的连接都是走的proxy做了中转,会不会中转这一步出现了问题?

增加了跳板机SSH连接数的配置

为了验证这种问题,我尝试修改了跳板机ssh的两个配置参数

1
2
MaxSessions 300
MaxStartups 500

增加以后,实际的发现并没有什么明显的效果。

google有说修改下面两个配置,但是我觉得应该不对就没有尝试

1
2
ServerAliveInterval
TCPKeepAlive

修改ansible配置

关于ansible的配置,尝试过将timeout的时间增加,实际上并没有解决问题。

又去git上看了一圈,发现有人跟我差不多的问题,最后是加了retries的配置解决。

1
2
[ssh_connection]
retries=10

加上以后,确实不会报错了。但实际上好像并不是根治了问题,只不过问题发生的时候多了重试操纵。

不过代价就是如果真的超时,或者连接不上,ansible会在前台卡的非常久。一直在重试。

总结

遇到这种问题

  1. 减少forks的数量 (很有效,就是减少的forks,执行速度感人)
  2. 添加retries 参数 (推荐)
  3. 尽量全部使用内网,不使用跳板机进行转发.
CATALOG
  1. 1. 前言
  2. 2. 背景
  3. 3. 思路
    1. 3.1. 增加了跳板机SSH连接数的配置
    2. 3.2. 修改ansible配置
  4. 4. 总结