これは ネットワーク自動化 Advent Calendar 2019 の4日目の記事です。
■ はじめに
ネットワーク自動化 Python ライブラリ netmiko は、Cisco、Juniper、Arista など様々なネットワークOSに対応しています。
開発状況を眺めていると、Juniper ScreenOS (SSG) に対応する PR が devel ブランチにマージされていました。
まだ、安定バージョン(次期は netmiko 3?)には組み込まれていませんが、まさか対応するとは思ってなかったので、驚きついでに検証します。
- 環境
- 2019/12/03 時点の netmiko のこのコミット までの develop ブランチ
- 開発途中で仕様が変更される場合があります
- Python 3.6.7
- SSG5 ScreenOS 6.1.0r2.0
- 2019/12/03 時点の netmiko のこのコミット までの develop ブランチ
[2020/02/20 追記] Netmiko 3.0.0 のリリースで本機能が取り込まれました Release Netmiko 3.0.0 Release · ktbyers/netmiko · GitHub
■ 開発版のインストール
開発版をインストールするため、 pip install netmiko
ではなく、以下の方法でインストールします。
$ git clone https://github.com/ktbyers/netmiko.git $ git checkout develop $ cd netmiko/ $ pip3 install -r requirements.txt
これで開発版の netmiko が利用できるようになります。
■ 状態取得
まずは、簡単な情報取得(get
コマンド)を試します。
get route
コマンドを実行して表示する以下のコードを利用します。
一番のポイントは device_type
を juniper_screenos
にすることです。
from netmiko import Netmiko device = { "host": "10.0.0.254", "username": "netscreen", "password": "testpassword", "device_type": "juniper_screenos" } # 接続 net_connect = Netmiko(**device) # コマンド実行 output = net_connect.send_command("get route") print(output) # 切断 net_connect.disconnect()
- 実行結果
$ python ssg_get.py IPv4 Dest-Routes for <untrust-vr> (0 entries) -------------------------------------------------------------------------------------- H: Host C: Connected S: Static A: Auto-Exported I: Imported R: RIP P: Permanent D: Auto-Discovered N: NHRP iB: IBGP eB: EBGP O: OSPF E1: OSPF external type 1 E2: OSPF external type 2 trailing B: backup route IPv4 Dest-Routes for <trust-vr> (3 entries) -------------------------------------------------------------------------------------- ID IP-Prefix Interface Gateway P Pref Mtr Vsys -------------------------------------------------------------------------------------- * 3 0.0.0.0/0 eth0/6 192.168.1.1 S 20 1 Root * 2 10.0.0.254/32 eth0/6 0.0.0.0 H 0 0 Root * 1 192.168.1.0/24 eth0/6 0.0.0.0 C 0 0 Root $
非常に簡単な例ですが、get route
コマンドの結果が表示されました。
補足
- 自動化操作時に邪魔になってしまうページャーは、内部的に
set console page 0
を実行して無効にしているようです。ただ、もとに戻すことはしていない・・? - TextFSM のテンプレートとして、ntc-templates に、ScreenOS の
get route
コマンド向けのものがあるので、組み合わせるのも良いかもしれません。netmiko と TextFSM は簡単に連携できます。
■ 設定
次に、設定変更(set
コマンド)を試します。
実行したいコマンドをコード内に定義する方法と、実行したいコマンドを記述した別ファイルを読み込む方法をそれぞれ試します。
方法1: コマンドをコード内に定義して実行
send_config_set
に、実行したいコマンドのリストを渡して実行します。
ここでは アドレスオブジェクト3つを追加するコマンドを実行します。
save_config
で save config
コマンドが実行されます。
from netmiko import Netmiko device = { "host": "10.0.0.254", "username": "netscreen", "password": "testpassword", "device_type": "juniper_screenos" } config_commands = [ 'set address "Trust" "web1" 192.168.1.81 255.255.255.255', 'set address "Trust" "web2" 192.168.1.82 255.255.255.255', 'set address "Trust" "web3" 192.168.1.83 255.255.255.255' ] net_connect = Netmiko(**device) # 設定コマンド実行 net_connect.send_config_set(config_commands) # コンフィグの保存(save config コマンドの実行) net_connect.save_config() # 切断 net_connect.disconnect()
- 実行結果
$ python ssg_config.py $
実機を確認します。
SSG5-> get config | inc "set address" get config | inc "set address" set address "Trust" "web1" 192.168.1.81 255.255.255.255 set address "Trust" "web2" 192.168.1.82 255.255.255.255 set address "Trust" "web3" 192.168.1.83 255.255.255.255 SSG5->
無事に、web1
、web2
、web3
が追加され、設定が反映されました。
方法2: コマンドをファイルに定義して実行
今度は、実行したいコマンドを記述した別ファイルを用意し、send_config_from_file
で読み込んで実行します。
from netmiko import Netmiko device = { "host": "10.0.0.254", "username": "netscreen", "password": "testpassword", "device_type": "juniper_screenos" } net_connect = Netmiko(**device) # config file net_connect.send_config_from_file("config.txt") # コンフィグの保存(save config コマンドの実行) net_connect.save_config() # 切断 net_connect.disconnect()
実行したいコマンドのファイル(ここでは config.txt
)は以下のとおりです。
set address "Trust" "web4" 192.168.1.84 255.255.255.255 set address "Trust" "web5" 192.168.1.85 255.255.255.255
- 実行結果
$ python ssg_config_from_file.py $
実機を確認します。
SSG5-> get config | inc "set address" set address "Trust" "web1" 192.168.1.81 255.255.255.255 set address "Trust" "web2" 192.168.1.82 255.255.255.255 set address "Trust" "web3" 192.168.1.83 255.255.255.255 set address "Trust" "web4" 192.168.1.84 255.255.255.255 set address "Trust" "web5" 192.168.1.85 255.255.255.255 SSG5->
無事に、web4
、web5
が追加され、設定が反映されました。
■ まとめ
開発版の netmiko で SSG (Juniper ScreenOS)に対して、情報取得と設定変更を試しました。
いずれも、device_type
を juniper_screenos
にすることがポイントでした。
おそらくこのまま、次期バージョンにもマージされると思います。
この手のツールで、ScreenOS に対応しているものは珍しいと思うので、実は待ってた、という方もいらっしゃるのではないかなと思いました。