如何在Ansible子角色中打印调用方角色名称?
如何从Ansible的另一个角色内打印调用方角色名称?
现有代码
Playbook
- name: print calling role name hosts: all tasks: - import_role: name: role2 tasks_from: update
role2/tasks/update.yml
- name: role 2 import_role: name: role1 tasks_from: update vars: role_scope: "{{ role_name }}"
role1/tasks/update.yml
- name: role 1 debug: msg: "Calling role: {{ role_scope }}"
当前输出
Calling role: role1
期望输出
Calling role: role2
问题原因与解决方案
问题出在{{ role_name }}的解析时机:使用import_role时,变量会在被导入角色(role1)的上下文里解析,此时role_name的值已经变成了role1,而非调用方的role2。你可以通过以下两种方式解决:
方法一:使用Ansible内置角色栈变量
Ansible提供了ansible_parent_role_names内置变量,它是一个列表,按调用顺序存储当前角色的所有父角色。在role1中,直接取列表第一个元素就能获取直接调用它的role2:
修改role1/tasks/update.yml:
- name: role 1 debug: msg: "Calling role: {{ ansible_parent_role_names[0] }}"
这种方式无需在role2中传递变量,直接在role1内获取调用方角色名。
方法二:在role2中提前捕获自身角色名再传递
如果需要显式传递变量,要确保role_name在role2的上下文里完成解析。先通过set_fact把role2的角色名存到临时变量,再传递给role1:
修改role2/tasks/update.yml:
- name: role 2 set_fact: current_role: "{{ role_name }}" - name: import role1 import_role: name: role1 tasks_from: update vars: role_scope: "{{ current_role }}"
此时current_role会被解析为role2,传递给role1后就能得到期望输出。
内容的提问来源于stack exchange,提问作者user592748
相关产品推荐
相关产品推荐

