Nornirとは?なぜAnsibleからNornirに乗り換えるべきなのか?
ネットワーク自動化に携わっている方なら、一度はAnsibleを使ったことがあるでしょう。Ansibleは非常に優れたツールですが、数千台規模のデバイスにスケールさせると、実行速度の低下やYAML構文の制約によるロジックの複雑化といった課題に直面することがあります。そこで真価を発揮するのがNornirです。
本質的に、Nornirは独立したツールではなく、純粋なPythonフレームワークです。Pandasによるデータ処理やRequestsによるAPI連携など、Pythonのエコシステムをそのままスクリプト内で活用できます。また、テキストベースの設定ファイルではなくコードを直接扱うため、デバッグもより直感的に行えます。
クイックスタート:5分で最初のスクリプトを実行する
まず、SSH経由でデバイスを操作するために、NornirとNetmikoプラグインをインストールします。
pip install nornir nornir_utils nornir_netmiko
Nornirのインベントリ(管理対象リスト)は、通常3つのYAMLファイルで構成されます。プロジェクトディレクトリに以下のファイルを準備しましょう。
1. config.yaml(システム設定)
inventory:
plugin: SimpleInventory
options:
host_file: "hosts.yaml"
group_file: "groups.yaml"
runner:
plugin: threaded
options:
num_workers: 20
2. groups.yaml(グループ管理)
ios_devices:
platform: cisco_ios
username: admin
password: YourPassword123
3. hosts.yaml(個別のデバイスリスト)
sw-access-01:
hostname: 192.168.1.10
groups:
- ios_devices
sw-access-02:
hostname: 192.168.1.11
groups:
- ios_devices
4. 実行用Pythonスクリプト (main.py)
以下のスクリプトは、デバイスに同時接続してソフトウェアのバージョン情報を取得します。
from nornir import InitNornir
from nornir_netmiko.tasks import netmiko_send_command
from nornir_utils.plugins.functions import print_result
nr = InitNornir(config_file="config.yaml")
def get_info(task):
task.run(task=netmiko_send_command, command_string="show version | inc Software")
results = nr.run(task=get_info)
print_result(results)
Nornirの最大のメリット
マルチスレッド(multi-threading)処理能力こそが、Nornirの最大の武器です。num_workers: 20を設定すると、Nornirは同時に20のSSH接続を開始します。例えば100台のスイッチがある場合、通常のforループでは20分かかる処理が、Nornirなら2分足らずで完了します。
制約のない柔軟なインベントリ管理
Nornirでは、任意のソースからデバイスリストを取得するプラグインを自作できます。NetBoxやSolarWinds、あるいは古いExcelファイルからデータを読み込むことも可能です。デバイス構成が頻繁に変わる大規模環境において、インベントリの自動更新機能は非常に強力な助けとなります。
Filterによるスマートなデバイス抽出
例えば、ハノイ拠点のコアスイッチのみを対象にしたい場合、わずか一行のコードでフィルタリングできます。
core_switches = nr.filter(site="Hanoi", role="core")
results = core_switches.run(task=your_config_task)
一括設定変更(構成管理)
デバイスに設定を流し込むには、netmiko_send_configタスクが最適です。例として、全システムのバナーメッセージを更新してみましょう。
from nornir_netmiko.tasks import netmiko_send_config
def update_banner(task):
commands = [
"banner motd #",
"【警告】許可されたユーザーのみアクセスが許可されています!",
"#"
]
task.run(task=netmiko_send_config, config_commands=commands)
nr.run(task=update_banner)
実践的な活用例:30秒でトラブルシューティングを完了
以前、大規模拠点のシステムで、パケットロスが発生するという難解なトラブルに遭遇したことがあります。40台以上のアクセススイッチの物理的な不具合が疑われましたが、全ポートを手動で確認するには一晩中かかってしまいます。
そこで私は、全40台のスイッチに対してshow interfaces | inc CRC|Input errorsコマンドを一斉に実行するNornirスクリプトを即座に作成しました。結果はわずか30秒で返ってきました。光ファイバーの折れ曲がりが原因で、2つのアップリンクポートでCRCエラーが継続的に増えていることを即座に特定。オートメーションのスピードのおかげで、迅速に切り分けと対処が完了しました。
アドバイス:トラブルが起きてからコードを書くのではなく、デバイスのヘルスチェックや定期的な設定バックアップのためのタスクライブラリを事前に構築しておくことをお勧めします。
Nornirを選ぶべきか、Ansibleを使い続けるべきか?
答えは、解決したい課題によって異なります:
- Ansibleを選ぶべきケース:シンプルさを求め、Pythonコードを書くよりもYAMLに慣れているチーム。また、Ansibleはデバイスの状態管理(State management)に強みを持っています。
- Nornirを選ぶべきケース:実行速度を最優先する場合(Ansibleの5〜10倍高速)。IPアドレス計算や複雑なif/else条件分岐が必要なロジック、あるいはWebアプリへの組み込みが必要な場合に最適です。
安全な運用のためのヒント
- 環境の分離:プロジェクト間のライブラリ競合を避けるため、常に仮想環境(
venv)を使用してください。 - 「バックアップ第一」の原則:変更を加える前に、必ずrunning-configをファイルに保存するタスクを実行してください。
- ドライラン(シミュレーション):Pythonのロジックを活用し、実機に投入する前に実行予定のコマンドをプリント出力して確認します。
- セキュリティの徹底:パスワードをテキスト形式で保存するのは厳禁です。環境変数やHashiCorp Vaultなどのソリューションを利用しましょう。
ネットワーク自動化は、決して遠い存在ではありません。Nornirを使い始めることで、プログラマーのような思考が身につきます。これは、次世代のネットワークエンジニアとして価値を高めるための重要なステップとなるでしょう。
