Junos PyEZ を使用して設定を取得する
概要 Junosデバイス上の指定された設定データベースから設定データを取得するJunos PyEZアプリケーションを作成できます。
Junos PyEZアプリケーションは、Junosデバイス上でオンデマンドでリモートプロシージャーコール(RPC)を実行できます。クラスのインスタンス Device
を作成した後、アプリケーションはインスタンスのプロパティ Device
として RPC を実行できます。Junos PyEZアプリケーションは、 get_config()
RPCを使用して、ネイティブJunos OS設定と、デバイスに追加された標準(IETF、OpenConfig)またはカスタムYANGデータモデルに対応する設定データの両方について、完全な設定または設定の選択した部分をリクエストできます。
Junos PyEZ get_config
RPC は、Junos XML プロトコル <get-configuration>
操作を呼び出します。 <get-configuration>
操作とそのオプションの詳細については、「 <get-configuration>」を参照してください。
このトピックでは、Junos PyEZ get_config()
RPCを使用して設定を取得する方法について説明します。テーブルとビューを使用して設定データを取得する方法については、次を参照してください: Junos PyEZ設定テーブルを定義する 、および Junos PyEZ設定テーブルを使用して設定データを取得するを参照してください。
完全な候補構成の取得
Junosデバイスから完全な候補構成を取得するには、RPCを実行します get_config()
。デフォルトの出力形式は XML です。例えば:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
構成データのソース データベースを指定する
Junos PyEZ アプリケーションが RPC を使用して get_config()
Junos デバイスから構成情報を取得する場合、デフォルトでは、サーバーは候補の構成データベースからデータを返します。Junos PyEZアプリケーションは、コミットされた設定データベースまたは一時的な設定データベースから設定データを取得することもできます。
候補構成データベース
候補の構成データベースからデータを取得するには、RPC を実行し get_config()
、必要に応じて追加の引数を含めます。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
コミットされた構成データベース
コミットされた設定データベースからデータを取得するには、RPC 呼び出しに と 'database':'committed'
の引数を含めoptions
ますget_config()
。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(options={'database' : 'committed'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
エフェメラル構成データベース
Junos PyEZは、このデータベースをサポートするデバイス上の エフェメラル設定データベース に対する操作をサポートします。共有構成データベースから構成データを取得する場合、既定では、結果には一時的な構成データベースのデータは含まれません。
エフェメラルデータベースは、Junosデバイスで設定更新を実行するための高速なプログラムインターフェイスを提供する代替設定データベースです。一時的な設定データベースは高度な機能であり、誤って使用するとデバイスの動作に深刻な悪影響を与える可能性があります。詳細については、「 エフェメラル構成データベースについて」を参照してください。
エフェメラル構成データベースの既定のインスタンスからデータを取得するには、まず既定のエフェメラル インスタンスを開いてから、データを要求します。既定のインスタンスを開くには、コンテキスト マネージャーを使用してインスタンスを作成し Config
、引数を含め mode='ephemeral'
ます。例えば:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
エフェメラル構成データベースの特定のインスタンスからデータを取得するには、まずエフェメラル インスタンスを開いてから、データを要求します。一時構成データベースのユーザー定義インスタンスを開くには、コンテキスト・マネージャーを使用してインスタンスを作成し Config
、引数を含めて mode='ephemeral'
、引数を ephemeral_instance
一時インスタンスの名前に設定します。
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral', ephemeral_instance='eph1') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
返す構成データの範囲を指定する
Junos PyEZアプリケーションは、完全なJunos OS設定を取得するだけでなく、引数を指定してfilter_xml
RPCを呼び出すget_config()
ことで、設定の特定の部分を取得することができます。このパラメーターはfilter_xml
、返す構成ステートメントを選択するサブツリー フィルターを含む文字列を取ります。サブツリー フィルターは、選択基準に一致する構成データを返します。
複数の階層を要求するには、文字列に filter_xml
ルート要素を含める <configuration>
必要があります。それ以外の場合、 の値は filter_xml
、ルート <configuration>
要素のすぐ下から表示する階層まで、設定階層のすべてのレベルを表す必要があります。サブツリーを選択するには、その階層レベルに空のタグを含めます。特定のオブジェクトを返すには、一致させる要素と値を定義するコンテンツ一致ノードを含めます。
次のJunos PyEZアプリケーションは、候補コンフィギュレーションの および 階層レベルでコンフィギュレーション[edit interfaces]
[edit protocols]
を取得して印刷します。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<configuration><interfaces/><protocols/></configuration>' data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
次の例では、階層レベルで設定 [edit system services]
を取得して出力し、引数に filter_xml
異なるが同等の値を使用します。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='<system><services/></system>') print (etree.tostring(data, encoding='unicode', pretty_print=True)) data = dev.rpc.get_config(filter_xml='system/services') print (etree.tostring(data, encoding='unicode', pretty_print=True)) filter = etree.XML('<system><services/></system>') data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
次の例では、<name>
継承後の候補コンフィギュレーションの階層下にある<interfaces>
各<interface>
要素の要素を取得します。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name/></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-interface-names.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/0</name> </interface> <interface> <name>ge-1/0/1</name> </interface> <interface> <name>lo0</name> </interface> <interface> <name>fxp0</name> </interface> </interfaces> </configuration>
以下の例では、ge-1/0/1インターフェイスのサブツリーを取得します。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name>ge-1/0/1</name></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-single-interface.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/1</name> <description>customerA</description> <disable/> <unit> <name>0</name> <family> <inet> <address> <name>198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> </configuration>
返す構成データの形式を指定する
Junos PyEZ get_config()
RPCは、Junos XMLプロトコル <get-configuration>
操作を呼び出し、Junos OSの設定データをJunos XMLエレメント、CLI設定ステートメント、Junos OS set
コマンド、またはJavaScript Object Notation(JSON)として返すことができます。既定では、RPC は get_config()
構成データを XML として返します。
設定データを返す形式を指定するために、Junos PyEZアプリケーションは引数リストに を含む'format':'format'
辞書を含めoptions
ますget_config()
。CLI 設定ステートメント、Junos OS set
コマンド、または JSON 形式を要求するには、値をtext
それぞれ 、 set
、 json
または に設定しますformat
。
NETCONFやJunos XMLプロトコルのセッションと同様に、Junos PyEZは、そのフォーマットに適したXMLエレメントで囲まれた、想定されるフォーマットで設定データを返します。RPC 応答では、XML 形式、テキスト形式、またはset
コマンド形式の構成データが、それぞれ 、 <configuration-text>
、および <configuration-set>
要素で<configuration>
囲まれます。
from jnpr.junos import Device from lxml import etree from pprint import pprint with Device(host='router1.example.net') as dev: # XML format (default) data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Text format data = dev.rpc.get_config(options={'format':'text'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Junos OS set format data = dev.rpc.get_config(options={'format':'set'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # JSON format data = dev.rpc.get_config(options={'format':'json'}) pprint (data)
Python のバージョンと出力の形式によっては、より人間が判読できる出力を表示するように print ステートメントを変更する必要がある場合があります。
標準またはカスタムのYANGデータモデルの設定データの取得
標準化された、またはカスタムのYANGモジュールをJunosデバイスにロードして、Junos OSではネイティブにサポートされていないが、翻訳によってサポートされているデータモデルを追加できます。候補構成で非ネイティブデータモデルを設定するには、それらのモデルに定義された構文を使用します。設定をコミットすると、データモデルの変換スクリプトがそのデータを変換し、対応するJunos OS設定をチェックアウト設定の一時的な変更としてコミットします。
候補コンフィギュレーションとアクティブ・コンフィギュレーションには、非ネイティブのYANGデータ・モデルの設定データが、それらのモデルで定義された構文で含まれています。Junos PyEZアプリケーションは、RPCに get_config()
適切な引数を含めることで、ネイティブのJunos OS設定を取得するだけでなく、標準およびカスタムYANGデータモデルの設定データを取得することができます。既定では、非ネイティブ構成データは RPC 応答に含まれ get_config()
ません。
Junos OS の設定の取得に加えて、非ネイティブの YANG データ モデルで定義された設定データを取得するには、引数を指定して model
RPC を実行しget_config()
、必要に応じて引数を含めnamespace
ます。引数はmodel
次のいずれかの値を取ります。
custom
- カスタム YANG データ モデルで定義されている設定データを取得します。カスタム YANG データ モデルのデータを取得する場合は、引数namespace
を含める必要があります。ietf
- IETF YANG データ モデルで定義されている設定データを取得します。openconfig
- OpenConfig YANG データ モデルで定義されている設定データを取得します。True
- Junos OSの完全な設定とYANGデータモデルからのデータを含む、すべての設定データを取得します。
引数に model
または openconfig
の値を指定するietf
と、Junos PyEZ は自動的に適切な名前空間を使用します。を使用してmodel='custom'
カスタム YANG データ モデルのデータを取得する場合は、対応する名前空間に引数を含めるnamespace
必要もあります。
引数に値 、 、または openconfig
を含め、特定の XML サブツリーを返す引数も含めfilter_xml
た場合、Junos OS は非ネイティブ データ モデルから一致する階層のみを返します。 ietf
custom
model
Junos OS 設定に「インターフェイス」など、同じ名前の階層が含まれている場合、それは応答に含まれません。を使用する場合model=True
、 filter_xml
オプションはサポートされません。
次の例では、 get_config()
RPC はデバイス上の候補構成から OpenConfig bgp
構成階層を取得します。引数を filter_xml
省略した場合、RPCは完全なJunos OSとOpenConfig候補設定を返します。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig') print (etree.tostring(data, encoding='unicode', pretty_print=True))
以下のRPCは、 interfaces
IETF YANGデータモデルの候補コンフィギュレーションからコンフィギュレーション階層を取得します:
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
次のRPCは、 l2vpn
指定された名前空間を持つカスタムYANGデータモデルの候補コンフィギュレーションからコンフィギュレーション階層を取得します。
data = dev.rpc.get_config(filter_xml='l2vpn', model='custom', namespace='http://yang.juniper.net/customyang/demo/l2vpn') print (etree.tostring(data, encoding='unicode', pretty_print=True))
次の RPC は、完全な Junos OS 候補コンフィギュレーションと、デバイスに追加された他の YANG データ モデルの設定データを取得します。
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
追加の RPC オプションを指定する
Junos PyEZ get_config()
RPCを使用して設定を取得すると、Junos XMLプロトコル <get-configuration>
操作が呼び出されます。RPC は引数をサポートしている options
ため、操作でサポートされている <get-configuration>
属性のキーと値のペアのディクショナリを含めることができます。Junos XML プロトコル <get-configuration>
操作でサポートされる属性の完全なリストについては、 <get-configuration>を参照してください。
たとえば、RPC はget_config()
、、、 、 <apply-groups>
<apply-groups-except>
、および <interface-range>
タグが<groups>
構成出力の個別の要素である継承前の構成からデータを取得します。ユーザー定義グループから継承されたステートメントと継承ステートメントの子として範囲を表示する継承後設定からデータを取得するには、 で引数'inherit':'inherit'
を含めoptions
ます。
たとえば、次のコードは、継承後の候補構成から階層レベルの構成 [edit system services]
を取得します。この場合、設定に 階層レベルで設定された [edit groups global system services]
ステートメントも含まれている場合、それらのステートメントは継承後の設定の階層の下に [edit system services]
継承され、取得した設定データで返されます。
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='system/services', options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
構成データの名前空間を処理する方法
Junos PyEZ get_config()
RPCは、デフォルトで、返された設定データからネームスペースを削除します。Junos PyEZアプリケーションは、返された設定データにネームスペースを保持できるため、既存の設定を迅速に変更したい場合などに、データをデバイスにロードし直すことができます。
構成データに名前空間を保持するには、 remove_ns=False
引数リストに引数を含めます get_config()
。例えば:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig', remove_ns=False) print (etree.tostring(data, encoding='unicode', pretty_print=True))
次の切り捨てられた出力では、 <bgp>
要素は名前空間を定義する属性を保持します xmlns
。
<bgp xmlns="http://openconfig.net/yang/bgp"> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...
引数をget_config()
remove_ns=False
省略すると、名前空間は出力に含まれません。
<bgp> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...