python openpyxl - ネットワーク機器のExcelパラメータシートをpythonで読取
ネットワーク機器(cisco)のExcelパラメータシート
ホスト名とインターフェース名を含むExcelのパラメータシートを読み取って、データを加工(config作成、構築データ作成等)を行いたい時のサンプルスクリプトを作成(環境は、python 3.4 + openpyxl 2.3.0)。
ネストした辞書データ({"ホスト名" : {"インターフェース名": {} } })になるため、読み取り終了後、確認のため、YAMLへ変換して保存。
サンプルExcelデータ
サンプルデータとしたのは、以下の様なA列にホスト名、B列にインターフェース名を含むデータ。一部の列には、'[' ']'で囲まれたリストのデータを含んでいる。
サンプルスクリプト
#!/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