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
相关产品推荐
相关产品推荐

