• トップ
  • ブログ一覧
  • シスコルータのコンフィグ作成を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...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background