pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

ネットワークスイッチコンフィグジェネレート

知り合いとスイッチのコンフィグ作りとかその確認てめんどくさいよね、そうですね、というような話になり、スクリプトとかかね、といっても、いちいちスクリプトのファイルに設定値書き込むのかね、とかライブラリ覚えたりとかスクリプト勉強したくないよね、ということに。

そして、そのとき話に出たのは、絶対に設定値パラメータシート埋めてから設定コンフィグ作って、流し込んでやってるけど、毎回繰り返しだよね、単純ゆえにミスるよねと。まぁ、そこが楽になれば難しいことや凝ったことしなくて良いよね、と。

じゃぁ、Excelで作ってるパラメータシートで毎回同じような設定入れるところをそのままExcel上でジェネレートすれば良いじゃないという方向。

例えば、下記のようなものは単純。ホスト名の設定

A B
1 項目
2 hostname L3SW-01

下記のように文字列をつなげるだけ。ここでは便宜的にC列に式を、D列に結果を書いています。

A B C D
2 hostname L3SW-01 =B5&" "&C5 hostname L3SW-01



では、条件分岐が出る部分はどうするのか、という話になります。例えば、インタフェース設定。モードがaccessかtrunkかで、関連して必要となるコマンドが変わってくる。特にciscoを意図しているわけではないけれども、例えば下記のようなスイッチに関する設定表だったとする。

A B C D
1 インタフェース 番号 タイプ VLAN
2 fastethernet 0/0 access 100
3 fastethernet 0/1 trunk 100,200,300
4 fastethernet 0/2 150

IFの分岐と、COUNTIFによる文字列の確認を利用する。長くなるので下に記します。上記の表でいうと、2行目のfa0/0のところに対応しています。これをひとつのセルの中に記述。

="interface "&A2&" "&B2&CHAR(10)&
IF(COUNTIF(C2,"access")," switchport mode access"&CHAR(10)&"switchport access vlan "&D2,
IF(COUNTIF(C2,"trunk")," switchport trunk encapsulation dot1q"&CHAR(10)&" 
switchport mode trunk"&CHAR(10)
&" switchport trunk allowed vlan "&D2,"
"インタフェースタイプ指定しましょう"))

ぐちゃぐちゃに見えるけれども、単にIF関数と、COUNTIF関数を使っている(もし指定のセルにaccessという文字があれば○○、accessが無く、trunkという文字があれば△△)。ところどころにはさまっているCHAR(10)というのは、改行コードで、同一セル内で改行させることができる。結果は、下記のようになる。例えば、先ほどのインタフェース表中、E列の最初の行にだけ書いて、あとはセルのはしっこをドラッグして下のほうのセルまでオートフィルすれば良いです。

E
interface fastethernet 0/0
switchport mode access
switchport access vlan 100"
interface fastethernet 0/1
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 100,200,300
interface fastethernet 0/2
インタフェースタイプ指定しましょう

ただし、ここで使っている式では、出力にセル内改行を含んでいるため、実際生成されたコマンドであるセルの内容を、例えばテキストエディタにでもコピペすると、下記のようにダブルクォテーションを含んでペーストされてしまう。

"interface fastethernet 0/0
 switchport mode access
 switchport access vlan 100"

Excelでのダブルクォテーションの発生を避けるためには、あらかじめ1セル1行のコマンドとするか、あるいは割り切ってテキストエディタにコピペした後一括でダブルクォテーションを削る。

作業テンプレ化しておけば、Aという設定にBという別機能の設定が必須だが忘れてしまった、ということも避けやすい、かも