現在 Drive Network では L2, L3 スイッチが 20 台以上が稼働しています。過去 10 年程 Cisco Catalyst シリーズを使用して来て物理障害は一度もありませんが、設定内容のバックアップは設定変更毎に採集しています。
tftp を用いる方法等様々ありますが、私は Net::Telnet::Cisco を用いた Perl のプログラムが最もシンプルだと感じました。
./get.pl name とするだけで、show runnning-config, show vlan, show interfaces status の結果をファイルに出力します。スイッチ間での設定内容の整合性の確認等でも出力したファイルを操作した方が効率的です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #!/usr/bin/perl -w # # get.pl # #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// use Module #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= use strict; use Net::Telnet::Cisco; #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// Controller #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= my $target = $ARGV [0]; #// ---------------------------------------------------------- #// Item Set #// ---------------------------------------------------------- my $pass_vt = 'password0' ; #// login my $pass_en = 'password' ; #// enable my $list = { 'sw00' => '192.168.20.10' , 'sw01' => '192.168.20.11' , }; #// ---------------------------------------------------------- #// Start #// ---------------------------------------------------------- foreach (% $list ) { next unless ( $list ->{ $_ }); if ( $target ) { next unless ( $target eq $_ ); } my $addr = $list ->{ $_ }; my $host = $_ ; my $sess = Net::Telnet::Cisco->new(Host => $addr ); $sess ->login(Password => $pass_vt ); $sess ->enable( $pass_en ); my @cmd0 = $sess ->cmd( 'show run' ); my @cmd1 = $sess ->cmd( 'show vlan' ); my @cmd2 = $sess ->cmd( 'show int status' ); $sess -> close ; #// my $date = substr (utime2date( time ()), 0, 10); $date =~ s/\///g; my $file0 = $host . '_' . $date . '.run' ; my $file1 = $host . '_' . $date . '.vlan' ; my $file2 = $host . '_' . $date . '.stat' ; open WRITE , "+>$file0" ; foreach my $cmd ( @cmd0 ) { next if ( $cmd =~ /^Building/); #next if ($cmd =~ /^\n$/); next if ( $cmd =~ /^Current/); print WRITE $cmd ; } close WRITE ; open WRITE , "+>$file1" ; foreach my $cmd ( @cmd1 ) { print WRITE $cmd ; } close WRITE ; open WRITE , "+>$file2" ; foreach my $cmd ( @cmd2 ) { print WRITE $cmd ; } close WRITE ; #// print "Done: $host\n" ; } #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #// Model #// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= sub utime2date { my ( $sec , $min , $hours , $mday , $mon , $year , $wday , $yday , $isdst ) = localtime ( $_ [0]); my $years = $year + 1900; my $this_mon = sprintf ( "%02d" , $mon + 1); $mday = sprintf ( "%02d" , "$mday" ); $hours = sprintf ( "%02d" , "$hours" ); $min = sprintf ( "%02d" , "$min" ); $sec = sprintf ( "%02d" , "$sec" ); my $date = "$years/$this_mon/$mday $hours:$min:$sec" ; return $date ; } |