Pythonで設定ファイルを作る|ネットワーク設定を自動生成する方法

当ページのリンクには広告が含まれています。
ネットワーク上級編 53/全70記事

この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第53回です。

第6章では、Python・SSH・Ansible・API・Gitなどを使い、 ネットワーク運用を自動化・効率化するための基礎を学びます。

NETWORK ADVANCED|CHAPTER 6 AUTOMATION

Pythonで設定ファイルを作る|ネットワーク設定を自動生成する方法

10台、50台、100台のネットワーク機器へ似た設定を作るとき、 すべてを手作業でコピー&ペーストすると入力ミスや修正漏れが発生しやすくなります。 Pythonを使えば、ホスト名、IPアドレス、VLAN番号などの値だけをデータとして管理し、 共通部分から設定ファイルを自動生成できます。

対象レベル Level 3〜4・上級
想定読了時間 約30分
身につく成果 Pythonでconfigを自動生成できる
前提知識 Python基礎・IPアドレス
演習環境 Python 3

ネットワーク自動化というと、 「Pythonから直接ルーターへSSH接続して設定を変更する」 イメージを持つかもしれません。

しかし、いきなり機器へ設定を投入する必要はありません。 自動化の最初の一歩としておすすめなのが、 設定ファイルをPythonで生成することです。

まずファイルとして出力すれば、人間が内容をレビューしてから投入できます。 自動化による効率化と、人による確認を組み合わせやすい方法です。

この記事を読み終えるとできること

  • 設定ファイルを自動生成するメリットを説明できる
  • f-stringを使って設定値を埋め込める
  • for文で複数の設定を生成できる
  • 辞書を使って機器情報を管理できる
  • 複数機器分のconfigを自動生成できる
  • 生成した設定をファイルへ保存できる

Pythonで設定ファイルを作るとは

最初に覚える定義

Pythonによる設定ファイル生成とは、 機器固有の値と共通の設定パターンを分離し、 プログラムによってconfigを組み立てることです。

例えば、3台のスイッチへ次のような管理用インターフェースを設定するとします。

機器 管理IP デフォルトゲートウェイ
SW01 192.168.100.11 192.168.100.1
SW02 192.168.100.12 192.168.100.1
SW03 192.168.100.13 192.168.100.1

基本的な設定内容は同じで、違うのは ホスト名やIPアドレスなど一部の値だけです。

このような構成は、Pythonによる設定生成と非常に相性がよいケースです。

本記事ではCisco IOS/IOS XEに似た形式を例にしますが、 考え方は特定メーカーだけに限定されません。

「共通部分」と「機器ごとに変わる値」を分離する考え方が重要です。

なぜ設定ファイル生成を自動化するのか

1.コピー&ペーストを減らせる

台数が増えても、元データを変更してプログラムを実行するだけで 設定を生成できます。

2.表記を統一できる

description、VLAN名、NTP、Syslogなどの 共通設定を同じ形式で生成できます。

3.修正を一括反映できる

共通設定の変更が必要な場合、 生成ロジックを修正して再生成できます。

4.レビューしやすい

機器へ直接投入する前にファイルとして出力すれば、 内容を確認してから作業できます。

手作業との違い

項目 手作業 Pythonによる生成
10台分の作成 10ファイルを編集 データを用意して一括生成
共通設定変更 全ファイルを修正 生成処理を修正して再生成
表記統一 人による差が出やすい ルールを統一しやすい
レビュー 可能 生成後のファイルをレビュー可能
大量展開 負荷が大きい 台数増加に対応しやすい

自動化の目的は「人を完全に排除すること」ではありません。

繰り返し作業をプログラムへ任せ、 人間は設計判断やレビューなど、 より重要な作業へ集中できる状態を作ることが目的です。

設定生成の全体像

Pythonで設定を作る処理は、大きく次の5段階に分けて考えると分かりやすくなります。

1 入力データ IP・VLAN・機器名
2 変数 Pythonへ読み込む
3 生成処理 文字列を組み立てる
4 ファイル configとして保存
5 レビュー 投入前に確認

