Ansible如何实现facts在多次playbook执行之间持久保留?
问题核心原因
你遇到的报错是两个常见配置错误共同导致的:
- 未开启Ansible全局fact缓存功能,
cacheable: yes仅会将fact写入已启用的缓存体系,不会自动激活缓存 set_fact的cacheable参数配置位置错误,被误识别为自定义变量而非模块参数
修复步骤
第一步:开启Ansible fact缓存
你可以选择jsonfile、redis、memcached等缓存后端,本地小范围使用推荐jsonfile方案,修改ansible.cfg配置如下:
[defaults] # 启用json格式本地缓存 fact_caching = jsonfile # 缓存文件存储路径,需提前创建目录并赋予Ansible进程读写权限 fact_caching_connection = /var/ansible/fact_cache # 缓存有效期,单位为秒,示例为24小时,可按需调整 fact_caching_timeout = 86400
配置完成后执行命令创建缓存目录:
mkdir -p /var/ansible/fact_cache && chmod 755 /var/ansible/fact_cache
第二步:修正set_fact参数写法
cacheable是set_fact的模块级参数,不能和要定义的变量平级放置,正确写法如下:
- name: Host Check | Verify EC2 set_fact: is_ec2: "{{ uuid.stdout == 'ec2' }}" # 注意cacheable和set_fact平级,作为模块参数生效 cacheable: yes
第三步:验证生效流程
- 重新运行
setup.yml,确认缓存目录下生成了对应目标主机的JSON缓存文件,文件中可以检索到is_ec2字段 - 运行
test.yml时不需要额外添加参数,Ansible会自动加载缓存中的fact变量 - 如果存在同名变量优先级冲突,可以通过
{{ ansible_facts.is_ec2 }}的方式明确调用缓存中的持久化fact
注意事项
- 不要在playbook头部设置
gather_facts: no,否则缓存的fact不会被自动加载,如需关闭自动采集可以手动执行setup模块拉取缓存 meta: clear_facts只会清除内存中的fact副本,不会删除本地缓存文件,需要清理过期缓存可以直接删除缓存目录下的对应文件
内容的提问来源于stack exchange,提问作者Xavier Merino
相关产品推荐
相关产品推荐

