シスコルータのコンフィグ作成をPythonで自動化してみた!
IT技術
シスコルータのコンフィグ作成をPythonで自動化してみよう!
シスコルータのコンフィグ作成を、「仕事で任された!」という方も、中にはいるかもしれません。
ざっくり言ってしまえば、コンフィグ内容は、主にポートと VLAN の「追加・削除」となります。
過去のコンフィグを、コピぺして編集するのも良いと思います。
ですが、よく出てくる案件なので、できる限り自動化を目指したいですよね?
そこで今回は、ルーターの VLAN 追加のコンフィグ作成を、Python を使って自動化してみたいと思います!
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
実行環境
今回は、以下のような環境で、シスコルータのコンフィグ作成を自動化していきます。
- OS : Mac OS X 10.15.6
- Ciscoシミュレータ : Packet Tracer 7.3
- Pythonバージョン : 3.8.6
では早速、はじめていきましょう!
既存ネットワークを構築する
既存ネットワークとして、以下のようなネットワークを構成します。
PC0 は VLAN10 、PC1 は VLAN20 と分かれており、Router1 と Switch は、トランクリンクで接続されています。
PC0の設定
PC0 の設定は、次の通りです。
- IP : 192.168.0.1/24
- DG : 192.168.0.254
PC1の設定
PC1 の設定は、次のようにしています。
- IP : 192.168.1.1/24
- DG : 192.168.1.254
Switch1の設定(コンフィグ)
以下のコンフィグを、テキストファイルに貼り付けて、Switch1 に投入していきます。
1!
2hostname Switch1
3!
4interface FastEthernet0/1
5 switchport access vlan 10
6 switchport mode access
7!
8interface FastEthernet0/2
9 switchport access vlan 20
10 switchport mode access
11!
12interface FastEthernet0/3
13 switchport access vlan 30
14 switchport mode access
15!
16interface FastEthernet0/4
17 switchport access vlan 40
18 switchport mode access
19!
20interface GigabitEthernet0/1
21 switchport trunk native vlan 100
22 switchport mode trunk
23 switchport nonegotiate
24!
Router1の設定(コンフィグ)
次に、以下のコンフィグもテキストファイルに貼り付けて、Router1に投入しておきましょう。
1!
2hostname Router1
3!
4interface GigabitEthernet0/0/0.10
5 encapsulation dot1Q 10
6 ip address 192.168.0.254 255.255.255.0
7!
8interface GigabitEthernet0/0/0.20
9 encapsulation dot1Q 20
10 ip address 192.168.1.254 255.255.255.0
11!
12interface GigabitEthernet0/0/0.100
13 encapsulation dot1Q 100 native
14 ip address 192.168.100.254 255.255.255.0
15!
疎通確認
ここまでで、PC0 から PC1 に、ping が通るか確認してみましょう!
以下のような、コマンドを叩いて、確認してみてください。
1C:\>ping 192.168.1.1
2
3Pinging 192.168.1.1 with 32 bytes of data:
4
5Reply from 192.168.1.1: bytes=32 time<1ms TTL=127
6Reply from 192.168.1.1: bytes=32 time=1ms TTL=127
7Reply from 192.168.1.1: bytes=32 time<1ms TTL=127
8Reply from 192.168.1.1: bytes=32 time<1ms TTL=127
9
10Ping statistics for 192.168.1.1:
11 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
12Approximate round trip times in milli-seconds:
13 Minimum = 0ms, Maximum = 1ms, Average = 0ms
通りましたね!
変更後ネットワーク
新たに、PC2 と PC3 の2台の PC が、Switch1 に接続されました。
PC2 と PC3 が接続する Switch1 のポートには、それぞれ「VLAN30」「VLAN40」が設定されています。
PC2の設定
PC2 の設定は、次の通りです。
- IP : 192.168.2.1/24
- DG : 192.168.2.254
PC3の設定
PC3 の設定は、以下のようになっています。
- IP : 192.168.3.1/24
- DG : 192.168.3.254
疎通確認
PC0 から、PC2 と PC3 に ping を打ってみます。
1C:\>ping 192.168.2.1
2
3Pinging 192.168.2.1 with 32 bytes of data:
4
5Reply from 192.168.0.254: Destination host unreachable.
6Reply from 192.168.0.254: Destination host unreachable.
7Reply from 192.168.0.254: Destination host unreachable.
8Request timed out.
9
10Ping statistics for 192.168.2.1:
11 Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
12
13C:\>ping 192.168.3.1
14
15Pinging 192.168.3.1 with 32 bytes of data:
16
17Reply from 192.168.0.254: Destination host unreachable.
18Reply from 192.168.0.254: Destination host unreachable.
19Reply from 192.168.0.254: Destination host unreachable.
20Reply from 192.168.0.254: Destination host unreachable.
21
22Ping statistics for 192.168.3.1:
23 Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
24
25C:\>
ですが現状では、期待通りに通信ができませんね…。
これは、ルータのトランクリンクに、VLAN の追加をしていないためです。
シスコルータのコンフィグを自動作成
ここでは、Router1 に「VLAN30」「VLAN40」を追加するコンフィグを、Python を使って作成してみます。
順に進めていきましょう!
template.txtにテンプレートを作成する
まず template.txt に、以下のようなテンプレートを作成します。
1!
2interface GigabitEthernet$port.$vlan
3 $no encapsulation dot1Q $vlan
4 $no ip address $ip
5!
「$変数名」の部分が、パラメータと置き換えられ、コンフィグが作成されます。
param.json にパラメータを定義する
param.json とした json ファイルに、パラメータを定義しましょう。
先ほど作成した、template.txt の変数部分が、以下のパラメータに置き換えられます。
1[
2 {
3 "host":"Router1",
4 "ip":"192.168.2.254/24",
5 "vlan":"30",
6 "port":"0/0/0",
7 "no":""
8 },
9 {
10 "host":"Router1",
11 "ip":"192.168.3.254/24",
12 "vlan":"40",
13 "port":"0/0/0",
14 "no":""
15 }
16]
generate_route_config.py に、以下のような処理を記述して、シスコルータのコンフィグを自動作成していきましょう。
1#!/usr/bin/python3
2from string import Template
3import json
4import ipaddress
5
6# jsonを読み込む
7with open('./param.json', "r") as f:
8 json_ary = json.load(f)
9# テンプレートを読み込む
10with open('./template.txt', "r") as f:
11 tmpl = Template(f.read())
12# 設定するVLANの数だけループ
13for json_data in json_ary:
14 # ipアドレス情報を扱うオブジェクトを設定
15 ip_obj = ipaddress.ip_interface(json_data['ip'])
16 # テンプレート内の変数を該当のパラメータに置換する
17 config = tmpl.substitute(
18 json_data,
19 # IPアドレスとサブネットマスクを設定
20 ip = ip_obj.with_netmask.replace('/', ' '),
21 # VLANを設定
22 vlan = json_data['vlan'],
23 # PORTを設定
24 port = json_data['port'],
25 # パラメータにnoを設定することで設定削除が可能。(今回は追加のため空白)
26 no = json_data['no']
27 )
28 # ホスト名でファイルを書き込む
29 with open(json_data['host'] + '.txt', "a") as f:
30 f.write(config)
まず、パラメータが定義された json ファイルを読み込む処理が記述されています。
その後は、テンプレートの変数部分を置換し、コンフィグを自動作成する処理です。
詳しくは、中のコードを追いながら、確認してみてくださいね!
実行後コンフィグパッチ
generate_route_config.py と同じ場所に、param.json と template.txt を配置し実行します。
1$ ls
2generate_route_config.py param.json template.txt
3$ python generate_route_config.py
4$ ls
5Router1.txt param.json
6generate_route_config.py template.txt
すると、Router1.txt が作成されたかと思います。
1!
2interface GigabitEthernet0/0/0.30
3 encapsulation dot1Q 30
4 ip address 192.168.2.254 255.255.255.0
5!
6!
7interface GigabitEthernet0/0/0.40
8 encapsulation dot1Q 40
9 ip address 192.168.3.254 255.255.255.0
10!
コンフィグを投入して疎通確認
作成された Router1.txt を、Router1 に投入していきましょう。
すると、以下のように「VLAN30」「VLAN40」の設定が追加されるはずです。
1!
2interface GigabitEthernet0/0/0.10
3 encapsulation dot1Q 10
4 ip address 192.168.0.254 255.255.255.0
5!
6interface GigabitEthernet0/0/0.20
7 encapsulation dot1Q 20
8 ip address 192.168.1.254 255.255.255.0
9!
10interface GigabitEthernet0/0/0.30
11 encapsulation dot1Q 30
12 ip address 192.168.2.254 255.255.255.0
13!
14interface GigabitEthernet0/0/0.40
15 encapsulation dot1Q 40
16 ip address 192.168.3.254 255.255.255.0
17!
18interface GigabitEthernet0/0/0.100
19 encapsulation dot1Q 100 native
20 ip address 192.168.100.254 255.255.255.0
21!
疎通確認
最後に、以下のようにコマンドを叩いて、ping が通るか確認してみましょう。
1C:\>ping 192.168.2.1
2
3Pinging 192.168.2.1 with 32 bytes of data:
4
5Reply from 192.168.2.1: bytes=32 time=1ms TTL=127
6Reply from 192.168.2.1: bytes=32 time<1ms TTL=127
7Reply from 192.168.2.1: bytes=32 time<1ms TTL=127
8Reply from 192.168.2.1: bytes=32 time=1ms TTL=127
9
10Ping statistics for 192.168.2.1:
11 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
12Approximate round trip times in milli-seconds:
13 Minimum = 0ms, Maximum = 1ms, Average = 0ms
14
15C:\>ping 192.168.3.1
16
17Pinging 192.168.3.1 with 32 bytes of data:
18
19Reply from 192.168.3.1: bytes=32 time=32ms TTL=127
20Reply from 192.168.3.1: bytes=32 time<1ms TTL=127
21Reply from 192.168.3.1: bytes=32 time<1ms TTL=127
22Reply from 192.168.3.1: bytes=32 time=1ms TTL=127
23
24Ping statistics for 192.168.3.1:
25 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
26Approximate round trip times in milli-seconds:
27 Minimum = 0ms, Maximum = 32ms, Average = 8ms
PC0 から PC2 と PC3 に、ping が通ることが確認できましたね!
さいごに
今回は、VLAN 追加のコンフィグを、Python で作成しました。
ただ、実際の現場では、もっと設定項目が多いものです。
だからこそ、煩雑なコンフィグ作成を自動化することは、とても効率が上がるわけですね!
豊富なライブラリのある Python を使えば、あらゆる業務を自動化できます。
随所で工夫をして、ぜひ業務の生産性を高めていってくださいね!
記事を書いた人
システム開発依頼・お見積もりはこちらまでお願いします。
また、WEB・スマホ系エンジニアを積極採用中です!
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit