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 文などで回すことで、複数のデバイスに対して、同じ操作を繰り返すことができます。
ここでは、いくつかの形式の設定ファイルを使って制御する例を解説します。
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 ファイルを作成します。
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 ファイルを作成します。
{
"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 というツールを使えば、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とは「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スクリプトでも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 スクリプトを実行することで、複数のデバイスの設定を自動生成することができます。
ネットワ-ク初心者のみなさま。
ネットワークの基礎知識を疎かにすることは
大変危険です!!
これを読めばネットワークの基礎が分かる!!
ネットワーク関連の仕事に就きたいとお考えの学生の方や、ネットワークに興味があって転職を考えている社会人の方、まずは登録してみてください。
もちろん無料です!!
↓メールマガジン購読はこちら↓