Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

非構造化出力を解析する Junos PyEZ 操作テーブルのビューを定義します。

非構造化出力用のJunos PyEZ運用(op)テーブルは、Junosデバイスで実行されたCLIコマンドまたは特定のFPC(フレキシブルPICコンセントレータ)で実行されたvtyコマンドのテキスト出力からデータを抽出します。テーブル はビューに関連付けられており、ビューはテーブルアイテムのフィールドにアクセスし、ユーザー定義のPython変数にマップするために使用されます。テーブルを特定のビューに関連付けるには、ビュー名を引数として受け取る view プロパティをテーブル定義に含めます。

ビューは、ユーザー定義変数を選択したテーブル項目のデータにマップします。ビューを使用すると、Python で操作できるプロパティを持つ変数として出力内の特定のフィールドにアクセスできます。Junos PyEZは、Pythonへのデータの抽出や、型変換やデータ正規化を処理します。ビューで定義されるキーは、有効なPython変数名である必要があります。

このトピックでは、ビューのさまざまなコンポーネントについて説明します。

非構造化出力を解析するためのビューのパラメーターの概要

Junos PyEZビューは、テーブルと同様に、YAMLを使用してフォーマットされます。非構造化出力を解析するビューには、多数のパラメーターを含めることができます。 表1は 、パラメーターを要約したものです。

表1:非構造化出力用のJunos PyEZ演算テーブルのビュー内のパラメーター

パラメータを表示

説明

表示名

ビューのユーザー定義識別子。

columns

(オプション)コマンド出力の列タイトルのリスト。

eval

(オプション)ユーザー定義のキーを数学式を含む文字列にマップする 1 つ以上のキーと値のペアの連想配列または辞書。式は、データの反復ごとに評価されます。キーと計算された値は、その反復に対応するデータに追加されます。

exists

(オプション)ユーザー定義のキーを文字列にマップするキーと値のペアの連想配列または辞書。文字列が出力に存在する場合、変数はTrueに設定され、それ以外の場合、変数はFalseに設定されます。

fields

(オプション)ユーザー定義のキーを、コマンド出力の特定のセクションを解析するネストされたテーブルの名前にマップするキーと値のペアの連想配列または辞書。

filters

(オプション) columnsで定義された1つ以上のキーのリスト。最終的なデータ セットには、選択した列のデータのみが含まれます。

regex

(オプション)目的のコンテンツに一致する正規表現のリスト。

表示名

ビュー名は、ビューのユーザー定義識別子です。テーブルを特定のビューに関連付けるには、テーブル定義に view プロパティを含め、その引数としてビュー名を指定します。

次の例では、Table の view パラメーターによって参照される ChassisFanView という名前のビューを定義します。

列

ビューで columns パラメーターを使用して、行と列でフォーマットされたコマンド出力を抽出して解析できます。

次の show ospf neighbor コマンド出力について考えてみましょう。

データを抽出するには、ビューに columns パラメーターを含め、Python 変数名を列名にマップします。アプリケーションは、キーと、その列のコマンド出力から抽出された値を、特定のアイテムのディクショナリのキーと値のペアとして格納します。

次のビューは、 show ospf neighbor コマンド出力の各列からデータを抽出します。

Junos PyEZアプリケーションでデータを取得して出力すると、各ネイバーのデータには列キーと対応するデータが含まれます。

選択した列のデータのみを含めるようにデータをフィルター処理するには、[ビュー] に filters パラメーターを含めます。詳細については、「 フィルター」を参照してください。

一部のコマンド出力には、複数行にまたがる列タイトルが含まれます。たとえば、次のとおりです。

ビューで複数行の列タイトルを定義するには、列キー要素を、そのタイトルの各行の単語のリストと等しいように設定します。以下のビューは、前のコマンド出力の列を定義します。

評価式(eval)

