業務を便利にしたいが微妙だったスクリプト

ネットワーク

久しぶりの更新。

社会人になって5ヶ月が経過して少し慣れがでてきたところで、
自分的にあったら便利だなーっていうツールを作る時間があったので作ってみました。
といっても、プログラミングスキルがあまりないのでバグがあったりセキュリティまで考慮できていなかったりします。
あくまで、個人の環境でちょこっと使うと便利かもっていうスクリプトです。

今回作ったのは下の2つ

Seisei.py

困りごと1
パラメータファイル(CSVやJSON)からConfigを一括生成したい。

100台の機器のConfigを作るとして、IPアドレスやホスト名、descriptionなどがそれぞれ異なるとします。
これを1台ずつ設定を書くのはめんどくさい。そんなときにテンプレートエンジンのJinjaなんかを使えば簡単に生成できます。

ので自分はそういった場面が必要になるたびにスクリプトを書いてました。
パラメータが間違ってたり変更したりでそのたびに生成してファイルどれだっけーってなってるので
一元管理をできるようにしたかったので、作りました。機能は単純でただJinjaを使っているだけです。

機能
  • パラメータファイルとテンプレートファイルを引数指定して一括生成
  • 同じファイル名で生成すると自動的に古いファイルがBackupディレクトリに移動
  • テンプレートの中身をパラメータの数だけLoopして追記するモード
  • パラメータの中にfilenameというカラムを用意してあげるとその名前で保存してくれる

上のようにシンプルな機能です。

使用例

以下のようなパラメータのコンフィグを作りたいとする。

HostnameInterfaceIPMaskdescription
RT01Gi0/1192.168.1.1255.255.255.0to RT02
RT01Gi0/2192.168.2.1255.255.255.0to Server
RT02Gi0/1192.168.1.2255.255.255.0to RT01
RT02Gi0/2192.168.3.1255.255.255.0to Server

これをパラメータとしてJsonとして読み込みます。

[
    {
        "filename": "RT01.conf",
        "hostname": "RT01",
        "interface": [
            {
                "name": "Gi0/1",
                "ip": "192.168.1.1",
                "subnetmask": "255.255.255.0",
                "description": "to RT02"
            },
            {
                "name": "Gi0/2",
                "ip": "192.168.2.1",
                "subnetmask": "255.255.255.0",
                "description": "to Server"
            }
        ]
    },
    {
        "filename": "RT02.conf",
        "hostname": "RT02",
        "interface": [
            {
                "name": "Gi0/1",
                "ip": "192.168.1.2",
                "subnetmask": "255.255.255.0",
                "description": "to RT01"
            },
            {
                "name": "Gi0/2",
                "ip": "192.168.3.1",
                "subnetmask": "255.255.255.0",
                "description": "to Server"
            }
        ]
    }
]

テンプレートファイルも用意します。

hostname {{ hostname }}

{% for i in interface %}
interface {{ i.name }}
  description {{ i.description }}
  ip address {{ i.ip }} {{ i.subnetmask }}
  no shutdown
!
{% endfor %}

この2つのファイルから実行します。
すると以下のように2つのファイルが生成されます。

これで簡単。
ちなみに二回目の生成でパラメータを変えて生成してみます。
(あっ!NexusだからI/F名が間違ってた~)

下の図のように同じファイル名で生成すると前のファイルが自動的にバックアップファイルに移動します。
というような機能があります。(追記モードだとコピーされないので注意)

Loopのいらない簡単な生成方法はCSVなんかでもできます。
JSONと違って入れ子構造がないのでFor文は使えないです。

filenamehostnameloopback_iploopback_mask
RT01.confRT01192.168.1.1255.255.255.255
RT02.confRT02192.168.1.2255.255.255.255

上のようなCSVを用意。
下のようなテンプレートを用意。

hostname {{ hostname }}

interface lo0
  ip address {{ loopback_ip }} {{ loopback_mask }}
!

