非構造化出力を解析するJunos PyEZ運用テーブルのビューを定義する

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

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

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

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

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

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

ビューパラメータ

説明

ビュー名

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

columns

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

eval

(オプション)ユーザー定義キーを数式を含む文字列にマップする 1 つ以上のキーと値のペアの連想配列 (ディクショナリ)。データの反復ごとに、式は Python eval 関数を使用して評価されます。キーと計算値は、その反復に対応するデータに追加されます。

exists

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

fields

(オプション)ユーザー定義キーを、コマンド出力の特定のセクションを解析するネストされた Table の名前にマップするキーと値のペアの連想配列 (ディクショナリ)。

filters

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

regex

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

ビュー名

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

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

列

ビューのパラメーターを使用して columns 、行と列で書式設定されたコマンド出力を抽出および解析できます。

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

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

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

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

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

一部のコマンド出力には、次のように複数行にまたがる列タイトルが含まれます。

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

評価式(評価)

省略可能 eval なパラメーターを使用して、Table and View によって返される最終データのキーと値のペアを追加または変更できます。このパラメーターは eval 、Python eval 関数によって評価される数式を含む文字列にキー名をマップします。テーブルとビューの両方にパラメーターを含める eval ことができ、 eval 複数の値を定義および計算できます。

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

式は eval 、 data View によって返されるディクショナリを参照できます。式はJinjaテンプレート変数を使用して参照 data する必要があります。Junos PyEZが式の評価時に変数を辞書に置き換えることができるようにするためです。

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

vty コマンドの show threads 次のサンプル出力について考えてみます。

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

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

存在

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

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

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

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

フィールド

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

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

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

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

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

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

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

フィルター

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

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

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

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

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

Regex

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

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

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

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

キーワード

説明

式

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 対応する Table によって抽出されたデータと照合するパラメーターを定義します。

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

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

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

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

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

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