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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:21