首页/系统与基础设施/自动化运维速查/事实采集与缓存的策略设计
Ansible 核心70 条

事实采集与缓存的策略设计

事实采集每台主机一次,节点多时开销明显;打开缓存(jsonfile 这类易排查的后端)并设置合理过期时间即可复用结果,确需准确值时对相关主机显式重采,完全不需要事实时直接关闭采集。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

事实采集的代价

事实采集是 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 的条件与模板会直接报未定义变量;关闭之前先确认没有任何任务依赖这些字段。

怎么定量选型

先量出事实采集在整次运行里的占比:对同一批主机连续跑两次,看两次的耗时差,差得越多说明采集与连接开销越明显。占比高就上缓存并把过期时间设得比事实变化周期略长;占比低就别动,缓存反而会带来陈旧数据与额外的排查成本。缓存后端优先选文件,多控制节点共享时再考虑集中式后端。

易错点

  • 关闭采集却保留 ansible_os_family 之类的条件判断,任务因未定义变量直接失败
  • 缓存时间设得过长,机器换了磁盘或改了网卡后仍按旧事实做决策
  • 每次都全量采集加超时重试,大清单下执行时间被探测占去大半
  • gather_subset 只写排除项却没保留必需子集,模板引用的字段变成未定义
  • 缓存目录不可写或各控制节点路径不一致,缓存静默失效退化为每次采集

数据来源与参考

  • Ansible 官方文档 Facts and magic variables
  • Ansible 配置参考 fact_caching 系列选项
  • ansible.builtin.setup 模块文档

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/facts-gathering-cache-strategy.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​