如何在Ansible自动化平台中正确启用跨作业模板的事实存储?
问题:AAP工作流中作业模板间无法共享缓存事实
环境配置
作业模板1:Set Fact
- 已勾选Enable Fact Storage
- 使用Playbook:
set_fact_playbook.yml
--- - name: Set fact hosts: localhost gather_facts: yes tasks: - name: Assign my_variable ansible.builtin.set_fact: my_variable: My variable content cacheable: yes
作业模板2:Get Fact
- 已勾选Enable Fact Storage
- 使用Playbook:
get_fact_playbook.yml
--- - name: Get fact hosts: localhost gather_facts: yes tasks: - ansible.builtin.debug: var: my_variable - ansible.builtin.debug: var: ansible_facts['my_variable']
事实缓存配置(ansible.cfg)
[defaults] fact_caching = jsonfile fact_caching_connection = /tmp/ansible_cache fact_caching_prefix = '' fact_caching_timeout = 86400
已确认该文件存在于项目根目录,AAP可识别。
问题现象
工作流中Set Fact执行成功后,Get Fact执行时提示变量未定义:
TASK [ansible.builtin.debug] *************************************************** task path: /runner/project/ansible/get_fact_playbook.yml:7 ok: [localhost] => { "my_variable": "VARIABLE IS NOT DEFINED!: 'my_variable' is undefined. 'my_variable' is undefined" } TASK [ansible.builtin.debug] *************************************************** task path: /runner/project/ansible/get_fact_playbook.yml:10 ok: [localhost] => { "ansible_facts['my_variable']": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'my_variable'. 'dict object' has no attribute 'my_variable'" }
问题分析与解决方案
核心问题原因
- 执行环境隔离:AAP中每个作业模板运行在独立的执行环境(容器/虚拟机),默认
/tmp/ansible_cache是作业本地目录,作业1写入的缓存无法被作业2读取。 - 缓存路径独立性:即使目标主机都是
localhost,不同执行环境的缓存存储路径完全隔离,不存在共享基础。
正确实现步骤
1. 配置共享缓存存储路径
放弃本地/tmp,改用AAP集群所有节点可访问的共享目录(如/var/lib/awx/facts_cache),修改ansible.cfg:
[defaults] fact_caching = jsonfile fact_caching_connection = /var/lib/awx/facts_cache fact_caching_prefix = '' fact_caching_timeout = 86400
确保该目录对AAP执行用户(通常为awx)拥有读写权限。
2. 统一执行环境
两个作业模板必须使用同一个执行环境模板,否则缓存路径的挂载配置不统一,无法实现文件共享。
3. 优化事实读取逻辑
修改Get Fact的Playbook,显式重载缓存事实(避免gather_facts加载不彻底):
--- - name: Get fact hosts: localhost gather_facts: yes tasks: - name: Reload cached facts ansible.builtin.setup: gather_subset: min - ansible.builtin.debug: var: ansible_facts.my_variable
4. 校验AAP配置细节
- 确认作业模板所属项目已同步最新的
ansible.cfg文件 - 确保执行环境不会覆盖项目目录下的
ansible.cfg优先级(AAP默认优先读取项目根目录配置)
5. 替代方案:工作流变量传递
如果共享缓存配置复杂,可直接通过工作流变量传递数据:
- 在Set Fact的Playbook末尾添加任务,将变量输出到作业结果:
- name: Export variable to workflow ansible.builtin.set_stats: data: my_variable: "{{ my_variable }}" aggregate: no
- 在工作流中,将Set Fact作业的
my_variable变量传递给Get Fact作业 - Get Fact的Playbook可直接引用该变量
内容的提问来源于stack exchange,提问作者jeremywat
相关产品推荐
相关产品推荐