最初はExcelやパラメータシートを直接読み込む必要はありません。 Pythonの変数やリスト、辞書へ値を直接記述するところから始めます。

慣れてきたら、CSV、JSON、YAMLなどから入力データを読み込む構成へ発展させられます。

まず1台分の設定を作る

最初は、Pythonの文字列として設定を作ってみましょう。

Python
config = """
hostname SW01
!
interface Vlan100
 ip address 192.168.100.11 255.255.255.0
 no shutdown
!
ip default-gateway 192.168.100.1
!
end
"""

print(config)

実行すると、変数configに保存した文字列がそのまま表示されます。

hostname SW01 ! interface Vlan100 ip address 192.168.100.11 255.255.255.0 no shutdown ! ip default-gateway 192.168.100.1 ! end

これだけでは、単にconfigをPythonへ貼り付けただけです。

自動化するには、 機器ごとに変更する部分を変数へ置き換えます。

変数を使って設定値を変更する

ホスト名、管理IPアドレス、デフォルトゲートウェイを変数として定義します。

Python
hostname = "SW01"
management_ip = "192.168.100.11"
subnet_mask = "255.255.255.0"
default_gateway = "192.168.100.1"

config = f"""
hostname {hostname}
!
interface Vlan100
 ip address {management_ip} {subnet_mask}
 no shutdown
!
ip default-gateway {default_gateway}
!
end
"""

print(config)

文字列の先頭にfを付けると、 {hostname}{management_ip}の部分へ 変数の値を埋め込めます。

変数化すると何が変わるのか

SW02を作りたい場合は、設定本文を編集するのではなく、 値だけ変更できます。

変更するデータ
hostname = "SW02"
management_ip = "192.168.100.12"

共通設定を直接編集する回数を減らせることが、 設定生成を自動化する大きなメリットです。

設定とデータを分離するという考え方を覚えておきましょう。

将来Ansibleやテンプレートエンジンを使う場合にも、 同じ考え方が重要になります。

for文で複数の設定を作る

次はVLANを複数作成してみます。

手作業では、次の設定をVLAN数だけ繰り返します。

vlan 10
 name SALES
!
vlan 20
 name ENGINEERING
!
vlan 30
 name SERVER
!

Pythonでは、VLAN情報をリストへ保存してfor文で繰り返せます。

Python
vlans = [
    {"id": 10, "name": "SALES"},
    {"id": 20, "name": "ENGINEERING"},
    {"id": 30, "name": "SERVER"}
]

config = ""

for vlan in vlans:
    config += f"""vlan {vlan['id']}
 name {vlan['name']}
!
"""

print(config)
vlan 10 name SALES ! vlan 20 name ENGINEERING ! vlan 30 name SERVER !

VLANを追加したい場合は、生成ロジックを変更する必要はありません。

{"id": 40, "name": "GUEST"}

をリストへ追加すれば、VLAN 40の設定も生成できます。

インターフェース設定にも応用できる

Python
interfaces = [
    {
        "name": "GigabitEthernet1/0/1",
        "description": "PC-A",
        "vlan": 10
    },
    {
        "name": "GigabitEthernet1/0/2",
        "description": "PC-B",
        "vlan": 20
    }
]

config = ""

for interface in interfaces:
    config += f"""interface {interface['name']}
 description {interface['description']}
 switchport mode access
 switchport access vlan {interface['vlan']}
 spanning-tree portfast
!
"""

print(config)
interface GigabitEthernet1/0/1 description PC-A switchport mode access switchport access vlan 10 spanning-tree portfast ! interface GigabitEthernet1/0/2 description PC-B switchport mode access switchport access vlan 20 spanning-tree portfast !

このように、 同じ形式を何度も繰り返す設定はPythonで生成しやすい対象です。

辞書で機器情報を管理する

1台の機器には、ホスト名だけでなく多くの設定値があります。

そこで、関連する値をPythonの辞書にまとめます。

Python
device = {
    "hostname": "SW01",
    "management_ip": "192.168.100.11",
    "subnet_mask": "255.255.255.0",
    "default_gateway": "192.168.100.1",
    "ntp_server": "192.168.200.10",
    "syslog_server": "192.168.200.20"
}

