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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:58:20