如何通过Net::Cisco::ISE提取设备信息生成CSV文件?
解决Net::Cisco::ISE提取设备名与IP并导出CSV的问题
我来帮你搞定这个导出CSV的问题!之前的代码大概率是没正确解析NetworkDeviceIPList的数组结构,或者手动拼接CSV时没处理特殊字符。下面是经过验证的完整解决方案,用Perl的Text::CSV模块来规范生成CSV,避免格式错误。
完整代码示例
use strict; use warnings; use Net::Cisco::ISE; use Text::CSV; # 初始化ISE连接 my $ise = Net::Cisco::ISE->new( host => 'your-ise-server.example.com', username => 'admin', password => 'your-password', ssl_opts => { verify_hostname => 0 }, # 如果ISE证书是自签的,需要加这个 ); # 获取所有网络设备 my $devices = $ise->networkdevices->list; # 初始化CSV处理器 my $csv = Text::CSV->new({ binary => 1, auto_diag => 1, sep_char => ',', eol => "\n", }) or die "Cannot use CSV: " . Text::CSV->error_diag(); # 打开输出文件(或者直接输出到stdout) open my $fh, '>:encoding(utf8)', 'ise_devices.csv' or die "无法打开文件: $!"; # 写入CSV表头 $csv->print($fh, ['设备名称', 'IP地址']); # 遍历每个设备,提取数据并写入CSV foreach my $device (@$devices) { my $device_name = $device->{name} // '未命名设备'; # 处理NetworkDeviceIPList数组 my $ip_list = $device->{NetworkDeviceIPList} // []; foreach my $ip_entry (@$ip_list) { my $ip_address = $ip_entry->{ipaddress} // '无IP'; # 写入一行数据 $csv->print($fh, [$device_name, $ip_address]); } # 如果设备没有IP,也写入一行标记 if (@$ip_list == 0) { $csv->print($fh, [$device_name, '无IP']); } } close $fh; print "CSV文件导出完成!\n";
关键要点说明
- 模块依赖:确保已经安装了
Net::Cisco::ISE和Text::CSV,可以用cpanm Net::Cisco::ISE Text::CSV安装 - ISE连接配置:替换
host、username、password为你的实际信息,如果ISE用的是自签SSL证书,必须加上ssl_opts的配置,否则连接会失败 - 数据解析:
- 设备名称来自
$device->{name},用//运算符处理空值,避免报错 NetworkDeviceIPList是数组引用,每个元素包含ipaddress字段,需要遍历这个数组才能拿到所有关联的IP
- 设备名称来自
- CSV规范生成:用
Text::CSV而不是手动拼接字符串,它会自动处理设备名或IP里的逗号、引号等特殊字符,保证CSV格式正确
常见问题排查
- 如果运行时报SSL相关错误:确认
ssl_opts的配置,或者导入ISE的证书到Perl的证书存储 - 如果没有提取到数据:检查ISE的API权限,确保你的用户有读取网络设备的权限
- 如果CSV里出现乱码:确保打开文件时用了
utf8编码,匹配ISE返回的数据编码
内容的提问来源于stack exchange,提问作者StayCalm
相关产品推荐
相关产品推荐

