我可以从具有动态名称的角色导入特定任务吗?

Thi*_*ves 9 ansible

我有这个角色结构:

roles/
- a/
  - tasks/
    - main.yml
    - k8s.yml
 - templates/
   - mytemplate.yml.j2
- b/
  - tasks/
    - main.yml
    - k8s.yml
 - templates/
   - mytemplate.yml.j2
Run Code Online (Sandbox Code Playgroud)

在我的剧本中,我需要动态地包含一个角色,而k8s.yml不是运行main.yml.像这样的东西:

- roles:
  - "{{ rolename }}/k8s.yml"
Run Code Online (Sandbox Code Playgroud)

有一个include_role模块可以做到这一点:

 - include_role:
    name: "{{ rolename }}"
    tasks_from: k8s
Run Code Online (Sandbox Code Playgroud)

然而,由于一个不允许角色中的变量的错误,这将失败name,并将仅修复在ansible 2.5 :(

另一种方法是使用include_tasks:

include_tasks: "roles/{{ rolename }}/tasks/k8s.yml"
Run Code Online (Sandbox Code Playgroud)

包含并执行任务,但由于找不到模板,因此我收到了失败消息(ansible尝试查找相对于playbook目录的模板,而不是角色dir):

TASK [Template processing] *********************************************************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was:    /home/myuser/myproject/mytemplate.yml.j2
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find or access 'mytemplate.yml.j2'\nSearched in:\n\t/home/myuser/myproject/roles/a/tasks/templates/mytemplate.yml.j2\n\t/home/myuser/myproject/roles/a/tasks/mytemplate.yml.j2\n\t/home/myuser/myproject/templates/mytemplate.yml.j2\n\t/home/myuser/myproject/mytemplate.yml.j2"}
Run Code Online (Sandbox Code Playgroud)

我甚至尝试通过添加它来修补include_roles带有修补版本的模块myproject/library/,但我无法使其工作.

有没有办法实现这个目标?

编辑:如果rolename变量在命令行上设置为额外的var,则playbook工作正常,但在设置时失败set_fact.

Thi*_*ves 0

我能够通过使用来规避该错误hostvars

- include_role:
    name: "{{ hostvars[inventory_hostname]['rolename'] }}"
    tasks_from: k8s
Run Code Online (Sandbox Code Playgroud)

这样我就可以让它工作直到 ansible 2.5 发布