能否从动态命名的Ansible Role中导入指定Task?遇模块Bug求助
动态执行Ansible角色中的指定任务文件
先说说我的场景:我有这样一组Ansible角色结构:
roles/ - a/ - tasks/ - main.yml - k8s.yml - templates/ - mytemplate.yml.j2 - b/ - tasks/ - main.yml - k8s.yml - templates/ - mytemplate.yml.j2
我的需求很明确:在Playbook里根据变量动态选一个角色,但不执行角色默认的main.yml,而是专门跑角色里的k8s.yml任务。
踩过的坑:错误的写法
一开始我想当然地这么写,结果直接报错:
- roles: - "{{ rolename }}/k8s.yml"
这种写法完全不符合Ansible角色的引用规范,根本没法正确识别角色和任务文件。
正确的思路(但遇到了Bug)
后来查文档发现,include_role模块正好支持这个需求——它的tasks_from参数可以指定要执行的任务文件,不用默认的main.yml。标准写法应该是这样:
- include_role: name: "{{ rolename }}" tasks_from: k8s
这里tasks_from填k8s就对应角色tasks目录下的k8s.yml(不用写后缀),逻辑上完全贴合我的需求。
但尴尬的是,这个写法因为一个Ansible的Bug执行失败了——这个Bug限制了include_role的name等参数不能使用变量,导致动态指定角色名的场景直接卡壳。
临时替代方案
如果暂时没法等Bug修复,有个折中的方法:直接用include_tasks引用任务文件的相对路径:
- include_tasks: "../roles/{{ rolename }}/tasks/k8s.yml"
不过要注意,这种写法相当于直接执行一个独立的任务文件,会丢失角色自带的templates、vars、defaults等上下文。如果你的k8s.yml里用到了角色的模板或者变量,这种方法可能会出问题。
另一个选择是检查你的Ansible版本,如果是比较旧的版本,可以尝试升级到较新的稳定版——很多用户反馈这个变量限制的Bug在后续版本中已经被修复了。
内容的提问来源于stack exchange,提问作者ThiagoAlves
相关产品推荐
相关产品推荐

