You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:01:25