Junos PyEZを使用してJunosデバイスに接続する
Junos PyEZアプリケーションでさまざまな接続方法とプロトコルを使用して、Junosデバイスまたは接続されたコンソールサーバーに接続します。
Junos PyEZは、Junosデバイスを管理できるPython用のJunosマイクロフレームワークです。Junos PyEZは、各デバイスを jnpr.junos.device.Deviceクラス のインスタンスとしてモデル化します。 Device クラスでは、シリアルコンソール接続、Telnet、またはSSH経由のNETCONFセッションを使用してJunosデバイスに接続できます。Junos PyEZは、コンソールサーバーへのTelnetまたはSSH接続を介したデバイスへの接続もサポートしています。コンソールサーバーは、ターミナルサーバーとも呼ばれ、デバイスの帯域外管理コンソールポートへのネットワーク接続を提供する特殊なデバイスです。さらに、Junos PyEZ を使用して、要塞やジャンプ ホストなどの中間デバイスを介して Junos デバイスに接続することもできます。
このトピックでは、Junos PyEZでサポートされている接続方法の概要と、さまざまな方法を使用してJunosデバイスに接続する方法について説明します。Junos PyEZの例ではさまざまな認証方法を使用していますが、ユーザー認証の詳細については、 Junos PyEZユーザーの認証を参照してください。
接続方法の概要
Junos PyEZでは、シリアルコンソール接続、telnet、またはSSH経由のNETCONFセッションを使用して、Junosデバイスに接続できます。デバイスの コンソール ポートに物理的に接続している場合は、シリアル コンソール接続を使用する必要があります。telnet または SSH を使用して、デバイスの管理インターフェイス、またはデバイスの CONSOLE ポートに接続されているコンソール サーバーに接続できます。Junos PyEZは、要塞ホストまたはジャンプホストを介したデバイスへのSSH接続もサポートしています。さらに、Junos PyEZはアウトバウンドSSH接続をサポートしており、この接続ではJunosデバイスがクライアント管理アプリケーションとの接続を開始します。
工場出荷時のデフォルト設定の新規デバイスまたはゼロ化されたデバイスには、コンソール接続からアクセスする必要があります。Junos PyEZを使用して、リモートアクセス用にまだ構成されていないデバイスを最初に構成できます。デバイスに直接接続している場合はシリアルコンソール接続を使用するか、デバイスに接続されているコンソールサーバーを介してtelnetまたはSSHを使用することができます。
デフォルトでは、Junos PyEZはSSHを使用してデバイスに接続します。別の接続タイプを指定するには、Device引数リストにmodeパラメーターを含める必要があります。デバイスにtelnetするには、引数mode='telnet'を含めます。シリアルコンソール接続を使用してデバイスに接続するには、mode='serial'引数を含めます。表1は、Junos PyEZの接続方法、特定のパラメーターのデフォルト値、および必要なJunos OS設定をまとめたものです。
|
接続モード |
引数 |
デフォルトポート |
必要なJunos OS設定 |
|---|---|---|---|
|
SSHを介したNETCONF(デフォルト) |
– |
830 |
[edit system services]
netconf {
ssh;
}
|
|
シリアルコンソール接続 |
シリアル |
/dev/ttyUSB0 |
– |
|
Telnet から Junos デバイス |
Telnet |
23 |
[edit system services] telnet; |
|
コンソール サーバー経由の Telnet |
Telnet |
23 |
– |
|
コンソールサーバーを介したSSH |
– |
22 |
– |
|
ジャンプホストを介したSSH |
– |
22 |
[edit system services]
netconf {
ssh;
}
|
|
アウトバウンドSSH |
– |
– |
[edit system services]
outbound-ssh {
...
}
|
Telnet または NETCONF over SSH を使用してデバイスの管理インターフェイスにアクセスする前に、まず [edit system services] 階層レベルで適切なサービスを有効にする必要があります。詳細については、「 Junos PyEZマネージドノードの設定」を参照してください。Telnet はクリアテキストパスワードを使用するため(セキュリティ上の潜在的な脆弱性が生じる可能性があるため)、SSH の使用を推奨します。
環境に適した安全な方法で資格情報を取得します。ベストプラクティスとして、認証情報を暗号化されていない形式で保存するのではなく、スクリプトを実行するたびに認証情報の入力を求めます。
Junos PyEZ は、コンテキスト マネージャー (with ...as 構文)を使用します。コンテキストマネージャーを使用すると、Junos PyEZはデバイスへの接続と切断のために open() メソッドと close() メソッドを自動的に呼び出します。コンテキストマネージャーを使用しない場合は、アプリケーションで open() メソッドと close() メソッドを明示的に呼び出す必要があります。コンソール接続にはコンテキストマネージャーを使用することをお勧めします。コンテキストマネージャーは接続の閉鎖を自動的に処理しますが、接続を閉じないと予期しない結果が生じる可能性があります。
Junos PyEZ接続プロパティについて
Junosデバイスに接続すると、Junos PyEZは現在の接続に関する情報を Device インスタンスのプロパティとして保存します。 表2は 、使用可能な接続プロパティの概要を示しています。
|
プロパティ |
タイプ |
説明 |
|---|---|---|
|
|
ブール値 |
接続の現在の状態。接続されると |
|
|
文字列 |
アプリケーションが接続されているデバイスのホスト名。 |
|
|
ブール値 |
アプリケーションが接続されているルーティングエンジンがプライマリルーティングエンジンである場合に |
|
|
整数または文字列 |
接続に使用するポート。 |
|
|
文字列 |
アプリケーションが接続されているルーティングエンジン名。 |
|
|
整数 |
秒単位のRPCタイムアウト値。 |
|
|
整数 |
現在のルーティングエンジンが起動されてからの秒数。 |
|
|
文字列 |
Junosデバイスにアクセスするユーザー。 |
たとえば、デバイスに接続した後、 connected プロパティを照会して、接続の現在の状態を返すことができます。 SessionListener はセッションを監視し、 TransportError 例外を発生させ、 Device.connected プロパティを False に設定することで、トランスポート エラーに対応します。
次のサンプル コードでは、Junos デバイスへの接続後とセッションを閉じた後に connected プロパティの値を出力します。
from jnpr.junos import Device dev = Device(host='router.example.net') dev.open() print (dev.connected) dev.close() print (dev.connected)
プログラムを実行すると、 connected プロパティは、アプリケーションがデバイスに接続されている間は True を返し、接続が閉じられた後は False を返します。
user@host:~$ python connect.py True False
SSHを使用してデバイスに接続する
Junos PyEZ Device クラスは、SSH を使用した Junos デバイスへの接続をサポートしています。Junos PyEZは、以下の接続をサポートしています。
-
デバイスの管理インターフェイスに直接接続します
-
デバイスの コンソール ポートに直接接続されたコンソールサーバーを介して接続します
-
要塞またはジャンプホストを介して接続する
SSHサーバーは、「 Junos PyEZユーザーの認証」で説明されているように、標準のSSH認証メカニズムを使用してユーザーを認証できる必要があります。SSH経由でNETCONFセッションを確立するには、「 Junos PyEZマネージドノードの設定」で説明されている要件も満たす必要があります。
SSH を使用してデバイスに接続する場合、Junos PyEZ はまず SSH 公開鍵ベースの認証を試み、次にパスワードベースの認証を試みます。パスワードベースの認証を使用する場合、提供されたパスワードがデバイスパスワードとして使用されます。SSHキーが使用されている場合、提供されたパスワードがプライベートキーのロックを解除するためのパスフレーズになります。SSHキーエージェントにキーをロードする場合、またはSSHプライベートキーのパスフレーズが空の場合は、パスワードを指定する必要はありません。ただし、空のパスフレーズでSSHプライベートキーを使用することはお勧めしません。
Junos PyEZは、~/.ssh/configにあるデフォルトのSSH設定ファイル(存在する場合)に自動的にクエリーを実行します。Junos PyEZは、ユーザーやアイデンティティファイルなど、Device引数によって上書きされないSSH設定ファイルの関連設定を使用します。別のSSH設定ファイルを使用するには、Deviceを定義する際にファイルパスにssh_configを設定します。次に例を示します。
ssh_config_file = "~/.ssh/config_dc"
dev = Device(host='router1.example.com', ssh_config=ssh_config_file)
Junos PyEZ リリース 2.7.2 以降、Junos PyEZ クライアントは、Junos デバイスに接続するときに SSH ホストキー検証を有効にできるようになりました。クライアントは、デバイスのホストキーフィンガープリントが、クライアントの known_hosts ファイル内の信頼できるキーと一致することを検証して、リモートデバイスのIDを検証します。提示されたホストキーが信頼できるキーと一致しない場合、接続は拒否されます。該当する場合は、ホストキー検証を使用して、中間者攻撃を防止します。
デフォルトでは、Junos PyEZはSSHホストキー検証を無効にし、サーバーの公開キーをクライアントのknown_hostsファイルに登録しなくても接続を続行できるようにします。ホストキーの検証を有効にするには、Deviceを定義するときにhostkey_verify=Trueを含めます。ホストキーの検証を有効にした場合、デバイスに接続する前に、デバイスのホストキーをknown_hostsファイルに読み込む必要があります。それ以外の場合、接続に失敗します。
dev = Device(host='router1.example.com', hostkey_verify=True)
次のセクションでは、SSHを使用してデバイスに接続するさまざまな方法について説明します。
デバイスに直接接続する
Junos PyEZでは、Junos OSを実行しているデバイスまたはJunos OS Evolvedを実行しているデバイスに直接接続できます。 Device オブジェクトをインスタンス化するときに、ターゲットデバイスのホスト名またはIPアドレス、および必要なユーザー資格情報を指定します。
Junos PyEZクライアントが、構成管理サーバー(CMS)上の特定のローカル送信元IPアドレスを使用して接続を確立する必要がある場合、 bind_addr 引数を含めてアドレスを指定できます。例えば、CMSが複数のネットワークインターフェイスとIPアドレスを使用していて、ネットワークデバイスから到達できるアドレスのサブセットしかない場合など、接続用のローカル送信元アドレスの設定が必要になることがあります。
JunosデバイスとのSSH経由でNETCONFセッションを確立し、デバイスのファクトを出力するJunos PyEZアプリケーションを作成するには:
-
Deviceクラスと、タスクに必要なその他のモジュールまたはオブジェクトをインポートします。import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError
-
デバイスインスタンスを作成し、ホスト名、認証に必要なパラメーター、オプションのパラメーターを指定します。
hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password)
-
(オプション)Junosデバイスがデフォルト(830)以外のポートでNETCONFを設定する場合は、
port引数を含めてポートを指定します。dev = Device(host=hostname, user=junos_username, passwd=junos_password, port=50001)
-
(オプション)接続の確立に使用するローカル送信元アドレスを指定する必要がある場合は、
bind_addr引数を含み、使用するIPアドレスを指定します。dev = Device(host=hostname, user=junos_username, passwd=junos_password, bind_addr=10.10.10.1)
-
たとえば、
open()メソッドを呼び出してデバイスに接続します。try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
-
デバイスのファクトを印刷します。
print (dev.facts)
-
必要なタスクを実行した後、デバイスへの接続を閉じます。
dev.close()
ここでは、サンプル・プログラムの全文 (オプション・パラメータは省略) を示します。
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password) try: dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
または、デバイスに接続するときにコンテキストマネージャーを使用することもできます。コンテキストマネージャーは、 open() メソッドと close() メソッドを自動的に呼び出します。次に例を示します。
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS or SSH key password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
コンソールサーバーを介してデバイスに接続する
Junos PyEZクライアントは、コンソールサーバーへのSSH接続を介してJunosデバイスに接続できます。この場合、コンソールサーバーとJunosデバイスの両方のログイン資格情報を指定する必要があります。 Device 引数リストで、 cs_user 引数と cs_passwd 引数にコンソールサーバーの資格情報を含めます。SSHキーを使用している場合は、 cs_passwd 引数をプライベートキーのパスフレーズを含む変数に設定します。さらに、該当する場合は、 port 引数をTTYデバイスにマッピングするTCPポートに設定します。
コンソールサーバーはシリアル接続を介してJunosデバイスに接続しますが、これは遅くなることがあります。コンソール サーバーを介した Junos PyEZ 接続のデフォルト接続タイムアウト値は 0.5 秒です。クライアントアプリケーションが接続を確立するのに十分な時間を確保するには、 timeout=seconds 引数を含めて接続タイムアウト間隔を増やす必要がある場合があります。
次の Junos PyEZ の例では、コンソール サーバー、次に Junos デバイスで認証します。接続タイムアウトは、クライアントが接続を確立するのに十分な時間を確保するために、6秒に設定されています。
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.exception import ConnectError hostname = input("Console server hostname: ") cs_username = input("Console server username: ") cs_password = getpass("Console server or SSH key password: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") port = input("Port number: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, cs_user=cs_username, cs_passwd=cs_password, port=port, timeout=6) as dev: print (dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) sys.exit(1) except Exception as err: print (err) sys.exit(1)
要塞またはジャンプ ホストを介してデバイスに接続する
Junos PyEZでは、中間ホスト(要塞ホストまたはジャンプホスト)を介してターゲットデバイスにアクセスできます。ターゲットデバイスに直接ログインできない場合は、要塞ホストまたはジャンプホストの使用が必要になることがあります。たとえば、デバイスがファイアウォールの内側にある場合があります。
SSHを使用して中間デバイスを介して接続するには、以下のいずれかのオプションを使用できます。
-
SSH設定ファイルで、ターゲットデバイスのエントリを追加し、ProxyCommandオプションを指定します。
-
Device引数リストに、proxy_commandパラメーターを含めます。
Device proxy_command引数は、SSH設定ファイルのProxyCommandオプションよりも優先されます。両方のオプションを設定する場合、Junos PyEZ は proxy_command 引数のみを使用します。次のセクションでは、各オプションの使用方法について詳しく説明します。
例:SSH設定ファイルでProxyCommandを使用する
SSH設定ファイルで要塞ホストまたはジャンプホストを設定するには、Junosホストのエントリを追加し、ProxyCommandオプションを含めます。ProxyCommand 文字列は、中間デバイスへの接続を定義します。例えば、以下の設定は、netcatをサポートする中間ホストを介して接続します。
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -l user1 192.168.1.1 nc %h 22 2>/dev/null
同様に、以下の設定では、中間デバイスを介してターゲットホストとポートにクワイエットモードで接続します。これにより、警告が抑制されます。
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -W %h:%p -q jumphost.example.com
例: Device proxy_command引数を使用する
Deviceを定義する際には、proxy_command引数を含めて、中間デバイスを介して接続することができます。proxy_command文字列は、要塞ホストまたはジャンプ ホストへの接続を定義します。必要に応じて、Junos PyEZはジャンプホストのパスワードまたはSSHプライベートキーパスフレーズの入力を求めます。
次の例では、ジャンプ ホストを介して Junos デバイスに接続します。この例では、Junos PyEZは、SSHキーエージェントにロードされたパスフレーズで保護されたSSHキーを使用して、各デバイスで認証します。
from jnpr.junos import Device junos_host = "198.51.100.1" with Device(host=junos_host, proxy_command="ssh -W %h:%p -q user1@192.168.1.1") as dev: print(dev.facts)
SSHキーエージェントでジャンプホストとネットワークデバイスのSSHキーを読み込む場合、Junos PyEZアプリケーションでプライベートキーパスやパスフレーズを指定する必要はありません。ただし、必要なキーをSSHキーエージェントにロードしない場合は、デフォルト以外の場所にあるパスフレーズで保護されたキーのパスとパスフレーズを提供する必要があります。 ssh_private_key_file 引数と password 引数は、Junosデバイスでの認証に使用する秘密鍵のパスとパスフレーズを指定します。 proxy_command 引数で、 -i path オプションを使用して、ジャンプホストとの認証に使用するプライベートキーのパスを指定します。スクリプトを実行すると、Junos PyEZは対応するプライベートキーパスフレーズの入力を求めます。次に例を示します。
from jnpr.junos import Device from getpass import getpass junos_host = "198.51.100.1" passwd = getpass("SSH key passphrase for network device: ") dev = Device( host=junos_host, passwd=passwd, ssh_private_key_file="/home/user1/.ssh/id_rsa_junos", proxy_command="ssh -i /home/user1/.ssh/id_rsa_jump -W %h:%p -q 192.168.1.1" ) dev.open() print(dev.facts) dev.close()
スクリプトを実行すると、スクリプトはプライベートキーのパスフレーズの入力を求めます。
user1@server:~$ python junos-pyez-proxy-command.py
Network device SSH key password:
Enter passphrase for key '/home/user1/.ssh/keys/id_rsa_jump':
{'2RE': True, 'HOME': '/var/home/user1', 'RE0': {'mastership_state': 'Master', 'status': 'OK', 'model': 'RE VIRTUAL', 'last_reboot_reason': 'Unknown', 'up_time': '29 days, 23 hours, 11 minutes, 42 seconds'}, 'RE1': {'mastership_state': 'Backup', 'status': 'OK', 'model': 'RE VIRTUAL', 'last_reboot_reason': 'Unknown', 'up_time': '29 days, 23 hours, 9 minutes'},
[...output omitted...]
アウトバウンド SSH を使用してデバイスに接続する
クライアントが接続を開始しようとすると(デバイスがファイアウォールの内側にある場合など)、ブロックされるクライアント管理アプリケーションとのTCP/IP接続を開始するようにJunosデバイスを設定できます。 outbound-ssh 設定は、クライアント管理アプリケーションとのTCP/IP接続を作成し、デバイスのIDを転送するようにデバイスに指示します。接続が確立されると、管理アプリケーションがクライアントとして機能してSSHシーケンスを開始し、Junosデバイスがサーバーとして機能してクライアントを認証します。
JunosデバイスでアウトバウンドSSHを設定してコミットすると、デバイスはコミットされた設定に基づいてアウトバウンドSSH接続を開始します。デバイスは、成功するまでこの接続の作成を繰り返し試みます。デバイスとクライアント管理アプリケーション間の接続が切断された場合、デバイスは成功するまで新しいアウトバウンドSSH接続の作成を再試行します。この接続は、アウトバウンドSSH設定が削除または非アクティブ化されるまで維持されます。
アウトバウンド SSH 接続用に Junos デバイスを設定するには、[edit system services] 階層レベルで outbound-ssh ステートメントを含めます。次の例では、Junosデバイスがポート2200の198.51.100.101にあるホストとの接続を開始しようとします。
user@router1> show configuration system services outbound-ssh
client nms1 {
device-id router1;
secret "$9abc123"; ## SECRET-DATA
services netconf;
198.51.100.101 port 2200;
}
アウトバウンドSSHを使用してJunosデバイスとの接続を確立するために、Junos PyEZアプリケーションは、Deviceコンストラクタのsock_fd引数を既存のソケットのファイル記述子と等しく設定し、host引数を省略するか、Noneに設定します。
次の Junos PyEZ の例では、設定された TCP ポートで Junos デバイスからの受信 SSH セッションをリッスンします。アプリケーションは着信接続を受け入れ、その接続のソケットのファイル記述子を取得し、 sock_fd 引数の値に使用されます。クライアントアプリケーションは、デバイスとのSSH接続を確立し、デバイスのファクトを収集して出力し、デバイスからの接続を切断し、さらなる接続を待ちます。
import socket from jnpr.junos import Device from jnpr.junos.exception import ConnectError from getpass import getpass from pprint import pprint """ Listen on TCP port 2200 for incoming SSH session from a Junos device. After the device connects, collect and print the devices facts. Then disconnect from that device and wait for more connections. """ def launch_junos_proxy(client, addr): val = { 'MSG-ID': None, 'MSG-VER': None, 'DEVICE-ID': None, 'HOST-KEY': None, 'HMAC': None } msg = '' count = 0 while count < 5: c = client.recv(1) c = c.decode("utf-8") msg += str(c) if c == '\n': count += 1 for line in msg.splitlines(): (key, value) = line.split(': ') val[key] = value print("{}: {}".format(key, val[key])) return client.fileno() def main(): PORT = 2200 junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ') s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', PORT)) s.listen(5) print('\nListening on port %d for incoming sessions ...' % (PORT)) sock_fd = 0 while True: client, addr = s.accept() print('\nGot a connection from %s:%d' % (addr[0], addr[1])) sock_fd = launch_junos_proxy(client, addr) print('Logging in ...') try: with Device(host=None, sock_fd=sock_fd, user=junos_username, passwd=junos_password) as dev: pprint(dev.facts) except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) if __name__ == "__main__": main()
user@nms1:~$ python junos-pyez-outbound-ssh.py
Junos OS username: user
Junos OS password:
Listening on port 2200 for incoming sessions ...
Got a connection from 10.10.0.5:57881
MSG-ID : DEVICE-CONN-INFO
MSG-VER : V1
DEVICE-ID : router1
HOST-KEY : ssh-rsa AAAAB...0aF4Mk=
HMAC : 4e61201ec27a8312104f63bfaf77a4478a892c82
Logging in ...
{'2RE': True,
'HOME': '/var/home/user',
'RE0': {'last_reboot_reason': 'Router rebooted after a normal shutdown.',
'mastership_state': 'master',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '2 days, 6 hours, 22 minutes, 22 seconds'},
'RE1': {'last_reboot_reason': 'Router rebooted after a normal shutdown.',
'mastership_state': 'backup',
'model': 'RE-MX-104',
'status': 'OK',
'up_time': '2 days, 6 hours, 22 minutes, 12 seconds'},
'RE_hw_mi': False,
'current_re': ['re0', 'master', 'node', 'fwdd', 'member', 'pfem'],
'domain': 'example.com',
'fqdn': 'router1.example.com',
'hostname': 'router1',
...
JunosデバイスでのアウトバウンドSSHの設定に関する詳細については、 アウトバウンドSSHサービスの設定を参照してください。
Telnet を使用してデバイスに接続する
Junos PyEZ Deviceクラスは、ネットワークデバイスへの暗号化されていないアクセスを提供するTelnetを使用したJunosデバイスへの接続をサポートしています。デバイスの管理インターフェイス、またはデバイスの CONSOLE ポートに直接接続されているコンソール サーバーに telnet 接続できます。管理インターフェイスへのアクセスを必要とするすべてのデバイスで、[edit system services]階層レベルでtelnetステートメントを設定する必要があります。コンソール サーバーを介してデバイスにアクセスすると、リモート アクセス用にまだ構成されていない新しいデバイスまたはゼロ化されたデバイスを最初に構成できます。
Junos PyEZを使用してJunosデバイスにtelnetするには、Device引数リストにmode='telnet'を含め、オプションでポートを指定するportパラメーターを含める必要があります。mode='telnet'を指定してportパラメーターを省略すると、portの値はデフォルトで23になります。アプリケーションがコンソールサーバーを介して接続する場合、コンソールサーバーがJunosデバイスに接続するポートを指定します。
Junos PyEZを使用してJunosデバイスにtelnetし、デバイスの事実を印刷するには:
ここでは、サンプルプログラムの全文を紹介します。
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") dev = Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port=23) try: dev.open() except Exception as err: print (err) sys.exit(1) print (dev.facts) dev.close()
または、デバイスに接続時にコンテキストマネージャーを使用して、接続のオープンとクローズを処理することもできます。次に例を示します。
import sys from getpass import getpass from jnpr.junos import Device hostname = input("Device hostname: ") junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(host=hostname, user=junos_username, passwd=junos_password, mode='telnet', port=23) as dev: print (dev.facts) except Exception as err: print (err) sys.exit(1)
場合によっては、バナーメッセージを出力するコンソールサーバーに接続する場合、メッセージの後に Enter キーを押してログインプロンプトに到達する必要がある場合があります。この場合、アプリケーションがログイン プロンプトを受信できず、接続がハングする可能性があります。
Junos PyEZリリース2.6.2以降、Junos PyEZはコンソールサーバーのバナーを自動的に処理します。Junos PyEZ リリース 2.1.0 から 2.6.1 では、Junos PyEZ アプリケーションは、バナーメッセージを出力するコンソールサーバーを処理するために、Device引数リストにconsole_has_banner=Trueを含めることができます。
dev = Device(host=hostname, user=username, passwd=password, mode='telnet', port=port, console_has_banner=True)
console_has_banner=True引数を含める場合、初期接続時にアプリケーションがログイン プロンプトを受信しない場合、アプリケーションは 5 秒間待機します。その後、アプリケーションは改行 (\n) 文字を出力し、コンソールサーバーからログインプロンプトが発行されます。引数を省略して接続がハングした場合、アプリケーションは代わりに <close-session/> RPC を発行して接続を終了します。
シリアルコンソール接続を使用してデバイスに接続する
Junos PyEZ Device クラスでは、シリアルコンソール接続を使用してJunosデバイスに接続できます。シリアルコンソール接続は、リモートアクセス用にまだ設定されていない新しいデバイスまたはゼロ化されたデバイスを最初に設定する必要がある場合に便利です。この接続方法を使用するには、 CONSOLE ポートを介してデバイスに物理的に接続する必要があります。デバイスの コンソール ポートへの接続に関する詳細な手順については、特定のデバイスのハードウェア マニュアルを参照してください。
Junos PyEZは、シリアルコンソール接続でのコンテキストマネージャーの使用をサポートしています。コンソール接続にはコンテキストマネージャーを使用することをお勧めします。コンテキストマネージャーは接続のオープンとクローズを自動的に処理するためです。接続を閉じないと、予期しない結果が生じる可能性があります。
Junos PyEZを使用してシリアルコンソール接続を介してJunosデバイスに接続するには、Device引数リストにmode='serial'を含める必要があります。オプションで port パラメーターを含めてポートを指定することができます。mode='serial' を指定して port パラメーターを省略すると、port の値はデフォルトで /dev/ttyUSB0 になります。
Junos PyEZを使用して、シリアルコンソール接続を使用してJunosデバイスに接続し、設定をロードしてコミットするには:
ここでは、サンプルプログラムの全文を紹介します。
import sys from getpass import getpass from jnpr.junos import Device from jnpr.junos.utils.config import Config junos_username = input("Junos OS username: ") junos_password = getpass("Junos OS password: ") try: with Device(mode='serial', port='port', user=junos_username, passwd=junos_password) as dev: print (dev.facts) cu = Config(dev) cu.lock() cu.load(path='/tmp/config_mx.conf') cu.commit() cu.unlock() except Exception as err: print (err) sys.exit(1)