You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:07:08