Op スクリプトでコマンド ライン引数を宣言して使用する
Junos OS op スクリプトは、スクリプトの呼び出し時にコマンドラインの引数を受け取ることができます。ユーザーが CLI で op スクリプトのコンテキストに応じてヘルプを要求する際に、可能な引数のリストを表示できるようにする宣言を設定に含めることができます。スクリプトには、引数を処理するために必要な宣言とコードも含める必要があります。以下のセクションでは、引数とヘルプ・テキストを定義し、op スクリプトで引数を使用する方法について詳しく説明します。
Op スクリプトコマンドライン引数の宣言
CLI でコンテキスト・ヘルプを使用する場合に表示される予想される op スクリプト引数のリストを定義するには、2 つの方法があります。
-
op スクリプトに宣言を含める
-
Junos OS 設定にステートメントを含める
スクリプト生成 引数と 構成生成 引数は、同じ運用上の影響を受けます。以下のセクションでは、さまざまな方法を使用して op スクリプトの引数を定義し、CLI で表示する方法について説明します。
Op スクリプトで引数を定義する方法
Python、SLAX、または XSLT op スクリプトで、op スクリプトに予想されるコマンド ライン引数を直接宣言できます。
Python op スクリプトでコマンド ライン引数を宣言するには、次の手順に沿います。
- という名前のグローバル辞書を宣言します
arguments
。 - 引数ごとに、引数名と引数のヘルプ・テキストにマップされる名前と値のペアを定義します。
Python 構文
# Define arguments dictionary arguments = {'name1': 'description1', 'name2': 'description2'} if __name__ == '__main__': ...
CLI で引数を表示するには、Python スクリプトに ステートメントを if __name__ == '__main__':
含める必要があります。
SLAX または XSLT op スクリプトでコマンド ライン引数を宣言するには、次の手順に従います。
- という名前のグローバル変数を宣言します
arguments
。 - 各引数に対して、要素を定義します
<argument>
。 - 各
<argument>
要素内:- 引数の名前で
<name>
エレメントを定義します。 - 必要に応じて、
<description>
その引数のヘルプ テキストを提供する要素を定義します。
- 引数の名前で
XSLT 構文
<xsl:variable name="arguments"> <argument> <name>name</name> <description>descriptive-text</description> </argument> </xsl:variable>
SLAX 構文
var $arguments = { <argument> { <name> "name"; <description> "descriptive-text"; } }
Junos OS 設定で引数を定義する方法
op スクリプトの引数を op スクリプトで直接宣言する代わりに、Junos OS 設定で予期されるコマンドライン引数を宣言できます。
コンフィギュレーションでコマンドライン引数を宣言するには:
- 指定されたスクリプトの
arguments
階層レベルの[edit system scripts op file filename]
ステートメントに移動します。 - 引数名を設定します。
- オプションで、 引数に
description
ヘルプテキストを提供するように ステートメントを設定します。
例えば:
[edit system scripts op op file file filename] arguments { argument-name { description descriptive-text; } }
コンテキストに依存するヘルプで引数を表示する方法
op スクリプトまたは構成のいずれかで引数を宣言した後、CLI のコンテキスト・ヘルプを使用して、op スクリプトの引数をリストすることができます。オプションの引数記述を含める場合、CLI は引数名を含むヘルプ・テキストを表示します。
user@host> op filename ? Possible completions: argument-name description argument-name description
op スクリプトまたは構成に引数宣言を含めずに、op スクリプトの非表示の引数を作成することもできます。スクリプトで通常と同じ引数を使用しますが、その op スクリプトのコンテキスト・ヘルプを要求すると、CLI には引数またはヘルプ・テキストは表示されません。
Junos OS設定でコマンドライン引数を設定し、opスクリプトで直接引数を宣言する場合、スクリプトで宣言した引数は引き続き使用できますが、 コマンドを発行op filename ?
する際の下Possible completions
にCLIには引数がリストされません。これは、管理 (mgd) プロセスが最初に引数の構成を確認してリストに追加されるために発生します。mgd プロセスは、構成に引数が見つからない場合にのみ、引数のスクリプトをチェックします。このため、構成で引数を宣言すると、スクリプトで宣言された引数は CLI で非表示になります。
op スクリプトのヘルプ テキストの設定の詳細については、「 Op スクリプト のヘルプ テキストの設定」を参照してください。
Op スクリプトでのコマンドライン引数の使用
コマンドを使用してローカル op スクリプトを op filename
実行します。コマンドライン引数をスクリプトに渡すためには、スクリプトの実行時に各引数名と値を含めます。
user@host> op filename argument-name argument-value
スクリプトが認識できない引数を指定した場合、その引数は無視されます。
以下のセクションでは、Python、SLAX、XSLT op スクリプトに渡されるコマンド ライン引数の使用方法について説明します。
Python Op スクリプトで引数を使用する方法
Python op スクリプトは、標準的なコマンドライン解析ライブラリを使用して、コマンドライン引数を処理および使用できます。たとえば、Python argparse
ライブラリを使用して、必須およびオプションの引数を簡単に定義し、デフォルト値を指定して、スクリプトの引数を処理できます。
標準的な Python ライブラリを簡単に使用してコマンド ラインの引数を解析できるように、引数を Python op スクリプトに渡す方法を変更しました。Junos OS リリース 21.2R1 およびリリース 21.2R1 Junos OS Evolved以降、デバイスがコマンドライン引数を Python op スクリプトに渡すと、単一のハイフン(-)のプレフィックスが単一のハイフン(-)の引数名になり、2 つのハイフン(-)から複数文字の引数名がプレフィックスになります。以前のリリースでは、デバイスはすべての引数名に単一ハイフン(-)を付けます。op スクリプトで特定のリリースの引数が正しく処理されていることを確認する必要があります。
次の例では、 モジュールを argparse
使用してスクリプトの引数を処理しています。この例ではグローバル arguments
辞書を定義し、辞書キーを使用してパーサーに予想される引数を定義します。2 つのサンプル スクリプトを提供し、指定されたリリースの引数を適切に処理します。
Python 構文(Junos OS リリース 21.2R1 以降)
# Junos OS Release 21.2R1 and later import argparse arguments = {'arg1': 'description1', 'arg2': 'description2', 's': 'short option'} def main(): parser = argparse.ArgumentParser(description='This is a demo script.') # Define the arguments accepted by parser # which use the key names defined in the arguments dictionary for key in arguments: if len(key) == 1: parser.add_argument(('-' + key), required=True, help=arguments[key]) else: parser.add_argument(('--' + key), required=True, help=arguments[key]) args = parser.parse_args() # Extract the value print (args.arg1) print (args.arg2) print (args.s) if __name__ == '__main__': main()
Python 構文(Junos OS リリース 21.1 以前)
# Junos OS Release 21.1 and earlier import argparse arguments = {'arg1': 'description1', 'arg2': 'description2', 's': 'short option'} def main(): parser = argparse.ArgumentParser(description='This is a demo script.') # Define the arguments accepted by parser # which use the key names defined in the arguments dictionary for key in arguments: parser.add_argument(('-' + key), required=True, help=arguments[key]) args = parser.parse_args() # Extract the value print (args.arg1) print (args.arg2) print (args.s) if __name__ == '__main__': main()
SLAX および XSLT Op スクリプトで引数を使用する方法
SLAX または XSLT op スクリプトでコマンド ライン引数を使用するには、次の操作を行う必要があります。
- 各引数にパラメーター宣言を含める
- パラメーター名が、スクリプト内の変数宣言または
arguments
Junos OS 設定の ステートメントでarguments
定義した名前と同じであることを確認します。
XSLT 構文
<xsl:param name="name"/>
SLAX 構文
param $name;
op スクリプトは、各スクリプト引数の値を対応するパラメーターに割り当てます。この値は、スクリプト全体で参照できます。
例: XSLT Op スクリプトでの引数の宣言
と protocol
という名前interface
の 2 つの引数を宣言します。ge-0/2/0.0インターフェイスとプロトコルを引数のinet
値として指定し、スクリプトを実行します。
次の例では、XSLT スクリプトまたは構成のいずれかで引数を宣言する方法を示します。
Op スクリプトでの引数の宣言(スクリプト1)
<xsl:variable name="arguments"> <argument> <name>interface</name> <description>Name of interface to display</description> </argument> <argument> <name>protocol</name> <description>Protocol to display (inet, inet6)</description> </argument> </xsl:variable>
コンフィギュレーションでの引数の宣言
[edit system scripts op] file script1 { arguments { interface { description "Name of interface to display"; } protocol { description "Protocol to display (inet, inet6)"; } } }
スクリプトの引数または構成で引数を宣言するだけでなく、スクリプトの引数を参照して値にアクセスするには、スクリプト内の対応するパラメーターも宣言する必要があります。
パラメーターの宣言
<xsl:param name="interface"/> <xsl:param name="protocol"/>
スクリプトの実行時に引数の名前と値を指定します。例えば:
スクリプトの実行
user@host> op script1 interface ge-0/2/0.0 protocol inet
例:Python Op スクリプトでの引数の宣言と使用
という名前interface
p
の 2 つの引数を Python op スクリプトで宣言します。ge-0/2/0.0インターフェイスとプロトコルを引数のinet
値として指定し、スクリプトを実行します。リリースに基づいて、適切な引数処理ステートメントを選択します。このスクリプトでは、Junos OSリリース21.2R1以降と互換性のあるステートメントを使用し、古いリリースの引数を処理するためのステートメントをコメントアウトします。
Op スクリプトでの引数の宣言(script1.py)
from jnpr.junos import Device import argparse # Define arguments dictionary arguments = {'interface': 'Name of interface to display', 'p': 'Protocol to display (inet, inet6)'} def main(): parser = argparse.ArgumentParser() # Argument handling for Junos OS Release 21.2R1 or later for key in arguments: if len(key) == 1: parser.add_argument(('-' + key), required=True, help=arguments[key]) else: parser.add_argument(('--' + key), required=True, help=arguments[key]) # Argument handling for Junos OS Release 21.1 and earlier #for key in arguments: # parser.add_argument(('-' + key), required=True, help=arguments[key]) args = parser.parse_args() try: with Device() as dev: res = dev.rpc.get_interface_information( interface_name=args.interface, terse=True, normalize=True) print (args.interface + " status: " + res.findtext("logical-interface/oper-status")) for elem in res.xpath("//address-family \ [normalize-space(address-family-name)=$protocol]", protocol=args.p): if (elem.find("interface-address/ifa-local") is not None): print ("inet address: " + elem.find("interface-address/ifa-local").text) except Exception as err: print (err) if __name__ == '__main__': main()
または、Python op スクリプトに辞書を arguments
含める代わりに、SLAX や XSLT スクリプトとまったく同じように引数を構成に含めることができます。
CLI のコンテキスト・ヘルプで op スクリプトの引数を表示するには、 コマンドを op filename ?
発行します。
引数の表示
user@host> op script1.py ? Possible completions: <[Enter]> Execute this command <name> Argument name detail Display detailed output interface Name of interface to display invoke-debugger Invoke script in debugger mode p Protocol to display (inet, inet6) | Pipe through a command
スクリプトの実行時に引数の名前と値を指定します。例えば:
スクリプトの実行
user@host> op script1.py interface ge-0/2/0.0 p inet ge-0/2/0.0 status: up inet address 198.51.100.1/24