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

时间:2018-03-22 17:21:17

标签: ansible

我有这个角色结构:

roles/
- a/
  - tasks/
    - main.yml
    - k8s.yml
 - templates/
   - mytemplate.yml.j2
- b/
  - tasks/
    - main.yml
    - k8s.yml
 - templates/
   - mytemplate.yml.j2

在我的Playbook中,我需要动态添加一个角色,但需要运行k8s.yml而不是main.yml。像这样:

- roles:
  - "{{ rolename }}/k8s.yml"

有一个include_role模块就是这样做的:

 - include_role:
    name: "{{ rolename }}"
    tasks_from: k8s

然而,由于bug不允许角色name中的变量,并且仅在ansible 2.5上修复,因此失败:(

另一种方法是使用include_tasks

include_tasks: "roles/{{ rolename }}/tasks/k8s.yml"

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

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"}

我甚至尝试使用include_roles覆盖myproject/library/模块,将其添加到rolename,但我无法使其正常工作。

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

编辑:如果在命令行上将set_fact变量设置为额外的var,则该playbook工作正常,但在使用select yyyy,mm, @s:=@s+sisapokok sisapokok, @t:=@t+sisajasa sisajasa from ( select yyyy,mm,sum(sisapokok) sisapokok,sum(sisajasa) sisajasa from ( select year(tanggal) yyyy,month(tanggal) mm, sisapokok,sisajasa from transaksi t join ( select year(tanggal) yyyy,month(tanggal) mm,idpinj,max(transid) maxid from `transaksi` where status in(3,4) group by year(tanggal),month(tanggal),idpinj ) s on s.maxid = transid ) t group by yyyy,mm ) u ,(select @s:=0,@t:=0) r order by yyyy,mm +------+------+-----------+----------+ | yyyy | mm | sisapokok | sisajasa | +------+------+-----------+----------+ | 2018 | 1 | 2000 | 2003 | | 2018 | 2 | 5000 | 2303 | | 2018 | 3 | 13000 | 3103 | +------+------+-----------+----------+ 3 rows in set (0.00 sec) 进行设置时失败。< / p>

1 个答案:

答案 0 :(得分:0)

我可以使用hostvars

来规避错误
- include_role:
    name: "{{ hostvars[inventory_hostname]['rolename'] }}"
    tasks_from: k8s

这样我可以在ansible 2.5发布之前使其工作