You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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'"
}

问题分析与解决方案

核心问题原因

  1. 执行环境隔离:AAP中每个作业模板运行在独立的执行环境(容器/虚拟机),默认/tmp/ansible_cache是作业本地目录,作业1写入的缓存无法被作业2读取。
  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. 替代方案:工作流变量传递

如果共享缓存配置复杂,可直接通过工作流变量传递数据:

  1. 在Set Fact的Playbook末尾添加任务,将变量输出到作业结果:
- name: Export variable to workflow
      ansible.builtin.set_stats:
        data:
          my_variable: "{{ my_variable }}"
        aggregate: no
  1. 在工作流中,将Set Fact作业的my_variable变量传递给Get Fact作业
  2. Get Fact的Playbook可直接引用该变量

内容的提问来源于stack exchange,提问作者jeremywat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:33:12