ネットワーク機器のコンフィグバックアップを自動化

ネットワーク機器のコンフィグバックアップをよく忘れちゃうよ!!!
という人のためにスクリプトで自動化する方法を軽くまとめてみました。

Telnetで繋がる機器

みんな大好きexpectの出番ですね!
expect系の記事はいっぱいあると思うので、今回はPerlモジュールを使う方法を紹介します。


まずはD社のPowerConnectのバックアップを取得するスクリプト
Net::Telnetでがんばればたいていなんとかできちゃいますが、けっこうたいへんです。

#!/usr/bin/perl
use strict;
use warnings;

use Net::Telnet;
#$Net::Telnet::DEBUG = 1;

# プロンプト文字列の定義
my $prompt = '/User:$|Password:$|.*[>#]$|--More--/';

@ARGV ==3 or die "$0 host user pass";
my ($host, $user, $pass) = @ARGV;

my $t = new Net::Telnet(Prompt => $prompt);

$t->open($host);

# ログインする。ログインパスワードあり、enableパスワードなしの場合
$t->cmd($user);
$t->cmd($pass);
$t->cmd("enable");

# running-configを取得
my @result = $t->cmd("show running-config");
while($t->last_prompt =~ /--More--/){
  push @result ,$t->cmd(String => " ", Output_record_separator => "");
}

$t->close;


print grep !/^\s*$/,@result;
$ sudo cpan Net::Telnet
$ perl backup.pl 192.168.1.1 nwadmin nwpass


Ciscoとか有名どころは専用のCPANモジュールがあってもっと簡単にできたりするので探してみましょう。

#!/usr/bin/perl
use strict;
use warnings;

use Net::Telnet::Cisco;

my $hostname = "sw1";
my $loginPass = "cisco";
my $enablePass = "cisco";

my $session = Net::Telnet::Cisco->new(Host => $hostname);
$session->login(Password => $loginPass);

if ($session->enable($enablePass)) {
    print $session->cmd("show running-config");
} else {
    warn "Can’t enable: " . $session->errmsg;
}

$session->close;
$ sudo cpan Net::Telnet::Cisco
$ perl cisco_backup.pl

Juniper NetScreen,SSG

OSのバージョンにも依存しそうですが、手近にあったSSGだと以下の手順でいけました。


ssh鍵をDSAで作る

[mikeda@admin01 ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/mikeda/.ssh/id_dsa): /home/mikeda/.ssh/id_dsa_ns
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...
[mikeda@admin01 ~]$ cat ~/.ssh/id_dsa_ns.pub
ssh-dss AAAAB3NzaSp08.....XUMnNZ8hjys= mikeda@admin01

ネットワーク機器にログインしてSSH関連設定

set ssh version v2
set ssh enable
set scp enable
set ssh pka-dsa user-name admin key AAAAB3NzaSp08.....XUMnNZ8hjys=
save

これでパスワードなしでscpでバックアップが取れます

[mikeda@admin01 ~]$ scp -i ~/.ssh/id_dsa_ns admin@192.168.1.1:ns_sys_config .

取得できるのはフラッシュに保存済みのコンフィグなので、設定変更後の「save」は死んでも忘れないように!

YAMAHA RTX

RTX1200で確認したところSNMPでコンフィグが取得できるという鬼仕様なので、
ルータに設定入れて

snmp host 192.168.1.10 xxxyyyzzz

snmpwalkしてやればOKです・・・

[mikeda@cent ~]$ yum install net-snmp-utils
[mikeda@cent ~]$ snmpwalk -v1 -cxxxyyyzzz 192.168.1.1 .1.3.6.1.4.1.1182.2.2.10.1.2 | tr -d '\r' | sed -n 's/^.*STRING: "//p'
...
login password *
administrator password *
login user mikeda *
console lines infinity
console prompt rt01
login timer 1000
...

Vyatta

だいじょうぶ、こいつはただのDebianです。

サーバと同じように鍵を通してやればパスなしでscpできるようになります

[mikeda@admin01 ~]$ ssh-keygen
Enterオラオラ
[mikeda@admin01 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub vyatta@192.168.1.1
[mikeda@admin01 ~]$ scp vyatta@192.168.1.1:/config/config.boot config.boot.20120705

リストアはバックアップをscpしてやって

[mikeda@admin01 ~]$ scp config.boot.20120705 vyatta@192.168.1.1:/config/config.boot.20120705

Vyatta側でloadしてやればOKです

vyatta@vyatta01:~$ configure 
vyatta@vyatta01# load /opt/vyatta/etc/config/config.boot.20120705
Loading configuration from '/config/config.boot.20120705'...

Load complete.  Use 'commit' to make changes active.
vyatta@vyatta01# commit
vyatta@vyatta01# save

まとめ

バックアップめんどくさいしよく忘れちゃうよ(*´Д`)ハァハァ、という人がいればぜひ自動化してみましょう。
他の機器とかも触る機会があったら追記していきます。