てくなべ (tekunabe)

ansible / network automation / 学習メモ

netmiko で Juniper ScreenOS(SSG)の状態取得と設定変更を試してみる


これは ネットワーク自動化 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
      • 次期リリースから、Python 2 系のサポートがなくなり、Python 3.6 以上のみサポートになることが開発者から案内されています
    • SSG5 ScreenOS 6.1.0r2.0

[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_typejuniper_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 コマンド)を試します。

実行したいコマンドをコード内に定義する方法と、実行したいコマンドを記述した別ファイルを読み込む方法をそれぞれ試します。

方法1: コマンドをコード内に定義して実行

send_config_set に、実行したいコマンドのリストを渡して実行します。 ここでは アドレスオブジェクト3つを追加するコマンドを実行します。

save_configsave 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-> 

無事に、web1web2web3 が追加され、設定が反映されました。

方法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-> 

無事に、web4web5 が追加され、設定が反映されました。


■ まとめ

開発版の netmiko で SSG (Juniper ScreenOS)に対して、情報取得と設定変更を試しました。 いずれも、device_typejuniper_screenos にすることがポイントでした。

おそらくこのまま、次期バージョンにもマージされると思います。

この手のツールで、ScreenOS に対応しているものは珍しいと思うので、実は待ってた、という方もいらっしゃるのではないかなと思いました。