オプションの eval パラメーターを使用して、テーブルとビューによって返される最終データにキーと値のペアを追加または変更できます。 eval パラメーターは、キー名を数学式を含む文字列にマップします。テーブルとビューの両方に eval パラメーターを含めることができ、複数の値を定義および計算できます eval 。

テーブルで eval を使用すると、計算の完全なデータ ディクショナリが参照されます。キーと計算値は、単一の追加項目として辞書に追加されます。ビューで eval を使用すると、式はデータの反復ごとに計算されます。計算された値が、その反復のデータに追加されます。 eval キー名がビューで定義されたキーと一致する場合、 eval そのキーの値を計算された値に置き換えます。 eval キー名がビューで定義されたキーと一致しない場合、 eval は新しいキーと計算値をデータに追加します。

eval式は、ビューによって返されるdata辞書を参照できます。式が評価されるときに PyEZ が変数を辞書に置き換えることができるJunosように、式は Jinja テンプレート変数を使用してdataを参照する必要があります。

Junos PyEZ リリース 2.8.1 以降、Table および View eval ステートメントで使用される式は、コード実行のセキュリティリスクを軽減するために制限された実装を使用して評価されます。Junos PyEZは、評価前に各式を解析し、サポートされているPythonの構文、関数、メソッド、操作のセットに対して検証します。サポートされていない要素や安全でない要素を含む式は、 UnsafeExpressionError エラーで拒否されます。 表2は 、サポートされている式の概要を示しています。

表2:eval ステートメントでサポートされている式
カテゴリー サポートされている構文 例文

算術

+ - * / // % **

a+b
a*100

ブール論理

and, or

a > 0 and b > 0

リテラル

整数、浮動小数点数

123
3.14

文字列リテラル

'text'

辞書リテラル

{'a':1}

リテラルを一覧表示する

[1,2,3]

リテラルを設定する

{1,2,3}

タプルリテラル

(1,2,3)

比較
オペレーター

== != < <= > >=

{{ cpu }} > 80

辞書
内包表記

{k:v for ...}

{k:v for k,v in {{ data }}.items()}

リスト
内包表記

[expr for ...]

[v['errors'] for k,v in {{ data }}.items()]

設定
内包表記

{expr for ...}

{k for k in {{ data }}.keys()}

条件式

x if cond else y

'busy' if {{ cpu }} > 80 else 'idle'

機能

abs()—絶対値
dict()- 辞書を作成する
isinstance()- タイプチェック
len()- 反復可能な長さ
max()—最大値
min()- 最小値
sum()—反復可能な値の合計

sum([1,2,3])

ジェネレータ
式

(expr for ...)

(v for v in {{ data }}.values())

インデックス作成

[n]

{{ data }}[0]

メンバーシップ

in, not in

'xe' in {{ name }}

メソッド

endswith()- 文字列サフィックスチェック
get()—辞書の安全な検索
items()- 辞書のキーと値を返します
keys()- 辞書キーを返す
values()- 辞書値を返します

{{ data }}.items()

スライシング

[start:end:step]

'{{ cpu }}'[:-1]

単項演算子

+x、 -x、 not x

-{{ cpu }}

次の例では、ビュー定義で eval を使用します。 cpu エントリは、データディクショナリ内の各アイテムの cpu フィールドの既存の値を変更します。 max エントリは、データディクショナリ内の各項目に対して新しいキーと値のペアを作成します。

以下の show threads vty コマンドの出力例について考えてみましょう。

ビューの eval パラメーターは、各 cpu エントリを変更して、パーセント記号 (%)を省略します。その結果、データには「0%」ではなく「0」が含まれます。さらに、各項目に新しいキー、 max、およびその計算値が追加されます。

テーブル定義で eval を使用する例については、 評価式(eval)を参照してください。

存在します

ビューでオプションの exists パラメーターを使用して、コマンド出力に文字列が存在するかどうかを示すことができます。 exists は、ユーザー定義のPython変数名をコマンド出力で一致させる文字列にマップするキーと値のペアの辞書です。文字列が出力に存在する場合、変数は Trueに設定されます。それ以外の場合、変数は Falseに設定されます。

