Ansible 控制节点内存占用过高通常由并发 forks 数设置过大或全量收集事实导致,最推荐的处理方向是降低 forks 值并按需关闭 gather_facts,风险边界是降低并发会延长总执行时间且可能影响依赖事实的任务。
先说结论:优化 Ansible 控制节点内存需优先调整并发策略与事实收集范围,避免无限制增加 forks。
- 先定位:确认当前 forks 设置与事实收集状态,检查是否启用了高内存消耗的 callback 插件。
- 先做:在 ansible.cfg 中降低 forks 值,Playbook 中按需设置 gather_facts: no。
- 再验证:监控控制节点 RSS 内存变化,确认任务执行成功率未受影响。
命令速用版
通过环境变量或命令行参数临时调整关键配置,快速验证内存变化。
# 查看当前 forks 配置
ansible-config dump | grep FORKS
# 临时降低 forks 为 5 执行
ANSIBLE_FORKS=5 ansible-playbook -i inventory site.yml
# 临时关闭事实收集
ansible-playbook -i inventory site.yml -e "gather_facts=no"为什么会这样
Ansible 控制节点内存占用高主要是因为每个 fork 对应一个子进程,且事实数据默认常驻内存。
Ansible 基于 Python 开发,默认使用 linear 策略串行或批量执行任务。每增加一个 fork,控制节点就需要维护一个独立的 Python 子进程来处理 SSH 连接和模块执行,这会直接线性增加内存开销。此外,默认开启的 gather_facts 会将所有受管主机的事实数据加载到控制节点内存中,主机数量越多,占用越明显。部分 callback 插件(如 yaml 或 json 输出)在缓冲大量日志时也会消耗额外内存。
分步处理
按照配置调整、Playbook 优化、策略变更的顺序逐步降低内存压力。
步骤 1:调整并发数 forks
编辑 ansible.cfg 文件,找到或添加 defaults 段落,将 forks 设置为较低值(如 5 或 10)。
[defaults]
forks = 5适用场景:主机数量多且控制节点内存有限。风险边界:总执行时间会随 forks 降低而延长。
步骤 2:按需关闭事实收集
在不需要 ansible_os_family 等系统事实的 Playbook 中,显式关闭事实收集。
- hosts: all
gather_facts: no
tasks:
- name: Run command
command: echo hello适用场景:任务仅执行命令或脚本,不依赖主机变量。风险边界:依赖事实的任务会报错。
步骤 3:更换执行策略
对于任务执行时间差异大的场景,使用 free 策略避免慢节点阻塞快节点,间接减少内存驻留时间。
- hosts: all
strategy: free
tasks: ...适用场景:主机性能不一致。风险边界:任务执行顺序不再严格保证。
怎么验证是否生效
通过系统监控工具观察控制节点内存 RSS 值,并对比任务执行日志。
在任务执行期间,使用 top 或 ps 命令查看 ansible 进程 resident memory 大小。对比优化前后的峰值内存占用。检查 playbook 执行结果,确保没有因关闭事实收集导致的变量未定义错误。
# 查看 ansible 进程内存
ps -eo pid,comm,rss | grep ansible常见坑
- 过度降低 forks:将 forks 设为 1 虽最省内存,但会导致大规模部署时间不可接受,需权衡时间与资源。
- 忽略事实依赖:关闭 gather_facts 后,若任务中使用 {{ ansible_distribution }} 等变量会直接失败。
- 日志缓冲过大:启用 verbose 模式(-vvv)会显著增加控制节点内存,生产环境建议关闭。
常见问题
Ansible 默认 forks 值是多少?
Ansible 默认 forks 值为 5,这意味着默认同时只在 5 台主机上执行任务。
strategy: free 和 linear 有什么区别?
linear 策略等待所有主机完成当前任务后再执行下一个,free 策略允许主机独立完成任务,减少等待导致的内存驻留。
如何持久化保存配置优化?
将 forks 和策略配置写入项目目录下的 ansible.cfg 文件,该配置优先于全局配置。
参考来源
- Ansible 官方文档 - Configuration settings: https://docs.ansible.com/ansible/latest/reference_appendices/config.html
- Ansible 官方文档 - Strategy Plugins: https://docs.ansible.com/ansible/latest/plugins/strategy.html
- Ansible 官方文档 - Playbooks Variables and Facts: https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_vars_facts.html