Ansible自定义模块运行失败:两种场景报错排查求助
自定义Cisco配置解析模块config_parse的两类报错及解决思路
问题现象
- 给任务添加
delegate_to: localhost时,报错:"Connection type local is not valid for this module" - 不委派到localhost时,报错:
"Unexpected failure during module execution: No module named 'config_parse'"
环境与代码信息
主剧本内容
--- - name: Create dynamic invegtory tags: check,apply hosts: localhost gather_facts: false roles: - role: create_inventory - name: get and compare data tags: check,apply hosts: run_group gather_facts: false roles: - get_data - compare_data
调用自定义模块的任务
- name: parse config lines config_parse: DEVICE_CONFIG: "{{ show_run['stdout'][0] }}" register: parsed_results
目录结构
main_playbook.yml library/config_parse.py roles/compare_data/tasks/main.yml roles/create_inventory/tasks/main.yml roles/get_data/tasks/main.yml
版本与环境说明
- Ansible版本:2.14.17
- 其他含自定义模块的剧本可正常运行,推测问题与IOS设备或角色使用方式相关
调试信息
TASK [compare_data : parse config lines] *************************************** task path: /runner/project/roles/compare_data/tasks/ios_tasks.yaml:1 redirecting (type: connection) ansible.builtin.network_cli to ansible.netcommon.network_cli [WARNING]: Collection ansible.netcommon does not support Ansible version 2.14.17 [WARNING]: Collection ansible.utils does not support Ansible version 2.14.17 redirecting (type: action) ansible.builtin.ios to cisco.ios.ios redirecting (type: action) ansible.builtin.ios to cisco.ios.ios The full traceback is: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/ansible/executor/task_executor.py", line 158, in run res = self._execute() File "/usr/local/lib/python3.9/site-packages/ansible/executor/task_executor.py", line 633, in _execute result = self._handler.run(task_vars=vars_copy) File "/usr/share/ansible/collections/ansible_collections/cisco/ios/plugins/action/ios.py", line 50, in run result = super(ActionModule, self).run(task_vars=task_vars) File "/usr/share/ansible/collections/ansible_collections/ansible/netcommon/plugins/action/network.py", line 44, in run filename, module = self._find_load_module() File "/usr/share/ansible/collections/ansible_collections/ansible/netcommon/plugins/action/network.py", line 260, in _find_and_load_module module = importlib.import_module(context.plugin_resolved_name) File "/usr/lib64/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked ModuleNotFoundError: No module named 'config_parse' fatal: [10.1.1.1]: FAILED! => { "msg": "Unexpected failure during module execution: No module named 'config_parse'", "stdout": "" }
解决思路
针对报错1:Connection type local is not valid for this module
该报错是因为任务在IOS设备组下执行时,Ansible默认将自定义模块识别为网络模块,而网络模块不支持local连接类型。解决时需明确强制任务以本地方式执行,同时规避网络模块的加载逻辑。
针对报错2:No module named 'config_parse'
从调试日志可见,Ansible尝试通过Cisco IOS的action插件加载模块,而非读取本地library目录。这是因为针对网络设备执行任务时,Ansible优先使用对应平台的模块加载逻辑,不会自动读取本地自定义模块。可通过以下方式解决:
方案1:强制本地执行并确保模块路径正确
修改任务,明确指定本地连接类型,同时确保library目录在Ansible搜索路径内:
- name: parse config lines delegate_to: localhost config_parse: DEVICE_CONFIG: "{{ show_run['stdout'][0] }}" register: parsed_results vars: ansible_connection: local
执行剧本时可手动指定模块路径:
ansible-playbook main_playbook.yml -e ansible_library=./library
方案2:转换模块类型
由于配置解析是基于已获取到的本地变量(show_run结果),更适合将config_parse改为filter插件,直接在本地处理变量,完全规避网络模块的加载逻辑。
方案3:检查模块编写规范
确保config_parse.py符合Ansible通用模块规范,避免被识别为网络模块:
- 不要使用网络模块的模板结构
- 确保包含正确的
main()入口函数 - 参数定义符合通用模块格式
额外注意
日志中存在Ansible版本与ansible.netcommon、cisco.ios集合的兼容性警告,虽非直接报错原因,但升级集合或Ansible版本可避免潜在问题。
内容的提问来源于stack exchange,提问作者rev_it_up
相关产品推荐
相关产品推荐

