たそ@ITインフラ初心者

taso@初心者エンジニア

新卒2年目 エンジニアが適当に語るブログてす

napalmを使ってみた。

始めてに

こんにちは たそ(@taso_int)です。
11月になりました。なんか暑いのか寒いのかわからない気温ですね。
先週母校の学園祭に顔出してきました。
みんな社会人の意識を持ってるなと感じました。
今日はWindows環境でnapalmを使ってCiscoのSandbox上へコマンドを実行します。

napalmとは

napalmとは、Network Automation and Programmability Abstraction Layer with Multivendor support
の略で、ネットワーク機器の設定や情報を取得するためのPythonライブラリです。
Multivendor supportと言われている通り、様々なルータベンダーに対応しております。
ドキュメントはこちら

napalm.readthedocs.io

windowsでvenv環境を作成する

これはnetmikoで紹介したものと同じ手順です。 venvの作成(すでにvenv環境がある場合は作成不要です。)

python -m venv venv

venvのアクティベート

.venv\Scripts\activate.ps1

セキュリティエラーが出る場合は管理者権限でpowerShellを実行し、
以下のコマンドを実行し、スクリプトの実行を許可する(初回のみ)

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force

napalmのインストール

pipのアップグレードおよびnapalmのインストール

pip install --upgrade pip
pip install napalm

napalmのバージョン3.3.1がインストールされ、 その他必要なnetmikoやparamikoなどもインストールされます。

napalmで接続してみる

実際にnapalmで接続をしてみましょう。
コード

from napalm import get_network_driver
# 接続するベンダーの指定 今回はios junosとかを記述
driver = get_network_driver('ios')
# ログイン機器の情報 ホスト名,ユーザー名,パスワードの順で記述
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')
# 接続する
devnet.open()

# ネットワーク機器の詳細の取得
ios_output = devnet.get_facts()
print(ios_output)

# ネットワーク機器のインターフェイスについて
ios_output = devnet.get_interfaces()
print(ios_output)

devnet.close()

実行してみましょう。
f:id:taso_int:20211108002028p:plain

実行は出来ましたが、出力表示がイマイチですね。
出力表示を見やすくするにはライブラリを使用して形式を変えましょう。
pprintやjsonを使ってみましょう。

pprintバージョン

from napalm import get_network_driver
# pprintの適応
from pprint import pprint
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
pprint(ios_output)

ios_output = devnet.get_interfaces()
pprint(ios_output)

devnet.close()

結果がこちら だいぶ見やすくなりました。 f:id:taso_int:20211108002101p:plain

jsonバージョン

import json
from napalm import get_network_driver
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
print(json.dumps(ios_output, indent=4))

ios_output = devnet.get_interfaces()
print(json.dumps(ios_output, indent=4))

devnet.close()

結果がこちら Json形式になってますね。
f:id:taso_int:20211108002123p:plain

configの適用

接続ができたら次は設定がしたくなりますね。
loopbackインタフェースを追加してみたいと思います。
コード

from napalm import get_network_driver
from pprint import pprint
driver = get_network_driver('ios')
devnet = driver('sandbox-iosxe-latest-1.cisco.com', 'developer' ,'C1sco12345')

devnet.open()

ios_output = devnet.get_facts()
pprint(ios_output)

# 参照先ファイル名(相対パス)
# 中身
# int loopback 99
# ip add 99.99.99.99 255.255.255.255
devnet.load_merge_candidate(filename='automation\set_loopback.cfg')

ios_output = devnet.get_facts()
pprint(ios_output)

#コンフィグの差分表示
pprint(devnet.compare_config())

#コンフィグの反映
devnet.commit_config()

ios_output = devnet.get_facts()
pprint(ios_output)

devnet.close()

load_templateを使う予定だったのですが参照ファイルが読めずに断念しました。(理由わからず)
代わりとしてload_merge_candidateを利用
設定の変化が見たかったのでget_factsを乱立させました。

結果がこちら
f:id:taso_int:20211108002146p:plain ちょっと見づらいですが、コンフィグの反映を行うまでは設定が反映されてないですね。
commit_config後に反映されています。

以上となります。
napalmは結構Ansibleに似てる気がしますね。今まで触った中では一番似てる感じが、
次はsubprocessかnornirかopenpyxlかのどれかをやります。
ここまで読んでいただきありがとうございました。