前言
一般我们在管理多机房,多地域不同网段的机器时,都会使用到跳板机进行中转连接。
一般配置为这样
1 | ~/.ssh/config |
这样实际使用过程中也没有问题, 并且ansible和ssh都可以直接内网进行连接。
背景
先说一下背景。
全局管理的主机大概有300+
其中大部分的节点都分布在不同地域,并且走的是ProxyCommand进行转发ssh连接。
300台节点同时执行一些io比较长的任务的时候,ansible执行的效率就会变的非常的慢。
那么我们一般都是会去增加forks 来提高并发执行的效率。 但是当我将 forks 从 10 提高 20时,ssh就会随机的出现各种异常。
最常见的就是 Connect closed, 各种超时,甚至有提示秘钥不正确的,总之各种错误都出现了。
但是当你单独连接这些报错的节点的时候, 你会发现这些节点单独执行都是正常的。
思路
首先想到的就是,所有的连接都是走的proxy做了中转,会不会中转这一步出现了问题?
增加了跳板机SSH连接数的配置
为了验证这种问题,我尝试修改了跳板机ssh的两个配置参数
1 | MaxSessions 300 |
增加以后,实际的发现并没有什么明显的效果。
google有说修改下面两个配置,但是我觉得应该不对就没有尝试
1 | ServerAliveInterval |
修改ansible配置
关于ansible的配置,尝试过将timeout的时间增加,实际上并没有解决问题。
又去git上看了一圈,发现有人跟我差不多的问题,最后是加了retries的配置解决。
1 | [ssh_connection] |
加上以后,确实不会报错了。但实际上好像并不是根治了问题,只不过问题发生的时候多了重试操纵。
不过代价就是如果真的超时,或者连接不上,ansible会在前台卡的非常久。一直在重试。
总结
遇到这种问题
- 减少
forks的数量 (很有效,就是减少的forks,执行速度感人) - 添加
retries参数 (推荐) - 尽量全部使用内网,不使用跳板机进行转发.