事实采集的代价
事实采集是 playbook 开头对每台主机执行的一次探测,把系统信息装进 ansible_facts,供条件判断与模板引用。代价是每台主机一次额外的连接与执行,节点多时执行时间会明显被它占掉。缓存策略就是取舍:让结果按主机存下来复用、对需要准确性的主机单独刷新、或者在完全不需要事实时直接关掉采集。
基本信息
| 开关 | gather_facts、gather_subset、gather_timeout |
|---|---|
| 常用后端 | jsonfile、redis、memcached 等(部分属 community.general) |
| 关键配置 | fact_caching、fact_caching_connection、fact_caching_timeout |
| 刷新方式 | 等缓存过期,或用 setup 模块对目标主机显式重采 |
典型使用场景
- 节点多、事实变化慢(内核、CPU、内存):开缓存减少重复探测
- 任务只操作固定路径与固定包:关掉采集,减少无谓往返
- 刚做了挂载或网卡变更,需要最新值:对相关主机显式重跑采集
- 需要事后回看某台机器采集到什么:用文件缓存便于排查与留档
- 条件分支依赖发行版判断:保留必要的事实子集,不能整块关掉
缓存配置与刷新
缓存配置与刷新
# ansible.cfg 片段
[defaults]
gathering = smart # 缓存命中则跳过采集,日常运维常用
fact_caching = jsonfile # 结果落到本地文件,便于检查
fact_caching_connection = /var/tmp/ansible_facts
fact_caching_timeout = 86400 # 秒,按事实的变化频率设定
# 只对指定主机刷新部分事实(写到 playbook 任务里)
# - ansible.builtin.setup:
# gather_subset: ['!all', 'network']采集模式对照
| 模式 | 行为 | 适用 |
|---|---|---|
| smart | 缓存命中就跳过采集 | 大多数日常运维 |
| implicit | 历史默认行为,接近 smart | 兼容旧 playbook |
| explicit | 不自动采集,需要时用任务触发 | 需要精细控制采集时机 |
| gather_facts: false | 完全不采集 | 纯模板渲染或只调用外部接口 |
缓存保存的是快照:机器热插拔了磁盘、改了主机名或换了网卡后,缓存里的值仍是旧的。需要用最新值做判断时,先对相关主机重采,再执行决策类任务。
关掉采集后,依赖 ansible_os_family、ansible_distribution、ansible_default_ipv4 的条件与模板会直接报未定义变量;关闭之前先确认没有任何任务依赖这些字段。
怎么定量选型
先量出事实采集在整次运行里的占比:对同一批主机连续跑两次,看两次的耗时差,差得越多说明采集与连接开销越明显。占比高就上缓存并把过期时间设得比事实变化周期略长;占比低就别动,缓存反而会带来陈旧数据与额外的排查成本。缓存后端优先选文件,多控制节点共享时再考虑集中式后端。