ActivePerl 5.20.2 でCisco機器の操作をさらに自動化してみた
みなさまこんにちは。
前回は、ActivePerl実行環境の構築+とりあえずサンプルスクリプトを動かすところまでやってみました。
サンプルを動かしてみたおかげで、Cisco機器用のモジュールを使うと、機器の返すプロンプト内容をあまり気にせずに簡単に動作させられることが分かりました。
Teratermマクロと違って、再利用しやすいのもよさげ。
そこで今回は、より実践的なスクリプトを書いて、動かしてみます。
<今回やること>
次のような仕様のスクリプトを書きます。
■作業対象機器のIPアドレスリストを読み込む
■読み込んだIPアドレスに接続し、コマンドを実行
■コマンドの実行結果をログとしてファイルに出力
インプットがあり、処理し、アウトプットがある。だいぶプログラムっぽくなってきましたね(笑)
では、いきます。
といっても、今回はいきなり成果物と結果の内容から書いてしまいます。
以下、作成したスクリプトです。
~~~~
#
#
□□作業用
Cisco機器ログ取得用スクリプト
#
実行コマンド:show logging, show ip route
#
written by Takeru Satoh
#
おまじない(構文チェック&警告表示)
use strict; use warnings;
Cisco-IOS用モジュールのロード
念のための文字コード指定
use utf8; use open ':encoding(cp932)'; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)';
作業フォルダの指定
my $folder = 'D:/ActivePerl_setup/';
対象ノードのIPアドレスを記載したリストを読み込む
our $file_in = $folder . "nodelist.txt"; open (NODELIST, "<", $file_in) or die ("error :$!");
while (my $list = <NODELIST>){ chomp($list);
my $IPAddress = $list; my $vtyPasswd = ""; my $enPasswd = ""; my $hostname;
セッションの確立
my $conn= Net::Telnet::Cisco::IOS->new(HOST => $IPAddress);
vtyパスワードを用いてログイン
$conn->login( Name => "" , Password => $vtyPasswd );
ENABLEモードに昇格
$conn->enable( $enPasswd );
HOSTNAME取得
my @show_run = $conn->cmd('show run | inc hostname'); for my $i (@show_run){ if($i =~ /hostname/){ $hostname = $i; chomp($hostname); $hostname =~ s/(?:hostname )//g; last; } }
ログをファイルへ出力
my $file_out = $folder . "/log/" . $hostname . "_log.txt"; open (LOG, ">>", $file_out) or die "$!";
my @logging = "\n". $hostname .'>'.'show logging'. "\n"; @logging = $conn->cmd('show logging'); my @iproute = "\n". $hostname .'>'.'show ip route'. "\n"; @iproute = $conn->cmd('show ip route');
print "\n\n\n". $hostname .'>'.'show logging'. "\n"; print @logging; print "\n\n\n". $hostname .'>'.'show ip route'. "\n"; print @iproute;
print ( LOG "\n\n\n". $hostname .'>'.'show logging'. "\n"); print ( LOG @logging ); print ( LOG "\n\n\n". $hostname .'>'.'show ip route'. "\n"); print ( LOG @iproute );
close LOG; } print "\nログ取得が完了しました。終了するにはEnterキーを押してください。\n"; my $input = <STDIN>;
~~~~
以下、入力に使用したIPアドレスリストです。何の変哲もない、ただIPアドレスだけを書いたテキストファイルです。
ここに書かれた分だけ、while文で繰り返し同じ処理が実行され、ログ出力されるわけです。
~~~~ 192.168.0.1 192.168.0.2
~~~~
以下、出力されたログファイルです。
今回はホスト名がRT-05とRT-06という、Cisco C1921、IOS ver.15.1 の2台で試しました。
ファイル名:RT-05_log.txtの内容
~~~~ RT-05>show logging Syslog logging: enabled (0 messages dropped, 2 messages rate-limited, 0 flushes, 0 overruns, xml disabled, filtering disabled)
No Active Message Discriminator.
No Inactive Message Discriminator.
Console logging: level debugging, 27 messages logged, xml disabled, filtering disabled Monitor logging: level debugging, 0 messages logged, xml disabled, filtering disabled Buffer logging: level debugging, 27 messages logged, xml disabled, filtering disabled Exception Logging: size (4096 bytes) Count and timestamp logging messages: disabled Persistent logging: disabled Trap logging: level informational, 30 message lines logged Logging Source-Interface: VRF Name:
Log Buffer (8192 bytes):
Jan 2 12:00:02.783: %IOS_LICENSE_IMAGE_APPLICATION-6-LICENSE_LEVEL: Module name = c1900 Next reboot level = ipbasek9 and License = ipbasek9 Jan 2 12:00:03.059: %IOS_LICENSE_IMAGE_APPLICATION-6-LICENSE_LEVEL: Module name = c1900 Next reboot level = securityk9 and License = securityk9 Aug 14 03:53:13.111: %IFMGR-7-NO_IFINDEX_FILE: Unable to open nvram:/ifIndex-table No such file or directory Aug 14 03:53:35.411: %VPN_HW-6-INFO_LOC: Crypto engine: onboard 0 State changed to: Initialized Aug 14 03:53:35.415: %VPN_HW-6-INFO_LOC: Crypto engine: onboard 0 State changed to: Enabled Aug 14 03:53:36.111: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to down Aug 14 03:53:36.111: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to down Aug 14 03:53:37.271: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to down Aug 14 03:53:37.271: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to down Aug 14 03:53:37.271: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to down Aug 14 03:53:41.559: %USBFLASH-5-CHANGE: usbflash0 has been inserted! Aug 14 03:53:44.135: %SYS-5-CONFIG_I: Configured from memory by console Aug 14 03:53:45.967: %LINK-5-CHANGED: Interface Embedded-Service-Engine0/0, changed state to administratively down Aug 14 03:53:46.887: %SYS-5-RESTART: System restarted -- Cisco IOS Software, C1900 Software (C1900-UNIVERSALK9-M), Version 15.1(4)M3, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2011 by Cisco Systems, Inc. Compiled Tue 06-Dec-11 16:02 by prod_rel_team Aug 14 03:53:46.891: %SNMP-5-COLDSTART: SNMP agent on host RT-05 is undergoing a cold start Aug 14 03:53:47.519: %LINEPROTO-5-UPDOWN: Line protocol on Interface Embedded-Service-Engine0/0, changed state to down Aug 14 03:53:47.519: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/0, changed state to down Aug 14 03:53:47.519: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/1, changed state to down Aug 14 03:53:47.519: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/2, changed state to down Aug 14 03:53:47.519: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/3, changed state to down Aug 14 03:53:47.523: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is OFF Aug 14 03:53:47.523: %CRYPTO-6-GDOI_ON_OFF: GDOI is OFF Aug 14 03:53:47.523: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is OFF Aug 14 03:53:47.523: %CRYPTO-6-GDOI_ON_OFF: GDOI is OFF Aug 14 03:55:05.119: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up Aug 14 03:55:06.119: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up Aug 14 03:58:28.351: %SYS-5-CONFIG_I: Configured from console by console
RT-05>show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP + - replicated route, % - next hop override
Gateway of last resort is not set
192.168.50.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.50.0/24 is directly connected, GigabitEthernet0/1 L 192.168.50.2/32 is directly connected, GigabitEthernet0/1
~~~~
ファイル名:RT-06_log.txtの内容
~~~~ RT-06>show logging Syslog logging: enabled (0 messages dropped, 2 messages rate-limited, 0 flushes, 0 overruns, xml disabled, filtering disabled)
No Active Message Discriminator.
No Inactive Message Discriminator.
Console logging: level debugging, 23 messages logged, xml disabled, filtering disabled Monitor logging: level debugging, 0 messages logged, xml disabled, filtering disabled Buffer logging: level debugging, 23 messages logged, xml disabled, filtering disabled Exception Logging: size (4096 bytes) Count and timestamp logging messages: disabled Persistent logging: disabled Trap logging: level informational, 26 message lines logged Logging Source-Interface: VRF Name:
Log Buffer (8192 bytes):
Jan 2 12:00:02.599: %IOS_LICENSE_IMAGE_APPLICATION-6-LICENSE_LEVEL: Module name = c1900 Next reboot level = ipbasek9 and License = ipbasek9 Aug 14 04:01:41.111: %IFMGR-7-NO_IFINDEX_FILE: Unable to open nvram:/ifIndex-table No such file or directory Aug 14 04:01:56.071: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to down Aug 14 04:01:56.071: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to down Aug 14 04:01:57.043: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to down Aug 14 04:01:57.071: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to down Aug 14 04:01:57.071: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to down Aug 14 04:02:01.267: %USBFLASH-5-CHANGE: usbflash0 has been inserted! Aug 14 04:02:03.607: %SYS-5-CONFIG_I: Configured from memory by console Aug 14 04:02:05.507: %LINK-5-CHANGED: Interface Embedded-Service-Engine0/0, changed state to administratively down Aug 14 04:02:06.543: %LINEPROTO-5-UPDOWN: Line protocol on Interface Embedded-Service-Engine0/0, changed state to down Aug 14 04:02:06.695: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/0, changed state to down Aug 14 04:02:06.695: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/1, changed state to down Aug 14 04:02:06.695: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/2, changed state to down Aug 14 04:02:06.695: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0/3, changed state to down Aug 14 04:02:07.647: %SYS-5-RESTART: System restarted -- Cisco IOS Software, C1900 Software (C1900-UNIVERSALK9-M), Version 15.1(4)M6, RELEASE SOFTWARE (fc2) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2013 by Cisco Systems, Inc. Compiled Thu 14-Feb-13 03:50 by prod_rel_team Aug 14 04:02:07.839: %SNMP-5-COLDSTART: SNMP agent on host RT-06 is undergoing a cold start Aug 14 04:02:13.079: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up Aug 14 04:02:14.079: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up Aug 14 04:02:16.071: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to down Aug 14 04:02:17.071: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to down Aug 14 04:03:12.071: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up Aug 14 04:03:13.071: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up
RT-06>show ip route Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP + - replicated route, % - next hop override
Gateway of last resort is not set
192.168.50.0/24 is variably subnetted, 2 subnets, 2 masks C 192.168.50.0/24 is directly connected, GigabitEthernet0/1 L 192.168.50.1/32 is directly connected, GigabitEthernet0/1
~~~~
今回のはCisco用モジュールのcmdメソッドの()内にコマンドを直書きしちゃってますが、できればこれも外出しして、コマンドリストをテキストファイルから読み込むようにしたいところ。汎用化できますからね。
ではまた。