Pythonを使って複数のデバイスの設定をまとめて行う

Pythonを使えば、複数のデバイスの設定をまとめて行うことができます。これにより、作業効率が向上し、エラーを防ぐことができるので、非常に有用なツールです。以下では、Pythonを使って複数のデバイスの設定をまとめて行う方法を紹介します。

ネットワークデバイスを Python から制御する

まずはPythonを使ってネットワークデバイスを制御する方法を説明します。 Pythonでは、「paramiko」というライブラリを使うことで、ネットワークデバイスを Python から制御することができます。このライブラリを使えば、SSHやTelnetで接続したり、コマンドを実行したりすることができます。

まず、paramiko ライブラリをインストールします。次のように、pipコマンドを使ってインストールできます。

$ pip install paramiko

次に、Python スクリプトで、paramiko ライブラリをインポートします。

import paramiko

次に、SSH接続でデバイスに接続するために、以下のようなコードを記述します。

# SSHクライアントを作成 client = paramiko.SSHClient() # 接続先のホスト名とポート番号、ユーザー名、パスワードを指定 host = "192.168.0.1" port = 22 username = "admin" password = "password" # 認証情報を設定して、接続先のデバイスに接続 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname=host, port=port, username=username, password=password)

接続が成功すると、デバイスに対してコマンドを実行できるようになります。以下のように、exec_commandメソッドを使って、コマンドを実行します。

# コマンドを実行 stdin, stdout, stderr = client.exec_command("show version") # 実行結果を出力 print(stdout.read().decode()) # SSH接続を閉じる client.close()

上記スクリプトを実行すると、ネットワークデバイスにログインし、show versionコマンドを実行し、結果を出力してくれます。

複数のデバイスに対して、コマンドをまとめて実行する

複数のデバイスの接続情報を設定ファイルとして準備しておくことで、それらの接続情報を for 文や while 文などで回すことで、複数のデバイスに対して、同じ操作を繰り返すことができます。

ここでは、いくつかの形式の設定ファイルを使って制御する例を解説します。

  • 複数のデバイスの設定を CSV ファイルに記述する
  • 複数のデバイスの設定を YAML ファイルに記述する
  • 複数のデバイスの設定を JSON ファイルに記述する
  • 複数のデバイスの設定を Ansible の Playbook に記述する
  • 複数のデバイスの設定を Jinja2 テンプレートを使って自動生成する
  • 複数のデバイスの設定を Python スクリプトで自動生成する

複数のデバイスの設定を CSV ファイルに記述する

Pythonでは、CSVファイルを扱うことができます。CSVファイルを使えば、デバイスの設定を行うための情報を、表形式で記述することができます。 例えば、次のような CSV ファイルを作成します。

device_name,ip_address,username,password Router1,192.168.0.1,admin,password1 Router2,192.168.0.2,admin,password2 Switch1,192.168.0.3,admin,password3 Switch2,192.168.0.4,admin,password4

この CSV ファイルを Python スクリプトで読み込んで、各デバイスに対して設定を行うことができます。 まず、CSV ファイルを読み込むために、csvモジュールをインポートします。

import csv

次に、CSV ファイルを開いて、各行を読み込みます。

# CSV ファイルを開く with open("devices.csv", "r") as f: # CSV ファイルを読み込んで、各行をリストとして取得する reader = csv.reader(f) rows = [row for row in reader] # 先頭の行はカラム名なので、スキップする header = rows[0] rows = rows[1:]

次に、取得した各行を処理して、デバイスに対して設定を行うことができます。

# 各行を処理する for row in rows: # 各カラムを取得する device_name = row[0] ip_address = row[1] username = row[2] password = row[3] # ここで、デバイスに対して設定を行う # 以下は、例として、SSH接続を行い、"show version" コマンドを実行する例 client = paramiko.SSHClient() client.set_missing_host

複数のデバイスの設定を YAML ファイルに記述する

