Junos デバイスで sysctl() 拡張機能を使用する
Junos OS と Junos OS Evolvedは*nix のようなオペレーティング システム上で実行され、カーネルのさまざまな状態やプロセス情報を取得できます。自動化スクリプトで拡張機能を呼び出して sysctl()
、シェルでコマンドを使用 sysctl
してこれらの値を取得する方法と同様に、同じカーネル状態情報を取得できます。この関数は sysctl()
、シェルで コマンドに指定 sysctl
したのと同じ変数名を受け取ります。変数名はMIBスタイルの名前で、点線のコンポーネントセットを使用します。Junos OS は FreeBSD をベースにしており、Junos OS Evolvedは Linux 上でネイティブに動作するため、sysctl 変数と変数名は OS ごとに異なります。
シェルで コマンドを sysctl -a
実行すると、使用可能な状態のリスト全体と、関数の引数として指定できる対応する名前を sysctl()
確認できます。ただし、出力は広範囲に及ぶ可能性があります。
たとえば、Junos OS では、次のサンプル SLAX op スクリプトは sysctl 状態 kern.hostname
と の値を取得して hw.product.model
印刷します。
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $host = jcs:sysctl("kern.hostname"); expr jcs:output($host); var $model = jcs:sysctl("hw.product.model"); expr jcs:output($model); } }
user@router1> op sysctl-junos router1 mx960
同様に、Junos OS Evolvedでは、次のサンプル SLAX op スクリプトは sysctl 状態 kernel.hostname
および の値を取得して kernel.osrelease
印刷します。
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $host = jcs:sysctl("kernel.hostname"); expr jcs:output($host); var $osrelease = jcs:sysctl("kernel.osrelease"); expr jcs:output($osrelease); } }
user@router2-re0> op sysctl-evo router2-re0 5.2.60-yocto-standard-g9a086a2b7
Junos OS Evolved、戻り値の型は常に文字列 ("s") です。型引数を省略した場合、デフォルトは「s」になります。
Junos OSとJunos OS Evolvedは、基盤となるオペレーティングシステムが異 sysctl
なるため、状態名が異なります。たとえば、Junos OS では、 、 のカーネル状態 hw.product.model
を取得できますが、Junos OS Evolvedは類似 sysctl
した変数名を持っていません。この場合、RPCやその他の手段を使用して同じ情報を取得できます。
たとえば、以下の SLAX op スクリプトは RPC をget-software-information
実行してJunos OS Evolvedでモデル名を取得します。これは Junos OS の値を返すsysctl
hw.product.model
のと同じです。
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $local = jcs:open(); var $rpc = "get-software-information"; var $result = jcs:execute($local, $rpc); expr jcs:output($result/product-model); } }
user@router2-re0> op sysctl-evo-model ptx10008
スクリプトで関数を sysctl()
呼び出し、存在しない sysctl 変数名を指定すると、Junos OS はエラーを生成しませんが、Junos OS Evolvedエラーが生成 sysctl error: No such file or directory
されます。
例えば、関数が junos OS で有効な sysctl 変数名であるが、Junos OS Evolved上の有効な sysctl 変数名ではない 、 の値hw.product.model
を要求するとしますsysctl()
。Junos OS Evolvedを実行しているデバイスでスクリプトを実行すると、次の出力が出力されます。
user@router2-re0> op sysctl-evo-invalid error: sysctl error: No such file or directory error: xmlXPathCompiledEval: No result on the stack. error: runtime error: file /var/db/scripts/op/sysctl-evo-invalid.slax line 10 element variable error: Failed to evaluate the expression of variable 'model'.