設定生成側では、次のように値を参照します。

Python
config = f"""
hostname {device['hostname']}
!
interface Vlan100
 ip address {device['management_ip']} {device['subnet_mask']}
 no shutdown
!
ip default-gateway {device['default_gateway']}
!
ntp server {device['ntp_server']}
logging host {device['syslog_server']}
!
end
"""

print(config)

これで、 入力データ設定生成ロジックが明確に分かれました。

実務では、設定コマンドそのものよりも 「どの値を入力データとして管理するか」 を考えることが重要です。

ホスト名、IPアドレス、VLAN、description、NTP、 Syslogなどをデータとして整理できれば、 パラメータシートと自動生成処理をつなぎやすくなります。

複数機器の設定ファイルを生成する

ここから、より実務に近い形へ進みます。

SW01、SW02、SW03の3台分の情報をリストへ登録します。

Python
devices = [
    {
        "hostname": "SW01",
        "management_ip": "192.168.100.11",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    },
    {
        "hostname": "SW02",
        "management_ip": "192.168.100.12",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    },
    {
        "hostname": "SW03",
        "management_ip": "192.168.100.13",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    }
]

設定生成を関数にする

同じ処理を何度も使用する場合は、関数にまとめると管理しやすくなります。

Python
def generate_config(device):
    config = f"""hostname {device['hostname']}
!
interface Vlan100
 ip address {device['management_ip']} {device['subnet_mask']}
 no shutdown
!
ip default-gateway {device['default_gateway']}
!
end
"""
    return config

ファイルへ保存する

Python標準ライブラリのpathlibを使って、 生成した文字列をファイルとして保存します。

完成例
from pathlib import Path

devices = [
    {
        "hostname": "SW01",
        "management_ip": "192.168.100.11",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    },
    {
        "hostname": "SW02",
        "management_ip": "192.168.100.12",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    },
    {
        "hostname": "SW03",
        "management_ip": "192.168.100.13",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.100.1"
    }
]


def generate_config(device):
    return f"""hostname {device['hostname']}
!
interface Vlan100
 ip address {device['management_ip']} {device['subnet_mask']}
 no shutdown
!
ip default-gateway {device['default_gateway']}
!
end
"""


output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

for device in devices:
    config = generate_config(device)

    file_path = output_dir / f"{device['hostname']}.txt"

    file_path.write_text(
        config,
        encoding="utf-8"
    )

    print(f"Created: {file_path}")

実行すると、次のようなファイルが作成されます。

output/ ├─ SW01.txt ├─ SW02.txt └─ SW03.txt

SW02.txtの内容

hostname SW02 ! interface Vlan100 ip address 192.168.100.12 255.255.255.0 no shutdown ! ip default-gateway 192.168.100.1 ! end

機器が10台になっても100台になっても、 基本的な処理の考え方は変わりません。

設定生成で重要なチェック

Pythonがエラーなく動いたからといって、 生成されたネットワーク設定が正しいとは限りません。

自動化では、 「生成できた」と「正しい設定である」を分けて考える 必要があります。

1.入力データを確認する

  • IPアドレスが重複していないか
  • サブネットマスクが正しいか
  • VLAN番号が設計と一致しているか
  • インターフェース名が実機と一致しているか
  • ホスト名が命名規則に沿っているか

2.生成後のconfigをレビューする

初めて作成した自動化スクリプトから、 いきなり実機へ設定投入するのは避けます。

  1. 入力値を確認する パラメータシートや設計書との一致を確認します。
  2. 設定ファイルを生成する Pythonでconfigをファイルへ出力します。
  3. 差分・内容をレビューする 想定外のコマンドや不足がないか確認します。
  4. 検証環境で試験する 可能であればラボ環境や検証機で動作を確認します。
  5. 本番投入する 承認・バックアップ・切り戻し手順を準備して実施します。

3.IPアドレスをプログラムで確認する

前回学習したipaddressモジュールも利用できます。

Python
import ipaddress

management_ip = "192.168.100.11"

try:
    ipaddress.ip_address(management_ip)
    print("IPアドレスの形式は正常です")

except ValueError:
    print("IPアドレスの形式が不正です")

このように、第52回で学んだ内容を設定生成へ組み込むことで、 入力ミスを事前に検出する処理へ発展させられます。

自動生成したconfigを無条件で本番機器へ投入しないでください。

誤った入力データを自動化すると、 誤った設定も高速かつ大量に生成できます。 自動化するほど、入力値の確認・レビュー・試験・切り戻し設計が重要になります。

実務ではどのように使えるのか

例1.新拠点スイッチの初期config

拠点ごとに次の値だけが異なる場合があります。

  • ホスト名
  • 管理IPアドレス
  • デフォルトゲートウェイ
  • NTPサーバー
  • Syslogサーバー
  • SNMP設定

共通部分をテンプレート化すれば、 拠点ごとのパラメータからconfigを生成できます。

例2.大量のアクセスポート設定

数十ポートのdescriptionやVLANを設定する場合、 パラメータ一覧から自動生成できます。

Port Description VLAN
Gi1/0/1 PC-001 10
Gi1/0/2 PC-002 10
Gi1/0/3 PHONE-001 20

例3.VLAN追加作業

複数スイッチへ同じVLANを追加する場合も、 対象機器やVLAN一覧をデータ化できます。

例4.更改案件のconfig作成

旧機器の設定をそのままコピーするのではなく、 新設計のパラメータをもとに 新機器用configを再生成する仕組みも作れます。

設定生成は、 設計書・パラメータシートと実機configの間をつなぐ処理 と考えると分かりやすくなります。

Pythonで設定ファイルを作るときのよくある失敗

設定本文へ値を直接書きすぎる

IPアドレスやVLAN番号がコードの各所へ散らばると、 変更箇所が増えて管理しにくくなります。

機器固有値はできるだけデータ側へ分離します。

入力値を信用しすぎる

Excelや手入力の値にも誤りはあります。 IP形式、必須項目、重複などを確認する仕組みを考えます。

生成後に確認しない

Pythonが正常終了しても、 ネットワーク設計として正しいとは限りません。 必ずレビューを行います。

最初から直接投入まで自動化する

初期段階では、 「生成」と「投入」を分離する方が問題を見つけやすくなります。

パスワードをコードへ直接記載する

認証情報をソースコードへ直接埋め込むと、 Gitやファイル共有経由で漏えいするリスクがあります。

手作業用configと自動生成版が混在する

どのファイルが最新なのか分からなくならないよう、 ファイル名や保存場所、管理方法を統一します。

顧客・上司への説明方法

自動化の説明で、 「Pythonでconfigを作れるようになりました」 だけでは、業務上の価値が伝わりにくい場合があります。

技術を工数・品質・リスクへ変換して説明します。

技術的な説明 業務的な説明
Pythonでconfigを生成する 繰り返し作業を減らして作成工数を抑える
値を変数化する 機器ごとの差分を明確にして修正漏れを減らす
共通ロジックで生成する 設定形式を標準化する
生成後にレビューする 自動化しながら人による品質確認を残す

説明例

「今回の機器は共通設定が多いため、 ホスト名やIPアドレスなど機器ごとの差分をパラメータとして管理し、 Pythonで設定ファイルを生成します。 生成後は設計書との突き合わせとレビューを行ってから投入するため、 作成工数の削減と設定品質の統一を両立できます。」

上級エンジニアでは、 自動化技術を使えるだけでなく、 なぜ自動化するのかを業務上の効果として説明できること が重要です。

設定自動化で使われる英語表現

英語 意味
Configuration file 設定ファイル
Configuration generation 設定生成
Template テンプレート
Variable 変数
Input data 入力データ
Output file 出力ファイル
Generate 生成する
Validate 検証する
Overwrite 上書きする
Placeholder 後から値を埋め込む場所

ドキュメントで見かける表現

Generate a configuration file for each device.
各機器用の設定ファイルを生成する。

Replace the variables with device-specific values.
変数を機器固有の値へ置き換える。

Validate the generated configuration before deployment.
展開する前に生成された設定を検証する。

Do not overwrite the existing configuration file.
既存の設定ファイルを上書きしない。