YAML形式のファイルを使えば、デバイスの設定を行うための情報を、簡単に記述することができます。

例えば、次のような YAML ファイルを作成します。

devices: - name: Router1 ip_address: 192.168.0.1 username: admin password: password1 - name: Router2 ip_address: 192.168.0.2 username: admin password: password2 - name: Switch1 ip_address: 192.168.0.3 username: admin password: password3 - name: Switch2 ip_address: 192.168.0.4 username: admin password: password4

この YAML ファイルを Python スクリプトで読み込んで、各デバイスに対して設定を行うことができます。 まず、YAML ファイルを読み込むために、yamlモジュールをインポートします。

import yaml

次に、YAML ファイルを開いて、データを読み込みます。

# YAML ファイルを開く with open("devices.yaml", "r") as f: # YAML ファイルを読み込んで、辞書として取得する data

複数のデバイスの設定を JSON ファイルに記述する

JSON形式のファイルを使えば、デバイスの設定を行うための情報を、簡単に記述することができます。

例えば、次のような JSON ファイルを作成します。

{ "devices": [ { "name": "Router1", "ip_address": "192.168.0.1", "username": "admin", "password": "password1" }, { "name": "Router2", "ip_address": "192.168.0.2", "username": "admin", "password": "password2" }, { "name": "Switch1", "ip_address": "192.168.0.3", "username": "admin", "password": "password3" }, { "name": "Switch2", "ip_address": "192.168.0.4", "username": "admin", "password": "password4"

複数のデバイスの設定を Ansible の Playbook に記述する

ansible というツールを使えば、Pythonを使わずに、複数のデバイスの設定を自動化することができます。 ansibleの解説はAnsibleを使ってネットワーク機器を制御してみるを参照ください。

例えば、次のような Playbook を作成します。

--- - hosts: all gather_facts: no vars: devices: - name: Router1 ip_address: 192.168.0.1 username: admin password: password1 - name: Router2 ip_address: 192.168.0.2 username: admin password: password2 - name: Switch1 ip_address: 192.168.0.3 username: admin password: password3 - name: Switch2 ip_address: 192.168.0.4 username: admin password: password4 tasks: - name: show version ios_command: commands: show version register: result loop: "{{ devices }}" loop_control: index_var: index - name: show result debug: var: result.results[index]

この Playbookを実行することで、複数のデバイスに対して、"show version" コマンドを実行することができます。 ansibleを使用するには、まず、ansibleをインストールする必要があります。次のように、pipコマンドを使ってインストールできます。

$ pip install ansible

次に、ansible-playbook コマンドを使って、Playbookを実行します。

$ ansible-playbook playbook.yml

ansibleを使った実行例を示します。 まず、ansible-playbook コマンドを使って、Playbookを実行します。

$ ansible-playbook playbook.yml

実行結果は次のようになります。

$ ansible-playbook playbook.yml PLAY [all] ********************************************************************* TASK [show version] ************************************************************ ok: [Router1] => {"changed": false, "stdout": "Cisco IOS Software, C2960 Software (C2960-LANBASEK9-M), Version 12.2(55)SE9, RELEASE SOFTWARE (fc2)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2011 by Cisco Systems, Inc.\nCompiled Fri 27-May-11 02:30 by prod_rel_team\n\nROM: Bootstrap program is C2960 boot loader\nBOOTLDR: C2960 Boot Loader (C2960-HBOOT-M) Version 12.2(44r)SE6, RELEASE SOFTWARE (fc1)\n\nRouter1 uptime is 5 weeks, 3 days, 20 hours, 10 minutes\nSystem returned to ROM by power-on\nSystem image file is \"flash:c2960-lanbasek9-mz.122-55.SE9/c2960-lanbasek9-mz.122-55.SE9.bin\"\n\nThis product contains cryptographic features and is subject to United States and local country laws governing import, export, transfer and use. Delivery of Cisco cryptographic products does not imply\nthird-party authority to import, export, distribute or use encryption. Importers, exporters, distributors and users are responsible for compliance with U.S. and local country laws. By using this product you\nagree to comply with applicable laws and regulations. If you are unable to comply with U.S. and local laws, return this product immediately.\n\nA summary of U.S. laws governing Cisco cryptographic products may be found at: http://www.cisco.com/wwl/export/crypto/tool/stqrg.html\n\nIf you require further assistance please contact

複数のデバイスの設定を Jinja2 テンプレートを使って自動生成する

Jinja2とは「python用の、htmlを動的作成できるテンプレートエンジン」です。 Jinja2を使えば、複数のデバイスの設定を自動生成することができます。

例えば、次のような Jinja2 テンプレートを作成します。

{% for device in devices %} interface {{ device.name }} ip address {{ device.ip_address }} username {{ device.username }} password {{ device.password }} {% endfor %}

このテンプレートに、デバイスの情報を渡すことで、複数のデバイスの設定を自動生成することができます。 まず、Jinja2 テンプレートを読み込むために、jinja2モジュールをインポートします。

import jinja2

次に、Jinja2 テンプレートを開き、デバイスの情報を渡して、設定を生成します。

# Jinja2 テンプレートを開く template = jinja2.Template(open("template.jinja2", "r").read()) # デバイスの情報 devices = [ {"name": "Router1", "ip_address": "192.168.0.1", "username": "admin", "password": "password1"}, {"name": "Router2", "ip_address": "192.168.0.2", "username": "admin", "password": "password2"}, {"name": "Switch1", "ip_address": "192.168.0.3", "username": "admin", "password": "password3"}, {"name": "Switch2", "ip_address": "192.168.0.4", "username": "admin", "password": "password4"}, ] # 設定を生成 config = template.render(devices=devices) # 生成した設定を表示 print(config)

実行結果は次のようになります。

interface Router1 ip address 192.168.0.1 username admin password password1 interface Router2 ip address 192.168.0.2 username admin password password2 interface Switch1 ip address 192.168.0.3 username admin password password3 interface Switch2 ip address 192.168.0.4 username admin password password4

複数のデバイスの設定を Python スクリプトで自動生成する

PythonスクリプトでもJinja2と同様に複数のデバイスの設定を自動生成することもできます。 例えば、次のような Python スクリプトを作成します。

# デバイスの情報 devices = [ {"name": "Router1", "ip_address": "192.168.0.1", "username": "admin", "password": "password1"}, {"name": "Router2", "ip_address": "192.168.0.2", "username": "admin", "password": "password2"}, {"name": "Switch1", "ip_address": "192.168.0.3", "username": "admin", "password": "password3"}, {"name": "Switch2", "ip_address": "192.168.0.4", "username": "admin", "password": "password4"}, ] # 設定を生成 config = "" for device in devices: config += f"interface {device['name']}\n" config += f" ip address {device['ip_address']}\n" config += f" username {device['username']}\n" config += f" password {device['password']}\n" # 生成した設定を表示 print(config)

このスクリプトを実行することで、複数のデバイスの設定を自動生成することができます。

実行例を示します。

$ python script.py interface Router1 ip address 192.168.0.1 username admin password password1 interface Router2 ip address 192.168.0.2 username admin password password2 interface Switch1 ip address 192.168.0.3 username admin password password3 interface Switch2 ip address 192.168.0.4 username admin password password4

このように、Python スクリプトを実行することで、複数のデバイスの設定を自動生成することができます。

関連記事

メールマガジン

ネットワ-ク初心者のみなさま。
ネットワークの基礎知識を疎かにすることは
大変危険です!!

「初心者にも理解できるネットワーク技術」

これを読めばネットワークの基礎が分かる!!
ネットワーク関連の仕事に就きたいとお考えの学生の方や、ネットワークに興味があって転職を考えている社会人の方、まずは登録してみてください。

もちろん無料です!!

↓メールマガジン購読はこちら↓

メールアドレス: