始めてに
こんにちは たそ(@taso_int)です。
11月になりました。なんか暑いのか寒いのかわからない気温ですね。
先週母校の学園祭に顔出してきました。
みんな社会人の意識を持ってるなと感じました。
今日はWindows環境でnapalmを使ってCiscoのSandbox上へコマンドを実行します。
napalmとは
napalmとは、Network Automation and Programmability Abstraction Layer with Multivendor support
の略で、ネットワーク機器の設定や情報を取得するためのPythonライブラリです。
Multivendor supportと言われている通り、様々なルータベンダーに対応しております。
ドキュメントはこちら
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()
実行してみましょう。
実行は出来ましたが、出力表示がイマイチですね。
出力表示を見やすくするにはライブラリを使用して形式を変えましょう。
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()
結果がこちら だいぶ見やすくなりました。
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形式になってますね。
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を乱立させました。
結果がこちら
ちょっと見づらいですが、コンフィグの反映を行うまでは設定が反映されてないですね。
commit_config後に反映されています。
以上となります。
napalmは結構Ansibleに似てる気がしますね。今まで触った中では一番似てる感じが、
次はsubprocessかnornirかopenpyxlかのどれかをやります。
ここまで読んでいただきありがとうございました。