ネットワーク自動化を学ぶと、 PythonだけでなくGitHub、Ansible、API、 ベンダー公式ドキュメントなど英語資料を読む機会が増えます。

特にgeneratetemplatevariablevalidateは 覚えておきたい単語です。

理解度チェック

Pythonの文法だけでなく、 ネットワーク設定を自動生成するときの考え方を確認しましょう。

問題1.ネットワーク設定をPythonで生成するとき、 最も基本となる考え方はどれですか。

  1. すべての設定値を1つの長い文字列へ直接記述する
  2. 設定の共通部分と機器固有のデータを分離する
  3. 生成した設定は確認せず直接投入する
  4. すべての機器で同じIPアドレスを使用する
解答を見る
正解:B

共通設定と機器固有値を分離することで、 同じ生成処理を複数機器へ再利用しやすくなります。

問題2.Pythonで次の文字列へ変数を埋め込む場合、 適切な書き方はどれですか。

hostname = "SW01"
  1. "hostname {hostname}"
  2. f"hostname {hostname}"
  3. "hostname [hostname]"
  4. "hostname = hostname"
解答を見る
正解:B

f-stringでは文字列の前にfを付け、 波括弧の中へ変数名を指定します。

問題3.VLANを50個生成するときに適した方法はどれですか。

  1. 50回print文を書く
  2. 50個のPythonファイルを作る
  3. VLAN情報をリストなどで管理しfor文で繰り返す
  4. すべて手作業でコピーする
解答を見る
正解:C

同じ形式の設定を大量に作る場合は、 データとfor文を組み合わせることで効率化できます。

問題4.Pythonプログラムがエラーなく終了しました。 生成された設定は、そのまま本番機器へ投入してよいでしょうか。

解答を見る
正解:そのまま投入すべきではありません。

プログラムが正常終了しても、 入力値や設計内容が正しいとは限りません。 configレビューや検証を行う必要があります。

問題5.設定生成を自動化するメリットを3つ挙げてください。

解答例を見る
  • 繰り返し作業を減らせる
  • 設定形式を統一しやすい
  • 共通設定の変更を一括反映しやすい
  • 大量の機器へ対応しやすい
  • 手入力による転記ミスを減らしやすい

実践演習:3台のスイッチ設定を自動生成する

あなたは、新しいオフィスへ3台のアクセススイッチを導入することになりました。

次のパラメータから、 Pythonを使って3台分の設定ファイルを生成してください。

機器 管理IP Gateway
ACCESS-SW01 10.10.100.11/24 10.10.100.1
ACCESS-SW02 10.10.100.12/24 10.10.100.1
ACCESS-SW03 10.10.100.13/24 10.10.100.1

共通VLAN

VLAN Name
10 SALES
20 ENGINEERING
30 SERVER
100 MANAGEMENT

課題1.入力データを作る

3台の情報をdevicesというリストへ格納してください。

devices = [
  __________________
]
解答例を見る
devices = [
    {
        "hostname": "ACCESS-SW01",
        "management_ip": "10.10.100.11",
        "default_gateway": "10.10.100.1"
    },
    {
        "hostname": "ACCESS-SW02",
        "management_ip": "10.10.100.12",
        "default_gateway": "10.10.100.1"
    },
    {
        "hostname": "ACCESS-SW03",
        "management_ip": "10.10.100.13",
        "default_gateway": "10.10.100.1"
    }
]

課題2.VLAN設定を生成する

VLAN 10、20、30、100を、 for文を使って生成してください。

for vlan in vlans:
  __________________
解答例を見る
vlans = [
    {"id": 10, "name": "SALES"},
    {"id": 20, "name": "ENGINEERING"},
    {"id": 30, "name": "SERVER"},
    {"id": 100, "name": "MANAGEMENT"}
]

vlan_config = ""

for vlan in vlans:
    vlan_config += f"""vlan {vlan['id']}
 name {vlan['name']}
!
"""

課題3.3台分のconfigを生成する

次の内容を含むconfigを作成してください。

  • hostname
  • VLAN 10・20・30・100
  • interface Vlan100
  • 管理IPアドレス
  • デフォルトゲートウェイ