show host_loopback status-summary vtyコマンドの出力について考えてみましょう。

次の表は、コマンド出力にNo detected wedges文字列またはNo toolkit errors文字列のどちらが含まれているかをテストするexistsを定義しています。

テーブルとビューを使用して文字列をテストし、結果の値をJunos PyEZアプリケーションに出力する場合、この場合は両方の変数が True に設定されます。

フィールド

コマンド出力は長くて複雑な場合があり、出力のさまざまなセクションを解析するために異なるロジックが必要になる場合があります。場合によっては、単一のテーブルとビューを使用してコマンド出力を適切に解析できないことがあります。このタイプの出力を解析するには、オプションの fields パラメーターをビューに含めることができます。 fields は、ユーザー定義のキーを、コマンド出力の特定のセクションを選択するネストされたテーブルの名前にマップするキーと値のペアの辞書です。ネストされた各テーブルは、そのテーブルによって選択されたデータを解析する独自のビューを参照できます。

2 つの異なるデータ セクションを含む show xmchip 0 pt stats vty コマンド出力について考えてみましょう。

次の XMChipStatsView ビューでは、 fields パラメーターを使用して、コマンド出力の2つの異なるセクションを解析するために使用される2つの追加テーブルを定義します。 _WANPTStatTable テーブルと _FabricPTStatTable テーブルは、それぞれ WAN PT statistics セクションと Fabric PT statistics セクションからデータを抽出します。この場合、テーブルは delimiter パラメーターを使用してデータを抽出および分割します。したがって、テーブルは別のビューを参照する必要はありません。

Junos PyEZアプリケーションでデータを取得して出力すると、 fields で定義された各キーには、対応するテーブルによって選択および解析されたデータが含まれます。

別の例として、 show ttp statistics vtyコマンドの出力について考えてみましょう。

FPCTTPStatsViewビューでは、fieldsパラメーターを使用して複数のネストされたテーブルを参照し、出力のさまざまなセクションのデータを抽出します。各テーブルは、独自のビューを参照するか、delimiter パラメーターを使用してそのセクションのデータを解析します。

Junos PyEZアプリケーションでデータを取得して出力すると、各 fields キーには、対応するテーブルによって抽出および解析されたデータが含まれます。

フィルター

columns パラメーターは、行と列でフォーマットされたコマンド出力からデータを抽出します。ビューに columns パラメーターを含める場合、オプションで filters パラメーターを含めて、最終出力に含まれる列データをフィルター処理できます。filters値は、columnsで定義された1つ以上のキーのリストです。最終的なデータ セットには、選択した列のデータのみが含まれます。ビュー定義でデフォルトフィルターを指定でき、Junos PyEZアプリケーションでフィルター値を定義または上書きすることもできます。

show ospf neighbor コマンドの出力について考えてみましょう。

次のビューでは、 columns パラメーターは、対応するコマンド出力のすべての列のキーを定義します。included filters パラメーターを使用すると、結果のデータ ディクショナリには Address 列と State 列のデータのみが含まれます。

次のJunos PyEZ コードは、まず引数なしで get() を呼び出し、ビューで定義されたフィルターのデフォルト リストを使用してデータを取得します。 get() の 2 番目の呼び出しには、ビューで定義されているフィルター リストをオーバーライドする filters 引数が含まれます。

アプリケーションを実行するとき、 get() への最初の呼び出しでは、ビューで定義されているフィルターが使用されます。2 番目の呼び出しでは、呼び出しで定義されたフィルターが使用され、ビューで定義されたフィルターがオーバーライドされます。

正規表現

