• トップ
  • ブログ一覧
  • シスコルータのコンフィグ作成をPythonで自動化してみた!
  • シスコルータのコンフィグ作成をPythonで自動化してみた!

    広告メディア事業部広告メディア事業部
    2021.03.01

    IT技術

    シスコルータのコンフィグ作成をPythonで自動化してみよう!

    シスコルータのコンフィグ作成を、「仕事で任された!」という方も、中にはいるかもしれません。

    ざっくり言ってしまえば、コンフィグ内容は、主にポートと VLAN の「追加・削除」となります。

    過去のコンフィグを、コピぺして編集するのも良いと思います。

    ですが、よく出てくる案件なので、できる限り自動化を目指したいですよね?

    そこで今回は、ルーターの VLAN 追加のコンフィグ作成を、Python を使って自動化してみたいと思います!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    実行環境

    今回は、以下のような環境で、シスコルータのコンフィグ作成を自動化していきます。

    1. OS : Mac OS X 10.15.6
    2. Ciscoシミュレータ : Packet Tracer 7.3
    3. Pythonバージョン : 3.8.6

    では早速、はじめていきましょう!

    既存ネットワークを構築する

    既存ネットワークとして、以下のようなネットワークを構成します。

    PC0 は VLAN10 、PC1 は VLAN20 と分かれており、Router1 と Switch は、トランクリンクで接続されています。

    既存ネットワークを構築する

    PC0の設定

    PC0 の設定は、次の通りです。

    1. IP : 192.168.0.1/24
    2. DG : 192.168.0.254

    PC1の設定

    PC1 の設定は、次のようにしています。

    1. IP : 192.168.1.1/24
    2. 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 の設定は、次の通りです。

    1. IP : 192.168.2.1/24
    2. DG : 192.168.2.254

    PC3の設定

    PC3 の設定は、以下のようになっています。

    1. IP : 192.168.3.1/24
    2. 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

    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 を使えば、あらゆる業務を自動化できます。

    随所で工夫をして、ぜひ業務の生産性を高めていってくださいね!

    記事を書いた人

    \ 3度のメシより技術が好き /
    (株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
    システム開発依頼・お見積もりはこちらまでお願いします。
    また、WEB・スマホ系エンジニアを積極採用中です!
    ※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事