Salt を使用して Junos OS を搭載したデバイスで RPC を実行する
ジュニパーネットワークスは、Salt を使用して Junos OS を実行しているデバイスを管理するサポートを提供しており、Junos 実行および状態モジュール(Salt 用)は、管理対象デバイス上で運用および設定タスクを実行できる機能を定義します。 salt.modules.junos.rpc 実行機能と salt.states.junos.rpc 状態機能を使用すると、Junos OSを実行しているデバイス上でリモートプロシージャコール(RPC)を実行して、操作を実行したり、情報を取得したりできます。
次のセクションでは、関数の使用方法、デバイス応答の解析方法、出力形式の指定方法、および出力のファイルへの保存方法について説明します。
Junos XML APIについて
Junos XML APIは、Junos OSの設定ステートメントと動作モードコマンドをXML表現したものです。これは、Junos OSの設定階層内のすべてのステートメントと、CLI動作モードで発行する多くのコマンドに相当するXMLを定義します。対応するJunos XMLを持つ各運用モードコマンドは、要求タグ要素と、必要に応じて応答タグ要素にマッピングされます。リクエストタグは、NETCONFまたはJunos XMLプロトコルセッション内のリモートプロシージャコール(RPC)で使用され、Junos OSを実行しているデバイスから情報を要求します。サーバーは、response タグ要素で囲まれた Junos XML 要素を使用して応答を返します。
対応する Junos XML コマンドがあるすべての操作コマンドは、 Junos XML API Explore にリストされています。また、コマンドの後に | display xml rpc オプションを追加することで、CLI で対応する Junos XML がある動作モード コマンドの Junos XML リクエスト タグ要素を表示することもできます。以下の例では、 show route コマンドのリクエストタグを表示しています。
user@router> show route | display xml rpc
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/19.2R1/junos">
<rpc>
<get-route-information>
</get-route-information>
</rpc>
</rpc-reply>
Salt を使用して Junos OS を実行しているデバイスを管理する場合、 junos.rpc 関数を使用してデバイス上で RPC を実行し、応答を返すことができます。
junos.rpc 関数の構文
salt.modules.junos.rpc実行関数の構文は次のとおりです。
salt 'target' junos.rpc rpc dest=dest format=format arg1=arg1-value arg2=arg2-value
salt.states.junos.rpc 状態関数では、次の構文がサポートされています。
rpc:
junos.rpc:
- dest: dest
- format: format
- arg1: arg1-value
- arg2: arg2-value
id:
junos.rpc:
- name: rpc
- dest: dest
- format: format
- arg1: arg1-value
- arg2: arg2-value
どこ:
arg=arg-value—(オプション)含める 1 つ以上の RPC 引数とそれに対応する値(例:interface-name=ge-1/1/1やterse=True)。dest—(オプション)RPC 応答が書き込まれるプロキシ ミニオン サーバー上の宛先ファイルのパス。ターゲット・デバイスで絶対パスを指定しない場合、パスは最上位のルート(/)ディレクトリに対する相対パスになります。id- ステート宣言のユーザ定義識別子。format—(オプション)宛先ファイルに書き込まれるRPC応答の形式(指定されている場合)。text、xml、またはjsonを指定します。rpc—Junos OSを実行しているデバイス上で実行するリモート プロシージャ コール(例:get-system-uptime-information)。
junos.rpc実行関数でRPCを実行する方法
salt.modules.junos.rpc実行機能を使用すると、Junos OSを実行しているデバイスでRPCを実行できます。この関数には、実行する RPC である 1 つの引数が必要です。操作が成功した場合、コマンドはout: Trueを返し、rpc_replyキーにはRPC応答が含まれます。
たとえば、次のコマンドは、ターゲット デバイスで get-system-uptime-information RPC を実行し、その応答を標準出力に表示します。
saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-system-uptime-information
router1:
----------
out:
True
rpc_reply:
----------
system-uptime-information:
----------
current-time:
----------
date-time:
2019-06-13 17:01:32 PDT
last-configured-time:
----------
date-time:
2019-06-12 18:47:12 PDT
time-length:
22:14:20
user:
saltuser
...
RPC 引数の指定、または関数の出力形式と場所については、以下を参照してください。
junos.rpc状態関数でRPCを実行する方法
Salt ステート ファイル内で salt.states.junos.rpc ステート関数を使用して、Junos OS を実行しているデバイスで RPC を実行できます。RPC をデータ構造の 1 行目として定義することも、関数の引数リスト内で定義することもできます。同じ状態ファイル内で同じ RPC を複数回実行する必要がある場合は、引数リスト内で RPC を定義する必要があります。
次のステート・ファイルでは、 junos.rpc ステート関数を使用してターゲット・デバイス上で2つのRPCを実行し、その出力をファイルに保存します。この場合、 id グレインに格納されているプロキシ識別子は、状態が複数のターゲットに適用されるときに出力ファイルを区別するために、宛先ファイル名に含まれます。
saltuser@salt-master:~$ cat /srv/salt/junos_rpc.sls
get-system-uptime-information:
junos.rpc:
- dest: /var/log/salt/output/{{ grains['id'] }}_junos_rpc_system_uptime.xml
get-interface-information:
junos.rpc:
- interface-name: fxp0.0
- terse: True
- dest: /var/log/salt/output/{{ grains['id'] }}_fxp0_status.txt
- format: text
状態を適用すると、Salt マスターは各 RPC の RPC 応答を標準出力に表示し、プロキシ ミニオン サーバ上の対応する宛先ファイルに出力を保存します。
saltuser@salt-master:~$ sudo salt 'router1' state.apply junos_rpc
router1:
----------
ID: get-system-uptime-information
Function: junos.rpc
Result: True
Comment:
Started: 23:49:00.633541
Duration: 180.134 ms
Changes:
----------
out:
True
rpc_reply:
----------
system-uptime-information:
----------
current-time:
----------
date-time:
2019-07-26 16:49:00 PDT
last-configured-time:
----------
date-time:
2019-07-24 10:17:34 PDT
time-length:
2d 06:31
user:
saltuser
protocols-started-time:
----------
date-time:
2019-07-01 07:07:27 PDT
time-length:
3w4d 09:41
system-booted-time:
----------
date-time:
2019-07-01 07:03:56 PDT
time-length:
3w4d 09:45
time-source:
NTP CLOCK
uptime-information:
----------
active-user-count:
1
date-time:
4:49PM
load-average-1:
0.01
load-average-15:
0.01
load-average-5:
0.04
up-time:
25 days, 9:45
----------
ID: get-interface-information
Function: junos.rpc
Result: True
Comment:
Started: 23:49:00.813806
Duration: 900.33 ms
Changes:
----------
out:
True
rpc_reply:
Interface Admin Link Proto Local Remote
fxp0.0 up up inet 198.51.100.2/24
Summary for router1
------------
Succeeded: 2 (changed=2)
Failed: 0
------------
Total states run: 2
Total run time: 1.080 s
saltuser@minion:~$ ls /var/log/salt/output router1_fxp0_status.txt router1_junos_rpc_system_uptime.xml
状態が複数のターゲットに適用される場合、定義されたファイル名が意の参照されるため、この場合、Salt はプロキシ ミニオン サーバ上のターゲットごとに異なる出力ファイルを生成します。
saltuser@salt-master:~$ sudo salt '*' state.apply junos_rpc
saltuser@minion:~$ ls /var/log/salt/output router1_fxp0_status.txt router1_junos_rpc_system_uptime.xml router2_fxp0_status.txt router2_junos_rpc_system_uptime.xml
状態ファイルでは、ファイル内で同じ状態識別子を複数回使用することはできません。したがって、状態ファイルで同じ RPC 要求タグを複数回使用する場合は、関数の引数リストで RPC を定義する必要があります。例えば:
saltuser@salt-master:~$ cat /srv/salt/junos_rpc.sls
Get fxp0 interface information:
junos.rpc:
- name: get-interface-information
- interface-name: fxp0.0
- terse: True
- dest: /var/log/salt/output/{{ grains['id'] }}_fxp0_status.txt
- format: text
Get ge interface information:
junos.rpc:
- name: get-interface-information
- interface-name: ge-1*
- terse: True
- dest: /var/log/salt/output/{{ grains['id'] }}_ge_interfaces_status.txt
- format: text
RPC 引数を指定する方法
junos.rpc 関数は、RPC のキーワード引数と値の指定をサポートしています。引数が値を取る場合は、引数名を含めて値を指定します。引数に値が必要ない場合は、その値を True に設定します。
たとえば、次の RPC には 2 つの引数が含まれており、そのうちの 1 つは値を受け取ります。
saltuser@router1> show interfaces ge-1/1/1 terse | display xml rpc
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.4R1/junos">
<rpc>
<get-interface-information>
<terse/>
<interface-name>ge-1/1/1</interface-name>
</get-interface-information>
</rpc>
<cli>
<banner></banner>
</cli>
</rpc-reply>
Salt マスターのコマンド ラインで同等の RPC を実行するには、 interface-name='ge-1/1/1' 引数と terse=True 引数を含めます。
saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-interface-information interface-name='ge-1/1/1' terse=True
同様に、Salt 状態ファイルでは、次のようになります。
saltuser@salt-master:~$ cat /srv/salt/junos_interface_information.sls
get-interface-information:
junos.rpc:
- interface-name: ge-1/1/1
- terse: True
Junos OS 引数を指定するには、ハイフンで区切られた要素名を使用するか、ハイフンの代わりにアンダースコアを使用します。
Salt マスター コマンド ラインでコマンドを実行すると、Salt は CLI 入力を PyYAML を介して渡し、適切な Python データ タイプとしてロードされるようにします。場合によっては、整数を受け取る引数、または整数に解析される文字列値を受け取る引数は、正しく解析されない可能性があります。これらの引数には、次のいずれかの方法を使用して値を指定できます。
バックスラッシュ ( \ ) を使用して、文字列値を囲む引用符をエスケープします。
単一引用符を囲む場合は二重引用符を使用し、その逆も同様です。
--no-parse=param_nameオプションを含めます。
例えば:
saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-route-engine-information slot=\'0\' saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-route-engine-information slot="'0'" saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-route-engine-information slot='0' --no-parse=slot
RPC 出力をファイルに保存する方法
junos.rpc 関数を実行するときに、dest 引数を含め、宛先ファイルのパスを指定することで、返されたデータをプロキシ ミニオン サーバー上のファイルに保存できます。絶対パスを指定しない場合、パスは最上位のルート (/) ディレクトリからの相対パスになります。ターゲット名の出力ファイルが既に存在する場合は、新しいファイルによって古いファイルが上書きされます。
dest 引数は、Salt コマンドの応答全体をファイルに保存しません。保存されるのは、rpc_reply キーに含まれる RPC 応答だけです。
次のコマンドは、 get-system-uptime-information RPC からの出力を表示し、プロキシ ミニオン サーバー上の指定されたパスに rpc_reply 値を保存します。
saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-system-uptime-information dest='/home/saltuser/rpc_output.txt'
saltuser@minion:~$ ls rpc_output.txt
RPC 出力の形式を指定する方法
既定では、 junos.rpc 関数は、標準出力に表示されるデータと、宛先ファイルに保存されたデータ (指定されている場合) の両方について、RPC 出力をXML形式で返します。別の出力形式を指定するには、 format 引数を含め、目的の形式と等しい値を設定します。テキスト形式または Junos XML 要素を要求するには、それぞれ text または xml を使用します。 junos.rpc 出力をJSON形式で宛先ファイルに保存するには、 jsonを指定します。
次のコマンドは、 get-system-uptime-information RPC を実行し、データをテキスト形式で返します。
saltuser@salt-master:~$ sudo salt 'router1' junos.rpc get-system-uptime-information format=text dest=/home/saltuser/router1-get-system-uptime-information.txt
router1:
----------
out:
True
rpc_reply:
Current time: 2019-07-29 17:15:03 PDT
Time Source: NTP CLOCK
System booted: 2019-07-01 07:03:56 PDT (4w0d 10:11 ago)
Protocols started: 2019-07-01 07:07:27 PDT (4w0d 10:07 ago)
Last configured: 2019-07-24 10:17:34 PDT (5d 06:57 ago) by saltuser
5:15PM up 28 days, 10:11, 1 user, load averages: 0.91, 0.30, 0.15
出力は、要求された形式でプロキシ ミニオン サーバ上の宛先ファイルにも書き込まれます。
saltuser@minion:~$ cat /home/saltuser/router1-get-system-uptime-information.txt Current time: 2019-07-29 17:15:03 PDT Time Source: NTP CLOCK System booted: 2019-07-01 07:03:56 PDT (4w0d 10:11 ago) Protocols started: 2019-07-01 07:07:27 PDT (4w0d 10:07 ago) Last configured: 2019-07-24 10:17:34 PDT (5d 06:57 ago) by saltuser 5:15PM up 28 days, 10:11, 1 user, load averages: 0.91, 0.30, 0.15