2015年1月28日水曜日

telnetlibを使って対象機器を一行づつ処理してみる

■目的
 pythonを勉強中
基本的にはネットワークエンジニアなのでネットワーク機器の操作を中心に学習していく。
前回NW装置にtelnetしてコマンド結果をファイルに保存するところまで出来た。
今回は複数ホストを記載した別ファイルから一行づつ読み込んで実行出来るようにしてみる

■参考にさせて頂いたサイト&本
・みんなのpython
・http://www.yukun.info/blog/2008/06/python-file.html

■スクリプト
参考URLを見て別ファイルを開いて一行づつ読み込んだホストを、読み込んだ行数同じ処理させるループ処理に
前回作成したtelnetのスクリプトを入れてみる。

test.txt
192.168.1.1
192.168.1.2
192.168.1.3

arista2.py
#!/usr/bin/python

import telnetlib
import datetime

now = datetime.datetime.now()

username = "arista" # the username
password = "arista"
filename_prefix = "arista-backup"

f = open('test.txt')

line = f.readline()

while line:
        host = line.rstrip()
        print host
        tn = telnetlib.Telnet(host)
        tn.read_until("Username:")
        tn.write(username+"\n")
        tn.read_until("Password:")
        tn.write(password+"\n")
        tn.write("terminal length 0"+"\n")
        tn.write("enable"+"\n")
        tn.write("sh run"+"\n")
        tn.write("sh version"+"\n")
        tn.write("exit"+"\n")
        output=tn.read_all()

        filename = "%s_%.2i-%.2i-%i_%.2i-%.2i-%.2i" % (filename_prefix,now.day,now.month,now.year,now.hour,now.minute,now.second)
        print filename

        fp=open(filename,"w")
        fp.write(output)
        line = f.readline()
        fp.close()

f.close

#python arista2.py
で実行する。

①ちょっとハマった点はwhile内にある line.rstrip()の「.rstrip()」を付けないと改行まで繰り返されてしまい
うまく動かないようだ。#私の同僚がこれで解決してくれました。
②また上記を動かすとなぜか一つのファイル内に対象ホストの結果が全て書かれる。
filenameで秒まで指定しているのでファイル毎に保存してくれると思ったがうまく動かない。
filenameの次「print filename」でどのように処理されるか見てみたところなぜか時分秒が表示されない。

■終わり
 同僚のプログラマーが①の問題の解決の仕方を教えてくれた。
まずは切り分けとして以下のようなファイルで正常に別ファイルのIPが一つづつ処理されるかを
確認するやり方を教えてくれた。

arista-test.py
#!/usr/bin/python

import telnetlib
import datetime

now = datetime.datetime.now()

username = "arista" # the username
password = "arista"
filename_prefix = "arista-backup"

f = open('test.txt')
line = f.readline()

while line:
        host = line.rstrip()
        print host
        #print "\n"

        line = f.readline()

f.close()

while内でのhostに入るIPに、rstrip()を付けないと改行まで入っていることを確認できる。
このように一つづつ切り分けて行くことを学んだ。

私の体験が誰かの生産性向上に役立っていただけることを祈って

0 件のコメント:

コメントを投稿