Junos PyEZの使用開始

現在、ネットワーク自動化のトピックは非常に人気があります。 ジュニパーネットワークスのこのような自動化のためのツールの1つは、ジェレミー・シュルマンのチームによって開発されたPyEZライブラリです。 PyEZは、Pythonで記述されたジュニパーデバイスのリモート制御および自動化のためのマイクロフレームワークです。 PyEZの主な利点は、そのシンプルさと、プログラマではなくネットワークエンジニアの対象者に焦点を合わせていることです。



PyEZのいくつかの機能:



この記事では、EX4200スイッチの例に関する運用情報を抽出する可能性について詳しく説明します。



仕事の準備



  1. フレームワーク自体のインストールは、1つのコマンドになります。



    pip install junos-eznc
          
          





    私のUbuntu 14.04では、すべてが問題なくインストールされましたが、突然の場合は公式のwikiページを読むことをお勧めします。

  2. PyEZはNETCONFプロトコルを使用します。これは、ネットワークデバイスにアクセスするために有効にする必要があります。



     set system services netconf ssh
          
          





    NETCONFは、SSHの上で実行されるため、SSHが構成され、デバイスにアクセスするためのアカウントが作成されていることを確認してください。





この段階で、すべての作業の準備ができているはずです。 確認するには、デバイスに接続して基本情報を削除してみてください。



 dteslya@ubuntu:~$ python Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from pprint import pprint >>> from jnpr.junos import Device >>> dev = Device(host='1.2.3.4') >>> dev Device(1.2.3.4) >>> dev.open() Device(1.2.3.4) >>> pprint(dev.facts) {'2RE': True, 'HOME': '/var/home/dteslya', 'RE0': {'last_reboot_reason': 'Router rebooted after a normal shutdown.', 'mastership_state': 'master', 'model': 'EX4200-24F', 'status': 'OK', 'up_time': '2 days, 3 hours, 34 minutes, 40 seconds'}, 'domain': None, 'fqdn': 'SW1', 'hostname': 'SW1', 'ifd_style': 'SWITCH', 'master': 'RE0', 'model': 'EX4200-24F', 'personality': 'SWITCH', 'serialnumber': '', 'switch_style': 'VLAN', 'vc_capable': True, 'version': '12.3R8.7', 'version_RE0': '12.3R8.7', 'version_info': junos.version_info(major=(12, 3), type=R, minor=8, build=7)} >>> dev.close() >>>
      
      







ここで何が起こっているのか説明しましょう。 まず、2つのクラスがインポートされます。フォーマットされた出力用の標準pprintとPyEZライブラリからのデバイスです。 次に、デバイス自体が発表され、接続します。 デバイスを宣言するときは、IPアドレスのみを指定するだけで十分です。その後、キー認証が適用され、ユーザー名は$ USER環境変数から取得されます。 オプションで、パスワードを使用した認証用のユーザー名とパスワードを指定できます(詳細については、再びwikiを参照してください)。 次に、デバイスへの接続と、pprintを使用して表示される「ファクト」のコレクションが表示され、その後、接続が閉じられます。



これで、PyEZを使用したより興味深い例に進むことができます。



問題の声明



スイッチをポーリングし、スパニングツリートポロジに関する情報を削除するタスクを検討してください。 大まかに言うと、スイッチを調べて、各スイッチのポートをSTPステータスでリストする必要があります。



Junos CLI



CLIを使用してこの情報を取得する方法を見てみましょう。



 dteslya@SW1> show spanning-tree interface Spanning tree interface parameters for instance 0 Interface Port ID Designated Designated Port State Role port ID bridge ID Cost ge-0/0/23.0 128:536 128:536 32768.54e032fdeb41 20000 DIS DIS xe-0/1/0.0 128:561 128:691 32768.3c94d5902981 2000 FWD ROOT xe-0/1/2.0 128:563 128:563 32768.54e032fdeb41 2000 FWD DESG {master:0}
      
      







Junos XML



それでは、「本当に」どのように見えるか見てみましょう。 XMLで。

