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

Ansible Tower中include_role的vars_from无法识别with_items变量文件

问题分析

从报错信息能明确看出,include_role的vars_from参数把你传入的绝对路径当成了角色vars目录下的相对路径,拼接出了vars//opt/oracle/...这类错误路径。这是因为Ansible的vars_from设计逻辑是:传入的路径默认是相对于角色vars目录的相对路径,而非系统级绝对路径。你提到的Ansible 2.5相关bug,在2.9版本中已有优化,但核心的路径解析逻辑并未改变——vars_from不支持直接用绝对路径加载外部vars文件。

解决方案

针对你的场景,有两种可行的解决方式:

方式一:用include_vars加载变量后传入角色

放弃vars_from,先通过include_vars加载动态生成的文件,再将变量传递给角色:

tasks:
  - name: 加载JDK补丁变量文件
    include_vars:
      file: "{{ item }}"
    register: jdk_vars_results
    with_items:
      - /opt/oracle/opatch_jdk/roles/jdk_patch_role/vars/12.1.0.2.yml
      - /opt/oracle/opatch_jdk/roles/jdk_patch_role/vars/19.0.0.0.yml

  - name: 调用jdk_patch_role角色
    include_role:
      name: jdk_patch_role
    vars: "{{ item.ansible_facts }}"
    with_items: "{{ jdk_vars_results.results }}"

方式二:用相对路径引用角色vars目录内的文件

如果可以调整动态生成文件的路径,确保文件生成在角色的vars目录下(先检查你pre_tasks和tasks中的路径是否一致:pre_tasks里是/opt/oracle/opatch_jdk/jdk_patch_role/vars/,tasks里是/opt/oracle/opatch_jdk/roles/jdk_patch_role/vars/,路径存在差异,需统一),之后直接用文件名作为vars_from的值:

tasks:
  - name: 调用jdk_patch_role角色
    include_role:
      name: jdk_patch_role
      vars_from: "{{ item }}"
    with_items:
      - 12.1.0.2.yml
      - 19.0.0.0.yml

额外注意事项

  • 确认文件生成位置:如果动态文件是在远程节点生成的,include_vars和vars_from默认加载控制节点的文件,这种情况需要先把远程文件拉取到控制节点,或用slurp模块读取远程文件内容后再加载变量。
  • 检查文件名匹配:报错信息中显示的文件名后缀是.0,但你的任务里是.yml,需确保生成的文件名和引用的文件名完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:50:28