使用pyATS的Ansible Playbook执行失败,提示‘show: not found’
问题解决:Ansible cli_parse + pyATS 执行Cisco命令报错"/bin/sh: 1: show: not found"
错误原因
ansible.utils.cli_parse模块的command参数默认是在控制节点本地执行Shell命令,而非将命令发送到远程Cisco交换机执行。所以系统会把show ip interface brief当作本地Shell命令处理,自然找不到show命令导致报错。
修复方案
先通过cisco.ios.ios_command获取交换机的命令输出,再将输出传入cli_parse模块进行解析,这样就能避免本地执行命令的问题。
修改后的Playbook代码:
--- - name: pyats parsing test hosts: switches gather_facts: no connection: network_cli tasks: - name: 获取交换机接口IP简要信息 cisco.ios.ios_command: commands: "show ip interface brief" register: sh_ip_int_raw - name: 用pyATS解析命令输出 ansible.utils.cli_parse: stdin: "{{ sh_ip_int_raw.stdout[0] }}" parser: name: ansible.netcommon.pyats os: ios set_fact: sh_ip_int_parsed - debug: var: sh_ip_int_parsed
关键说明
- 显式指定
connection: network_cli,确保Ansible通过CLI方式连接网络设备(和你之前成功运行的ios_command模块连接方式一致) - 使用
ios_command获取命令输出并注册到变量,再通过stdin参数传给cli_parse,让pyATS解析的是交换机返回的真实输出 - 指定
os: ios参数,帮助pyATS识别设备操作系统,提升解析准确率
前置依赖确认
确保控制节点已安装必要组件:
- 安装pyATS和Genie:
pip install pyats genie - 安装Ansible集合:
ansible-galaxy collection install ansible.utils ansible.netcommon cisco.ios
内容的提问来源于stack exchange,提问作者Asher Armando
相关产品推荐
相关产品推荐

