Ansible如何实现SSH会话持久化?负载均衡场景会话中断求助
解决Ansible SSH会话在负载均衡环境下的持久化问题
你的问题本质是负载均衡器会将新的SSH请求分发到不同的build服务器,而Ansible默认会为每个任务(或批量任务)新建SSH连接,导致中途跳到其他机器。下面是几个实用的解决办法:
方法一:开启SSH多路复用(最推荐)
通过配置Ansible的SSH连接参数,让多个任务复用同一个TCP连接,这样就不会触发负载均衡的新请求分发。
在你的ansible.cfg文件中添加或修改以下配置:
[ssh_connection] # 定义控制连接的套接字路径,确保每个主机+用户+端口组合唯一 control_path = ~/.ansible/cp/%h-%r-%p # 自动启用主连接模式 control_master = auto # 让主连接保持600秒(10分钟,可根据你的Playbook执行时长调整) control_persist = 600s
control_master:开启SSH的多路复用功能,允许后续会话复用已建立的连接。control_persist:设置主连接在最后一次使用后保持打开的时间,要确保这个时间长于你的整个Playbook执行时间。control_path:指定存储连接套接字的路径,%h(主机)、%r(远程用户)、%p(端口)这些变量能避免不同连接的套接字冲突。
注意:如果~/.ansible/cp目录不存在,需要手动创建:mkdir -p ~/.ansible/cp
方法二:强制Playbook在单一服务器上执行
直接绕过负载均衡的分发逻辑,先选定一台build服务器,然后让整个Playbook的角色都在这台机器上运行。
修改你的Playbook如下:
# 第一步:从build-servers组中选一台可用服务器 - hosts: build-servers gather_facts: false tasks: - name: 锁定一台目标build服务器 set_fact: target_build_server: "{{ inventory_hostname }}" # 只执行一次,确保只选一台 run_once: true # 第二步:在选定的服务器上执行所有角色 - hosts: "{{ target_build_server }}" gather_facts: false roles: - role: role1 - role: role2 - role: role3 - role: role4
这种方法完全避免了负载均衡的影响,所有任务都会在同一台服务器上完成。
方法三:配置负载均衡器的粘性会话
在负载均衡器层面设置基于源IP的会话保持,让来自Ansible控制节点的所有SSH请求都被分发到同一台build服务器。
具体配置方式取决于你使用的负载均衡器(比如Nginx、HAProxy、AWS ALB等),核心逻辑是:识别请求的源IP(Ansible控制节点的IP),将该IP的所有后续请求都路由到第一次选中的服务器。
这种方法不需要修改Ansible配置,但需要你有权限调整负载均衡器的规则。
内容的提问来源于stack exchange,提问作者d-_-b
相关产品推荐
相关产品推荐

