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
相关产品推荐
相关产品推荐