スパニングツリーインターフェイスの表示| 表示xml
 dteslya@SW1> show spanning-tree interface | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/12.3R8/junos"> <stp-interface-information> <stp-instance> <instance-id>0</instance-id> <stp-interfaces junos:style="brief"> <stp-interface-entry> <interface-name>ge-0/0/23.0</interface-name> <port-number junos:format="128:536"> 536 </port-number> <port-priority>128</port-priority> <designated-port-number junos:format="128:536"> 536 </designated-port-number> <designated-port-priority>128</designated-port-priority> <port-cost>20000</port-cost> <port-state>DIS</port-state> <designated-bridge-mac junos:format="32768.54e032fdeb41"> 54e032fdeb41 </designated-bridge-mac> <designated-bridge-priority>32768</designated-bridge-priority> <port-role>DIS</port-role> </stp-interface-entry> <stp-interface-entry> <interface-name>xe-0/1/0.0</interface-name> <port-number junos:format="128:561"> 561 </port-number> <port-priority>128</port-priority> <designated-port-number junos:format="128:691"> 691 </designated-port-number> <designated-port-priority>128</designated-port-priority> <port-cost>2000</port-cost> <port-state>FWD</port-state> <designated-bridge-mac junos:format="32768.3c94d5902981"> 3c94d5902981 </designated-bridge-mac> <designated-bridge-priority>32768</designated-bridge-priority> <port-role>ROOT</port-role> </stp-interface-entry> <stp-interface-entry> <interface-name>xe-0/1/2.0</interface-name> <port-number junos:format="128:563"> 563 </port-number> <port-priority>128</port-priority> <designated-port-number junos:format="128:563"> 563 </designated-port-number> <designated-port-priority>128</designated-port-priority> <port-cost>2000</port-cost> <port-state>FWD</port-state> <designated-bridge-mac junos:format="32768.54e032fdeb41"> <designated-port-priority>128</designated-port-priority> <port-cost>20000</port-cost> <port-state>DIS</port-state> <designated-bridge-mac junos:format="32768.54e032fdeb41"> 54e032fdeb41 </designated-bridge-mac> <designated-bridge-priority>32768</designated-bridge-priority> <port-role>DIS</port-role> </stp-interface-entry> <stp-interface-entry> <interface-name>xe-0/1/0.0</interface-name> <port-number junos:format="128:561"> 561 </port-number> <port-priority>128</port-priority> <designated-port-number junos:format="128:691"> 691 </designated-port-number> <designated-port-priority>128</designated-port-priority> <port-cost>2000</port-cost> <port-state>FWD</port-state> <designated-bridge-mac junos:format="32768.3c94d5902981"> 3c94d5902981 </designated-bridge-mac> <designated-bridge-priority>32768</designated-bridge-priority> <port-role>ROOT</port-role> </stp-interface-entry> <stp-interface-entry> <interface-name>xe-0/1/2.0</interface-name> <port-number junos:format="128:563"> 563 </port-number> <port-priority>128</port-priority> <designated-port-number junos:format="128:563"> 563 </designated-port-number> <designated-port-priority>128</designated-port-priority> <port-cost>2000</port-cost> <port-state>FWD</port-state> <designated-bridge-mac junos:format="32768.54e032fdeb41"> 54e032fdeb41 </designated-bridge-mac> <designated-bridge-priority>32768</designated-bridge-priority> <port-role>DESG</port-role> </stp-interface-entry> </stp-interfaces> </stp-instance> </stp-interface-information> <cli> <banner>{master:0}</banner> </cli> </rpc-reply> {master:0}
      
      





ここでは、PyEZがデバイスから設定および操作(実行状態)情報を抽出するために使用するアプローチについて説明します。 このために、テーブル(テーブル)と選択(ビュー)の概念が紹介されています。 データベースとの類似性を引き出すと、Junosには「運用データベース」があり、これは一連のテーブルで構成されています。 たとえば、show routeコマンドを使用すると、ルーティングテーブルを表示でき、show interfacesコマンドを使用すると、interfacesテーブルを表示できます。 ビュー、つまり、 サンプリングは、テーブルから情報を提示する方法です。 たとえば、show route protocol ospfは、OSPF経由で受信したルートのみを表示します。 ルーティングテーブル全体からの選択。



ヤムル



受信したXMLに戻りましょう。 <stp-interface-entry>要素と、それらに含まれる<interface-name>、<port-state>、および<port-role>要素に興味があります。 これらの要素にアクセスするには、テーブルと選択を定義する必要があります。 これは別のYAMLファイルで行われます。



 --- STPInterfaces: rpc: get-stp-bridge-interface-information item: stp-instance/stp-interfaces/stp-interface-entry key: interface-name view: STPInterfacesView STPInterfacesView: fields: state: port-state role: port-role
      
      







内容を見ていきましょう。



最後に、 STPInterfacesView対象のフィールド定義します。



私の意見では、YAMLファイルを正しくコンパイルすることは、説明されているプロセス全体で最も困難です。 XPathチュートリアルを読むことを強くお勧めします。



Pythonシェル



次に、これをPythonでどのように使用できるかを見てみましょう。 YAMLファイルがstp.ymlとして保存されたとします。

 Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from jnpr.junos import Device >>> from jnpr.junos.factory import loadyaml >>> yml_file = "stp.yml" >>> globals().update(loadyaml(yml_file)) >>> dev = Device(host='1.2.3.4') >>> dev.open() Device(1.2.3.4) >>> tbl = STPInterfaces(dev) >>> tbl.get() STPInterfaces:1.2.3.4: 3 items >>> for key in tbl: ... print key.name, key.role, key.state ... ge-0/0/23.0 DIS DIS xe-0/1/0.0 ROOT FWD xe-0/1/2.0 DESG FWD >>> dev.close() >>>
      
      





CLIと同じポートのリストを取得します。



便利なリンク:






All Articles