Expectで定型業務を自動化しよう!


Expectで定型業務を自動化しよう!

ネットワークを管理している方、ルータを数百台レベルで運用している
なんて方も中にはいるでしょう。

ネットワークが大きくなればなるほど大変になるのが、日々の運用業務。

   「管理している全ルータに設定を追加しなくちゃ!!」
    「定期的にルータのバックアップを取得しなきゃ!!」
    「あ~めんどくせぇ!!一体ルータ何台あんだよぅ!!」

なんとか簡単に作業を行えないだろうか?
そんな欲望をお持ちになった方も多いことでしょう。

今回はそんな日々の運用を少しでも楽になれるような、手法を簡単にご紹介
したいと思います。
あくまで私の知識内でのことですので、「もっと簡単にできるぜいっ」とい
う方。

ぜひとも私に教えてください(笑)

 

定型業務を自動化

先に上げた例のように、

  • 全ルータに同じ設定を投入する
  • ルータのバックアップを取得する

といった定例操作は「自動化出来る場合が非常に多い」です。

つまり人が各ルータにtelnetして、設定モードに移行して、設定を投入して、
コンフィグをコピーして…

そんな定型化した操作をすべてコンピュータにお任せしちゃおうってわけで
すね。

今回はこの自動化のためのツールとして非常にポピュラーな「Expect」とい
う言語を紹介します。

「んっ?言語?」

なんてちょっと尻込みした方。

そうなんです、今回ご紹介する方法を実践するには、最低以下のスキルが必
要になります。

 UNIXの操作(基本操作とシェル操作が出来る程度のスキル)

ネットワークの勉強をしている方にとっては、もしかしたらちょっと苦手…
なんて方もいるかもしれませんね。
でもネットワーク屋さんにとって、UNIXとは切っても切れない関係。

今後キャリアを積むにつれて必ず勉強しなくちゃいけないはずです。
これを機会にちょっと背伸びして勉強してみてはいかがですか?

ここではUNIXに関してはある程度操作できることを前提に、「Expect」に関
するのみ、説明しています。
UNIXに関するコマンドや操作説明、Expectのインストール方法やコマンド解
説などについては省略していますのでご了承下さいませ。

対話的な言語です。

さてこの「Expect」という言語が、他の言語と異なることとして、
「対話的」なことが上げられます。

対話的とはつまり、

 サーバ「ルータにtelnetします」
  ルータ「パスワードはなんですか?」
  サーバ「パスワードは aaaa です。」
  ルータ「OK。ログイン成功です。」

こんな感じで、文字通りお互いが「受け答え」をしながら実行されていく言
語なのです。

この「受け答え」を、一つずつプログラムしてやればよいわけですね。

 

それでは早速やってみよう。

それでは今回は、CiscoのCatalyst2950へtelnetして、設定を保存して、
ログアウトするプログラムを作ってみましょう。

まず、通常のtelnetコマンドでCatalyst2950へtelnetし、ログアウトするま
での処理を見てみましょう。

実行結果は以下のようになりますね。

--------------------------------
#telnet 10.1.1.1      #Catalyst2950へtelnet

User Access Verification

Password:aaa        #ログインパスワードaaaを入力
switch>enable        #特権モードへ移行
Password:bbb        #特権パスワードbbbを入力
switch#show run       #show runコマンドを実行
switch#exit         #特権モードから抜ける
switch>exit         #ログアウト処理
Connection closed by foreign host.
#
--------------------------------

では上記作業をExpectで記述してみましょう。
--------------------------------
#!/usr/local/bin/expect -f   #使用する言語の宣言をする
               (パスは環境によって変わります。)

set timeout 10         #10秒間応答がなければ終了させる
spawn telnet 10.1.1.1     #expectコマンド内でtelnetを実行
expect "Password: "       #Password: 文字列が帰ってきたら
send -- "aaa\n"        #ログインパスワードaaaを入力
expect ">"           #">"文字列が帰ってきたら
send -- "enable\n"       #特権モードへ移行
expect "Password: "      #Password: 文字列が帰ってきたら
send -- "bbb\n"        #特権パスワードbbbを入力
expect "#"           #"#"文字列が帰ってきたら
send -- "terminal length 0\n" #terminal length 0を実行
expect "#"          #"#"文字列が帰ってきたら
send "show run\n"       #show runコマンドを実行
expect "#"          #"#"文字列が帰ってきたら
send -- "exit\n"        #ログアウト処理
expect eof           #expectの終了
--------------------------------

上記を記述したファイルを作成して、そのファイルを実行させれば自動でロ
グインして、該当のコマンドを実行して、telnetを終了してくれます。

もちろん、この帰ってくる文字列によって実行するコマンドを変えるなんて
こともできますし、実行するコマンド部分を設定コマンドに変えれば、自動
で設定もしてくれます。

これが対話的な言語の良いところですね。

どうでしょう?
難しいでしょうか?

このスクリプトを使用して、複数の機器のログを取りたい場合はどうしたら
いいでしょう?

機器ごとに変わる部分は、

  • telnet先のIPアドレス
  • ログインパスワード
  • 特権パスワード

の3つだけですよね。

この3つの変数を別ファイルに記述しておいて、そのファイルから変数を読
み込むようにしてしまえば、一気に処理できます。
数百台のルータのバックアップなんて「あっという間」ですね。

というわけで、かなり端折って説明してきましたが、今まで定期的に手作業
で設定のバックアップしてきたなんて方にとっては、ぜひともおすすめです。


関連記事

メールマガジン

ネットワ-ク初心者のみなさま。
ネットワークの基礎知識を疎かにすることは
大変危険です!!

「初心者にも理解できるネットワーク技術」

これを読めばネットワークの基礎が分かる!!
ネットワーク関連の仕事に就きたいとお考えの学生の方や、ネットワークに興味があって転職を考えている社会人の方、まずは登録してみてください。

もちろん無料です!!

↓メールマガジン購読はこちら↓

メールアドレス: