技術メモ

ネットワークエンジニアがpython, perl等々を気楽に使うための覚え書き

python openpyxl - ネットワーク機器のExcelパラメータシートをpythonで読取

ネットワーク機器(cisco)のExcelパラメータシート

ホスト名とインターフェース名を含むExcelのパラメータシートを読み取って、データを加工(config作成、構築データ作成等)を行いたい時のサンプルスクリプトを作成(環境は、python 3.4 + openpyxl 2.3.0)。
ネストした辞書データ({"ホスト名" : {"インターフェース名": {} } })になるため、読み取り終了後、確認のため、YAMLへ変換して保存。

サンプルExcelデータ

サンプルデータとしたのは、以下の様なA列にホスト名、B列にインターフェース名を含むデータ。一部の列には、'[' ']'で囲まれたリストのデータを含んでいる。
f:id:mocas:20151210183157p:plain

サンプルスクリプト

#!/usr/bin/env python3
from openpyxl import load_workbook
import yaml

xls = 'interface.xlsx' # 入力Excelパラメータシート
yml = 'interface.yaml' # 出力YAMLファイル

wb = load_workbook(xls)
ws = wb.get_sheet_by_name('interface')
dict_ = {}
for i in range(1, ws.max_row + 1):
    col = [ws.cell(row = i, column = j).value for j in range(ws.max_column + 1)]
    if i == 1:
        field = col
        continue
    dict_.setdefault(col[1], {}).setdefault(col[2], {})
    for j in range(3, ws.max_column + 1):
        if col[j]:
            if '[' and ']' in str(col[j]):
                if eval(col[j]):
                    dict_[col[1]][col[2]].update({field[j] : eval(col[j])})
            else:
                dict_[col[1]][col[2]].update({field[j] : col[j]})
with open(yml, 'w') as f:
    f.write(yaml.dump(dict_))

出力例(YAML)

osk-rt-01:
  GigabitEthernet0:
    description: LAN switch
    tagged_vlan: ['1,32,33,1002-1005']
  GigabitEthernet1: {status: shutdown}
  GigabitEthernet2: {status: shutdown}
  GigabitEthernet3: {status: shutdown}
  GigabitEthernet4: {status: shutdown}
  GigabitEthernet5: {status: shutdown}
  GigabitEthernet6: {status: shutdown}
  GigabitEthernet7: {status: shutdown}
  GigabitEthernet8: {duplex: auto, speed: auto, status: shutdown}
  GigabitEthernet9: {duplex: full, speed: 10}
  GigabitEthernet9.901:
    description: tagged WAN 1
    primary_ip: 10.240.1.2 255.255.255.128
    tagged_vlan: ['901']
  Vlan1: {status: shutdown}
  Vlan32:
    description: Osaka office LAN
    primary_ip: 10.1.32.252 255.255.255.0
    standby_group: 32
    standby_ip: 10.1.32.254
    standby_option: [preempt]
    standby_priority: 115
  Vlan33:
    description: Osaka office LAN
    primary_ip: 10.1.33.252 255.255.255.0
    standby_group: 33
    standby_ip: 10.1.33.254
    standby_option: [preempt, track 1 decrement 10]
    standby_priority: 120
osk-rt-02:
  GigabitEthernet0:
    description: LAN switch
    tagged_vlan: ['1,32,33,1002-1005']
  GigabitEthernet1: {status: shutdown}
  GigabitEthernet2: {status: shutdown}
  GigabitEthernet3: {status: shutdown}
  GigabitEthernet4: {status: shutdown}
  GigabitEthernet5: {status: shutdown}
  GigabitEthernet6: {status: shutdown}
  GigabitEthernet7: {status: shutdown}
  GigabitEthernet8: {duplex: auto, speed: auto, status: shutdown}
  GigabitEthernet9: {duplex: full, speed: 10}
  GigabitEthernet9.902:
    description: tagged WAN 2
    primary_ip: 10.240.2.2 255.255.255.128
    tagged_vlan: ['902']
  Vlan1: {status: shutdown}
  Vlan32:
    description: Osaka office LAN
    primary_ip: 10.1.32.253 255.255.255.0
    standby_group: 32
    standby_ip: 10.1.32.254
    standby_option: [preempt, track 1 decrement 10]
    standby_priority: 120
  Vlan33:
    description: Osaka office LAN
    primary_ip: 10.1.33.253 255.255.255.0
    standby_group: 33
    standby_ip: 10.1.33.254
    standby_option: [preempt]
    standby_priority: 115