0

我正在尝试从我的输出中获取 csv 文件。

 use Net::Cisco::ISE;
 use Data::Dumper;
 use Text::CSV;

 my $ise = Net::Cisco::ISE->new(hostname=>'hostname', username=>'user', password=>'user');  
 $ise->namespace3;
 $ise->namespace5;

 my $networkdevices = $ise->networkdevices;
 for my $name (keys %{$networkdevices})
    {
       print   Dumper $ise->networkdevices("id" => $networkdevices->{$name}->id);
    }

输出:

     $VAR1 = bless( {
             'NetworkDeviceGroupList' => {
                                           'NetworkDeviceGroup' => [
                                                                   'Device Type#All Device Types',
                                                                   'IPSEC#Is IPSEC Device#No',
                                                                   'Location#All Locations'
                                                                 ]
                                         },
             'tacacsSettings' => {
                                   'previousSharedSecretExpiry' => '0',
                                   'connectModeOptions' => 'OFF',
                                   'sharedSecret' => '******'
                                 },
             'NetworkDeviceIPList' => {
                                        'NetworkDeviceIP' => {
                                                             'mask' => '24',
                                                             'ipaddress' => '10.66.0.0'
                                                           }
                                      },
             'name' => 'LAB-Distri',
             'coaPort' => '1700',
             'authenticationSettings' => {
                                           'radiusSharedSecret' => '******',
                                           'keyInputFormat' => 'ASCII',
                                           'enableKeyWrap' => 'false',
                                           'networkProtocol' => 'RADIUS'
                                         },
             'profileName' => 'Cisco',
             'id' => '3d21e200-a534-11e3-82cc-00505694f123'
           }, 'Net::Cisco::ISE::NetworkDevice' );

这个脚本应该在控制台中给我我的 wiched 元素(ipadress 和名称),但它不起作用

   foreach $name (keys %{$networkdevices}){
   print  
   my $ip = $networkdevices{$name}{'ipaddress'};
   my $name = $networkdevices{$name}{'name'};
   }

最后,我需要一个包含设备名称和 IP 地址的 csv 文件。


现在我只使用两种方法:NameNetworkDeviceIPList(只是为了清理我的输出信息)。不幸的 Net::Cisco::ISE是,没有办法只IPs获得ips。我可以打电话NetworkDeviceIPList得到:

 for my $name (keys %{$networkdevices}){
 my $device = $ise->networkdevices("id" => $networkdevices->{$name}->id);
 print Dumper $device->name;
 print Dumper $device->NetworkDeviceIPList;
 }

我有这个输出:

 $VAR1 = 'LAB-W';
 $VAR1 = {
    'NetworkDeviceIP' => {
    'mask' => '32',
    'ipaddress' => '10.66.1.12'
  }
  };

但我现在不知道如何从这个输出 csv 数据中获取名称和 ips 数组。

4

1 回答 1

2

Dumper输出以“ bless ”开头,因此您手头有对象,因此需要找到方法来查询它们,而不是直接戳入它们的 hashref。

来自Net::Cisco::ISE文档*

网络设备

返回的散列包含Net::Cisco::ISE::NetworkDevice...
...的实例。
如果您知道主机名或 ID,请使用devices带有参数的调用,如下所示。

它标识返回的对象属于哪个类,并继续举例

my $device = $ise->networkdevices("id","123"); 

然后通过Net::Cisco::ISE::NetworkDevice查看要使用的方法$device

所以而不是

my $ip = $networkdevices{$name}{'ipaddress'}; # etc

$ise->networkdevices如上所述使用并对返回的对象进行进一步的方法调用

笔记  

对象是一个引用,通常是一个哈希引用,并且确实可以这样使用它。但是,这不好,麻烦不断,真的不应该做。

对对象内部的每一次戳刺都可能最终使程序崩溃,并且根据该业务的性质,可能以难以诊断(发现)的微妙方式崩溃。

请记住,关于类的重要一点是为其功能提供接口并保护内部免受任何义务;它封装了实现,因此原则上它对用户是不可见的。内部结构可能随时发生变化,恕不另行通知,而且可能以微妙的方式发生变化。

人们应该始终找到为该类提供的方法并且只使用这些方法。


*这个 CPAN 页面的细节似乎要少得多

即使您要直接从 中检索值$networkdevices,它也是一个 hashref,因此需要首先取消引用,$networkdevices->{...}{...}在第一级之后,我们确实可以删除箭头,以方便语法。(但请不要对对象执行此操作。)

于 2018-01-19T18:22:54.900 回答