ビューでオプションの regex パラメーターを使用して、コマンド出力の特定のフィールドを照合して抽出できます。 regex は、キーを正規表現にマッピングする辞書です。対応するテーブルで item: '*'が定義されていない場合、PyEZ Junos正規表現を組み合わせ、結果を出力の各行と照合します。ただし、テーブルがデータを単一のテキスト文字列として抽出する item: '*' を定義する場合、Junos PyEZは代わりに個々の正規表現をテキスト文字列全体と照合します。

正規表現で定義されたキャプチャグループによって、フィールドから抽出され、データディクショナリに格納されるデータが決まります。キャプチャグループを定義すると、そのグループの値のみがデータに保存されます。それ以外の場合、Junos PyEZは完全な式に一致する値を格納します。たとえば、 (d+.d+) は文字列検索式から浮動小数点値を取得して格納しますが、 (d+).d+ はデータの整数部分のみを格納します。複数のグループを定義する場合は、最初のグループの値のみが保存されます。

Junos PyEZ は、 pyparsing モジュールを活用して、正規表現の代わりに使用できるいくつかの組み込みキーワードを定義します。 表3は 、キーワード、簡単な説明、および対応する式を示しています。ここで、 pp は import pyparsing as ppから派生しています。

表3:正規表現パラメーターキーワード

キーワード

説明

表現

hex_numbers

16進文字のみを含むワード

hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
    & pp.OneOrMore(pp.Word('abcdefABCDEF', min=1))

numbers

整数または浮動小数点値で構成されるワード

numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') +
     pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i))

percentage

数字と末尾のパーセント記号(%)で構成される単語

percentage = pp.Word(pp.nums) + pp.Literal('%')

printables

印刷可能な文字(空白以外の文字)で構成される1つ以上の単語

printables = pp.OneOrMore(pp.Word(pp.printables))

word

英数字または英数字で構成される単語

word = pp.Word(pp.alphanums) | pp.Word(pp.alphas)

words

1つ以上の word 文字列

words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i))

次の show icmp statistics コマンド出力について考えてみましょう。出力の各セクションには特定のセクションタイトルの下にあり、データは数字と1つ以上の単語で構成されています。

前の出力を解析するために、メインビューは fieldsを定義し、出力の各セクションを解析するネストされたテーブルとビューを参照します。ネストされたビューは、対応するテーブルによって抽出されたデータと一致する regex パラメーターを定義します。

例えば、 _ICMPDiscardsTable テーブルは、コマンド出力の ICMP Discards セクションにあるデータを選択します。 _ICMPDiscardsView ビューでは、正規表現にマッピングされる2つのキー( value と name)を定義します。 value は1つ以上の数字に一致し、 name は1つ以上の単語に一致します。テーブルでは item: '*'が定義されていないため、正規表現は組み合わされ、そのセクションの各データ行と照合されます。

_ICMPErrorsTableテーブルは、コマンド出力のICMP Errorsセクションにあるデータを選択します。_ICMPErrorsViewビューでは、errorキーとnameキーを定義します。フィールドでは、正規表現を明示的に定義する代わりに、組み込みキーワードnumbersとwordsを使用します。

テーブルで item: '*'が定義されている場合、抽出されたデータは1つのテキスト文字列と見なされます。この場合、対応するビューの各正規表現は文字列全体と一致します。

show ithrottle id 0 コマンドの出力について考えてみましょう。

次の表では、 item: '*' を使用してデータを 1 つの文字列として抽出します。ビューの regex パラメーターは、3 つの正規表現を定義します。各正規表現パターンは、文字列全体と一致します。正規表現ではキャプチャーグループが定義されるため、Junos PyEZはグループに一致するデータのみを格納します。

Junos PyEZアプリケーションでデータを取得して出力すると、データには3つの regex 項目が含まれ、その式のキャプチャグループに一致する値が含まれます。

変更履歴テーブル

サポートされる機能は、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がお使いのプラットフォームでサポートされているかどうかを確認します。

リリース
説明
2.8.1
Junos PyEZ リリース 2.8.1 以降、Table および View eval ステートメントで使用される式は、制限された実装を使用して評価されます。