このページの概要
前回の「ネットワーク機器の管理の自動化1」で紹介したPythonスクリプトの詳細について書いていきます。
スクリプトの中身
ネットワーク機器の情報を取得する方法としてAPIを使わずテキスト検索をしています。具体的には以下の方法で情報を取得します。
①ログファイルのテキストをリストに変換します。
②リスト内で空欄の値をすべて削除します。
③enumerate関数を使って取得したい値に関連するキーワードのインデックスのリストを作成します。
④同じキーワードが複数のshowコマンドの出力結果で使用されている可能性があります。キーワードのインデックスのリストの値をfor文で1つずつ検索し、その値の前後の値も確認して本当に該当するキーワードかどうか確認します。
⑤該当していれば、関連するキーワードの前後にある取得したい値を取得します。
具体的な例としてIPアドレス情報を取得したい場合、以下のような「show run」のインターフェース設定から取得します。
interface Loopback0
ip address 3.3.3.3 255.255.255.255
!
interface FastEthernet4/0
description to_CORE01_Fa3_0
ip address 192.168.1.2 255.255.255.0
ip ospf network point-to-point
duplex full
speed auto
手順①によって"interface", "Loopback0", "ip", "address", "3.3.3.3","255.255.255.255","!","interface","FastEthernet4/0","description"...のような階層のないリストに変換します。
手順③のenumerate関数では例えば「interface」をキーワードにインデックスのリストを作成します。「interface」というキーワードはログ内で別のshowコマンドの出力でも使用されているかもしれません。そのため本当に「show run」のインターフェースの箇所のものかどうか確認するため、「interface」のインデックスに+1した値が「Loopback◯」や「FastEthernet◯/◯」になっていることをチェックします。なっていたらfor文で1個ずつインデックスを足していき「ip」とそれに続く「address」が出てきたら、「address」の次の値はIPアドレス、その次の値はサブネットマスクというように値を取得できます。
この方法でその他の情報も取得できます。よく問題になるのは機器側の設定のデスクリプションに「to CORE01 FastEthernet0/0」のように設定していると、手順①でファイルをリスト化した際にスペースをデリミタとして「to」、「CORE01」、「FastEthernet0/0」という値に分けられ「FastEthernet0/0」がshowコマンドの結果と判別できず、正しくデスクリプションの値を取得できないことがあります。機器側の設定を「to_CORE01_FastEthernet0/0」のようにアンダースコアでつなげて1つの値となるようにしておけば問題になりません。
APIを使わない理由
なぜAPIを使わなかったかと思うかもしれません。もともとこのスクリプトはAPIアクセスが許可されていない環境で作成したものでした。APIを使用しないので、作りこめば同じ方法で異なるメーカーや型番の機器でも対応できます。APIをサポートしていない機器や導入時点でコンソールアクセスしかできない場合などでもログさえ取得できれば利用できます。問題としてはメーカーや型番の違いによってshowコマンドの値の表示が異なるものはスクリプト側で作りこむ必要があることでしょう。
その他
エクセルへの書き込みにはopenpyxlライブラリを使用しました。xlsxライブラリと比較するとopenpyxlの方がずっといいです。
xlsxは「.xls」ファイルに対応していますが「.xlsx」ファイルには対応しません。またxlsxではエクセルのフィルタを設定できません。