如何从另一个角色中打印调用者角色名称?
剧本:
- 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_name }}"
电流输出
Calling role: role1
预期产出
Calling role: role2
正如 special variables 页面中所指出的,有一个变量
ansible_parent_role_names
包含所有祖先角色的列表。
当通过 include_role 或 import_role 操作执行当前角色时,此变量包含所有父角色的列表,以及最新的角色(换句话说,包含/导入此角色的角色)作为列表中的第一项。当出现多个包含时,此列表会将最后一个角色(换句话说,包含此角色的角色)列为列表中的第一项。也有可能特定角色在此列表中存在不止一次。
例如:当角色A包括角色B,在角色B里面,
等于ansible_parent_role_names
。如果角色 B 然后包含角色 C,则列表变为['A']
.['B', 'A']
所以,解决方案是在
role1
中使用它:
- name: role 1
debug:
msg: "Calling role: {{ ansible_parent_role_names[0] }}"
如果你想让它工作,不管它是否被另一个角色调用,你可以这样做:
- name: role 1
debug:
msg: >-
Calling role: {{ ansible_parent_role_names[0] | default(role_name) }}
这样,它会回答
Calling role: role2
当通过
role2
调用时,但是
Calling role: role1
例如直接在剧本中调用
role1
时。