完成例を見る
from pathlib import Path

devices = [
    {
        "hostname": "ACCESS-SW01",
        "management_ip": "10.10.100.11",
        "default_gateway": "10.10.100.1"
    },
    {
        "hostname": "ACCESS-SW02",
        "management_ip": "10.10.100.12",
        "default_gateway": "10.10.100.1"
    },
    {
        "hostname": "ACCESS-SW03",
        "management_ip": "10.10.100.13",
        "default_gateway": "10.10.100.1"
    }
]

vlans = [
    {"id": 10, "name": "SALES"},
    {"id": 20, "name": "ENGINEERING"},
    {"id": 30, "name": "SERVER"},
    {"id": 100, "name": "MANAGEMENT"}
]


def generate_vlan_config():
    config = ""

    for vlan in vlans:
        config += f"""vlan {vlan['id']}
 name {vlan['name']}
!
"""

    return config


def generate_device_config(device):
    vlan_config = generate_vlan_config()

    return f"""hostname {device['hostname']}
!
{vlan_config}
interface Vlan100
 ip address {device['management_ip']} 255.255.255.0
 no shutdown
!
ip default-gateway {device['default_gateway']}
!
end
"""


output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

for device in devices:
    config = generate_device_config(device)

    file_path = output_dir / f"{device['hostname']}.txt"

    file_path.write_text(
        config,
        encoding="utf-8"
    )

    print(f"Created: {file_path}")

課題4.自動化を改善する

次の機能を追加するとしたら、 どのような処理が必要か考えてください。

  • IPアドレス形式のチェック
  • IPアドレス重複チェック
  • VLAN番号の範囲チェック
  • 既存ファイルの上書き防止
  • NTP・Syslog設定の追加
追加したいチェック:

__________________________

自分の言葉で説明する課題

後輩エンジニアから、 「設定を自動生成するメリットは何ですか? コピー&ペーストでもよくないですか?」 と質問されました。

1分程度で説明してください。

Pythonで設定を自動生成するメリットは、 ________________________________。
説明例を見る

コピー&ペーストでも少数の機器なら作成できますが、 台数が増えるほど修正漏れや転記ミスの可能性が高くなります。

Pythonでは、ホスト名やIPアドレスなど機器ごとに異なる値を データとして管理し、共通部分を同じ処理から生成できます。 そのため、大量の設定を効率よく作成し、 形式を統一しやすくなります。

ただし、自動生成した設定もレビューや検証を行ってから 本番へ投入することが重要です。

まとめ

  • Pythonを使うと、ネットワーク機器の設定ファイルを自動生成できる
  • 自動化では、共通設定と機器固有の値を分離することが重要
  • f-stringを使うと、設定文字列へ変数を埋め込める
  • for文を使うと、VLANやインターフェースなど繰り返し設定を生成できる
  • 辞書を使うと、ホスト名・IPアドレスなど機器情報をまとめて管理できる
  • 複数機器の情報をリスト化すれば、機器ごとのconfigを一括生成できる
  • pathlibを使って、生成したconfigをファイルとして保存できる
  • 自動化しても、入力値チェック・レビュー・検証は必要
  • 「生成」と「本番投入」を最初から完全自動化する必要はない

ネットワーク自動化の第一歩は、 機器を直接操作することではなく、 「人が繰り返している作業をデータとルールへ分解すること」です。

次の記事:SSHによる情報取得

今回は、Pythonを使ってネットワーク機器の設定ファイルを生成しました。

次のステップでは、 Pythonから実際のネットワーク機器へ接続する処理へ進みます。

第54回では、SSHを使ってネットワーク機器へ接続し、 showコマンドなどの実行結果を取得する基本的な考え方を学びます。

設定生成と情報取得を組み合わせることで、 設定確認、棚卸し、障害調査など、 より実務的なネットワーク自動化へ発展できます。

ネットワーク上級編 53/全70記事

上級編では、要件定義・基本設計・BGP・クラウド・セキュリティから、 Python・Ansible・REST API・Gitを使ったネットワーク自動化まで 順番に学びます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次