生成すると、、、
下の図のようになります。
※gオプションをつけると新規ディレクトリ配下に生成されます。

以上が簡単な説明です。中身はただのJinja2なので構文などはそのままです。
このスクリプトは下記に格納しています。
細かい制約など考えてないので実行場所など気をつけてください。

GitHub - izumin-baal/seisei.py: Jinjaを手軽に使えるようにしただけのスクリプト
Jinjaを手軽に使えるようにしただけのスクリプト. Contribute to izumin-baal/seisei.py development by creating an account on GitHub.

Subnet Calculator

困りごと2

困りごと1のように一括で生成する方法は手に入れた。
さっそくパラメータファイルを作りたいけど設定するIPアドレスのパラメータ作るの大変。。。

サブネットだけは決まっててポリシー的にGWは最後のIPだけどPrefix長バラバラ、、
IOSだと192.168.1.1/24形式だと入らない、、255.255.255.0に直さなきゃ
末番から3つ目のIPを出したいけどExcelだと末番とか計算してくれないし258とかになってしまう!

みたいなケースがあると思います。そんなときに役立つのはIP計算機。
ネットにもたくさんあるけれどプライベートアドレスとはいえ、抵抗が、、
1つのIPじゃなくてまとめて計算してほしい、、

みたいなケースもあると思います。
そんなときにローカルで使えて自分の欲しい情報だけをCSVで抽出できたら、、
そんな感じで調べてたら便利なライブラリがありました。 ipaddress というそのままのやつ。
これを簡単に使えるようにすれば欲しい情報がすぐにGETできます。
そこで作ったのが以下のツールです。

機能
  • Prefix表記のアドレスから欲しい情報を取ってくる
    • ネットワークアドレス
    • サブネットマスク
    • ワイルドカードマスク
    • ブロードキャストアドレス
    • プレフィックス長
    • Private or Global
    • アドレスの数
    • 末番から4番目
    • 若番から15番目
  • 欲しい情報だけを抽出してCSVに書き出し(CSVのheaderを指定)
使用例

まずは計算したいPrefix表記のアドレスを羅列した適当なファイルを作ります。
ネットワークアドレスじゃなくてもOK

192.168.1.1/24
192.168.2.1/24
192.168.3.1/24
192.168.12.0/26
192.168.12.64/26
192.168.12.128/26
10.0.0.0/19
192.168.185.184/28
172.16.12.85/23

次に欲しい情報をYAMLで記載します。

今回欲しい情報は以下とします

  • Prefix表記のネットワークアドレス
  • 末番のIP
  • 若番から3個目のIP
  • アドレスの数
  • サブネットマスク
  • ワイルドカードマスク

Settings.yamlに記載します。

output:
  filename: ""
  column:
    networkPrefix:
      name: "networkprefix"
    custom1:
      name: "last_ip"
      fromTheLast: "1"
    custom2:
      name: "3rd_ip"
      fromTheFirst: "3"
    addressNum:
      name: "addressnum"
    subnetmask:
      name: "subnetmask"
    wildcardmask:
      name: "wildcardmask"

以上の設定を行い、実行します。

python3 subcal.py -i target.txt -o target.csv

するとtarget.csvが生成されます。
これでパラメータの作成も便利になります。

-o をつけなればターミナルに出力されます。
タブだとうまく揃わない、、各カラムの文字数を揃えた方がいいかもと思いながら未修正ですが、、

このスクリプトは以下にあります。

GitHub - izumin-baal/subnet_calculator: サブネットの計算を行なって、欲しいパラメータをCSVで出力するスクリプト
サブネットの計算を行なって、欲しいパラメータをCSVで出力するスクリプト. Contribute to izumin-baal/subnet_calculator development by creating an account on ...

以上。 日々の業務をちょっと楽にするツールの紹介でした。
自分用に作ったのでちょっと雑な作りですが、各自適当に改造して使ってみてください。
むしろ便利機能を追加していただいたらそれ欲しいです!

タイトルとURLをコピーしました