我有这个角色结构:
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.
我能够通过使用来规避该错误hostvars:
- include_role:
name: "{{ hostvars[inventory_hostname]['rolename'] }}"
tasks_from: k8s
Run Code Online (Sandbox Code Playgroud)
这样我就可以让它工作直到 ansible 2.5 发布