Ansible用libssh替代paramiko后IOS设备facts缺失问题及解决办法问询
解决libssh连接C2960X时无法获取ansible_net_filesystems_info的空间验证问题
问题背景
迁移Ansible服务器到Azure后,因安全限制改用libssh替代paramiko连接C2960X交换机,导致依赖ansible_net_filesystems_info变量的空间检查任务失败——该变量在libssh连接下未被正确收集。
可行解决办法
1. 手动执行设备命令并解析剩余空间
绕过Ansible Facts自动收集逻辑,直接通过交换机原生命令获取flash剩余空间并解析:
- name: 获取flash剩余空间输出 cisco.ios.ios_command: commands: "dir flash: | include free" register: flash_free_result - name: 解析剩余空间为KB单位 set_fact: flash_spacefree_kb: "{{ (flash_free_result.stdout[0] | regex_search('(\\d+)\\s+bytes free', '\\1') | first | int) // 1024 }}" - name: 验证flash空间是否足够 fail: msg: "Flash空间不足:需要{{ firmware_image_size }}KB,剩余{{ flash_spacefree_kb }}KB" when: flash_spacefree_kb < firmware_image_size
说明:通过dir flash:命令提取剩余字节数,转换为KB后和固件大小对比,完全不依赖Ansible自动收集的facts。
2. 强制收集文件系统相关Facts
明确调用ios_facts模块并指定收集文件系统资源,确保libssh连接下能获取到所需变量:
- name: 收集Cisco设备文件系统Facts cisco.ios.ios_facts: gather_subset: min gather_network_resources: - filesystems - name: 验证flash空间是否足够 fail: msg: "Flash空间不足:需要{{ firmware_image_size }}KB,剩余{{ ansible_net_filesystems_info['flash:'].spacefree_kb }}KB" when: ansible_net_filesystems_info['flash:'].spacefree_kb < firmware_image_size
说明:指定gather_network_resources: filesystems会强制收集文件系统相关的详细信息,覆盖默认的facts收集逻辑,可解决libssh下的收集缺失问题。
3. 配置libssh的PTY分配
部分Cisco设备在无PTY的SSH会话下返回的命令输出不完整,导致Facts收集失败,可强制开启PTY:
在inventory中配置主机参数:
[cisco_switches] HOSTNAME ansible_connection=ssh ansible_ssh_extra_args="-o RequestTTY=force"
或在playbook的vars中设置:
vars: ansible_ssh_extra_args: "-o RequestTTY=force"
说明:开启PTY后,设备会返回完整的命令输出,确保Ansible能正确解析并收集Facts。
内容的提问来源于stack exchange,提问作者Moridn
相关产品推荐
相关产品推荐

