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

Ansible不同角色自定义模块重名无法各自调用问题求助

问题分析与解决

问题根源

Ansible的模块加载机制是:会将所有角色的library目录添加到模块搜索路径,但当存在同名模块时,第一个被加载的模块会被缓存,后续调用同名模块时会直接使用缓存版本,不会重新读取其他角色下的同名脚本。你先执行roleA的play,test.sh被缓存,所以后续执行roleB的play时,依然调用的是roleA的test.sh。

解决方案

方法1:给模块重命名(推荐)

直接给两个角色的模块设置不同名称,从根本上避免冲突:

  • 将roles/roleA/library/test.sh重命名为test_a.sh,修改roleA的tasks/main.yml:
    - name: Test RoleA
      test_a: {}
    
    - debug:
        msg: "{{ ansible_facts['msg'] }}"
    
  • 将roles/roleB/library/test.sh重命名为test_b.sh,修改roleB的tasks/main.yml:
    - name: Test RoleB
      test_b: {}
    
    - debug:
        msg: "{{ ansible_facts['msg'] }}"
    

方法2:直接调用角色内的脚本路径

如果不想修改模块名,可以利用Ansible内置的role_path变量,在任务中直接指定当前角色的脚本路径,绕过模块缓存机制:
修改roleA的tasks/main.yml:

- name: Test RoleA
  shell: "{{ role_path }}/library/test.sh"
  register: module_result
  changed_when: (module_result.stdout | from_json).changed

- set_fact:
    msg: "{{ (module_result.stdout | from_json).ansible_facts.msg }}"

- debug:
    msg: "{{ msg }}"

roleB的tasks/main.yml做完全相同的修改即可,这样会确保调用的是当前角色目录下的test.sh。

方法3:手动指定模块搜索路径(不推荐)

在第二个play中手动设置模块搜索路径,强制优先加载roleB的library:
修改site.yml:

- name: "Test RoleA"
  hosts: builders
  roles:
    - role: roleA

- name: "Test RoleB"
  hosts: builders
  vars:
    ansible_module_path: "{{ playbook_dir }}/roles/roleB/library"
  roles:
    - role: roleB

这种方法仅适用于单模块场景,多模块时需要维护复杂的路径列表,不建议使用。

验证

修改完成后重新执行ansible-playbook site.yml,两次play会分别输出ROLE-A和ROLE-B,符合预期。

内容的提问来源于stack exchange,提问作者Atanas Atanasov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:43:17