关闭或缓存facts是ansible扫描海量资产时最立竿见影的提速手段;默认gather_facts会为每台主机执行完整系统探测,数百台以上场景常占总耗时40%以上,真正需秒级响应的关键是避免重复收集而非加快收集。

直接关闭或缓存 Facts 是 Ansible 扫描海量资产时最立竿见影的提速手段。默认开启的 gather_facts 会为每台主机执行一次完整的系统探测(CPU、内存、网络、OS 等),在数百台甚至上千台节点场景下,这部分开销常占总耗时 40% 以上。真正需要“秒级响应”的扫描,核心不是更快地收集事实,而是避免重复收集。
明确是否真需要 Facts 数据
多数批量扫描类任务(如检查端口、校验文件是否存在、确认服务状态)并不依赖 facts。只要不调用 ansible_facts 变量或基于其做条件判断,就可以安全关闭。
- 在 playbook 顶部加一行:gather_facts: false
- 若仅对某几个 play 关闭,写在对应 play 下即可
- 全局禁用可在
ansible.cfg中设置:gathering = explicit,再配合gather_facts: false显式控制
启用 Facts 缓存(适合需部分事实的场景)
当某些任务确实要读取主机信息(比如按 OS 类型分发不同配置),又不想每次重查,就该上缓存。它把首次获取的结果存起来,后续执行直接读本地或 Redis,跳过 SSH 探测环节。
-
JSON 文件缓存:轻量、免依赖,适合中小规模。在
ansible.cfg中配置:
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts -
Redis 缓存:支持多控制节点共享、自动过期,适合集群化运维。需安装
redis和 Python 包redis,配置项为:
fact_caching = redis
fact_caching_connection = localhost:6379:0 - 缓存默认不过期,建议搭配
fact_caching_timeout = 3600(1 小时)防止信息陈旧
配合其他关键优化联动生效
Facts 优化单独用有效,但和以下几项一起调,才能把分钟级压到秒级:
-
开启 pipelining:减少 SSH 连接次数,在
ansible.cfg设 pipelining = true;注意需关闭requiretty(Defaults !requiretty加入/etc/sudoers) - 复用 SSH 连接:启用 ControlPersist,配置 ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=~/.ansible/cp/%h-%r
-
限制并发数:过高的
forks可能打满控制节点资源,建议从 20–50 开始测试,而非盲目设成 100+
不复杂但容易忽略:一次扫描耗时从 3 分钟降到 8 秒,往往就差在关掉 facts + 开启 pipelining + 配好 control path 这三步。关键是根据实际任务需求做取舍,而不是默认全开。










