Ansibleを使用してJunosデバイスでコマンドとRPCを実行
概要 ジュニパーネットワークスのAnsibleモジュールを使用して、Junosデバイスで運用モードコマンドとRPCを実行します。
ジュニパーネットワークスは、Junosデバイス上で動作モードコマンドとリモートプロシージャコール(RPC)を実行するために使用できるAnsibleモジュールを提供しています。 表 1 にモジュールの概要を示します。
コンテンツ セット |
モジュール名 |
---|---|
次のセクションでは、モジュールの使用方法、モジュール応答の解析方法、出力形式の指定方法、および出力のファイルへの保存方法について説明します。
運用出力から対象データをより簡単に抽出するため、Junos PyEZのカスタムまたは定義済みの運用テーブルで juniper.device.table
モジュールを使用することもできます。詳細については、 Junos PyEZ テーブルで Ansible を使用して Junos デバイスから運用情報を取得するを参照してください。
ジュニパーネットワークスのモジュールでコマンドを実行する方法
juniper.device.command
モジュールを使用すると、Junosデバイス上で運用モードコマンドを実行できます。モジュールには 1 つの引数 commands
が必要です。これは、デバイス上で実行する 1 つ以上のJunos OS動作モード コマンドのリストです。
次のプレイブックは、インベントリ グループの各デバイスで 2 つの運用モード コマンドを実行し、モジュールの応答を標準出力に表示します。この例では、 command
モジュールが、デフォルトの場所にある SSH キーを使用して、デバイスで認証します。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.command: commands: - "show version" - "show system uptime" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
モジュールの応答と出力形式については、 モジュールの応答 についておよび コマンドまたは RPC 出力の形式を指定する方法を参照してください。
ジュニパーネットワークスのモジュールでRPCを実行する方法
Junos XML APIは、Junos OSの設定ステートメントと動作モードコマンドをXML表現したものです。これは、Junos OS の設定階層内のすべての ステートメントと、Junos OS CLI で発行する多くの動作モード コマンドに相当する XML を定義します。対応するJunos XMLを持つ各運用モードコマンドは、要求タグ要素と、必要に応じて応答タグ要素にマッピングされます。リクエストタグは、NETCONFまたはJunos XMLプロトコルセッション内のリモートプロシージャコール(RPC)で使用され、Junosデバイスから情報を要求します。サーバーは、response タグ要素で囲まれた Junos XML 要素を使用して応答を返します。
juniper.device.rpc
モジュールを使用すると、Junos デバイスで RPC を実行できます。モジュールには、デバイス上で実行する 1 つ以上の Junos OS RPC のリストである 1 つの引数 rpcs
が必要です。
次のプレイブックは、インベントリグループ内の各デバイスで get-interface-information
RPCを実行し、モジュール応答を標準出力で表示します。 、RPC は、 show interfaces
運用モードコマンドに相当します。この例では、 rpc
モジュールは、デフォルトの場所にある SSH キーを使用して、デバイスで認証します。
--- - name: Execute RPC hosts: dc1 connection: local gather_facts: no tasks: - name: Get interface information juniper.device.rpc: rpcs: "get-interface-information" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
CLIコマンドをRPCリクエストタグにマッピングする方法については、 Junos XML APIエクスプローラー で操作タグを参照してください。
モジュールの応答と出力形式については、 モジュールの応答 についておよび コマンドまたは RPC 出力の形式を指定する方法を参照してください。
juniper.device.rpc
モジュールは kwargs
オプションをサポートしており、RPC のキーワード引数と値を指定できます。kwargs
値は次のようになります。
-
キーワードと値の単一の辞書
-
複数のRPCの引数を提供する辞書のリスト
kwargs
リストの項目とrpcs
リストのRPCの間には、1対1の対応関係が必要です。複数のRPCを実行し、RPCが引数を必要としない場合は、対応するkwargs
リスト項目を空の辞書{}
に設定します。個々の RPC 引数に値が必要ない場合は、その値を true
に設定します。
RPC 引数では、ハイフンの代わりにアンダースコアを使用する必要があります。これは、特定の状況で例外やエラーを引き起こす可能性があります。
次のプレイブックは、インベントリ グループの各デバイスで指定された RPC を実行し、モジュール応答を標準出力に表示します。 get-interface-information
RPC は lo0.0 インターフェイスの簡潔なレベルの出力を要求し、 get-lldp-interface-neighbors
RPC は ge-0/0/0 インターフェイスの情報を要求します。 get-software-information
RPC は、空の辞書を使用して、追加の引数なしで RPC を実行します。
--- - name: Get Device Information hosts: dc1a connection: local gather_facts: no tasks: - name: Get device information juniper.device.rpc: rpcs: - "get-interface-information" - "get-lldp-interface-neighbors" - "get-software-information" kwargs: - interface_name: "lo0.0" terse: true - interface_device: "ge-0/0/0" - {} register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
モジュール応答の理解
juniper.device.command
モジュールと juniper.device.rpc
モジュールは、デバイスからの RPC 応答をモジュール応答内の複数の異なるキー内に格納します。各キーのデータは、次のように構成されています。
-
stdout
—RPC 応答は 1 つの複数行の文字列です。 -
stdout_lines
—RPC 応答は 1 行の文字列のリストです。 -
parsed_output
- RPC 応答は、JavaScript Object Notation (JSON) データ構造に解析されます。このキーは、データの形式が XML または JSON の場合にのみ返されます。
モジュールが 1 つのコマンドまたは RPC を実行する場合、モジュールの応答によって、返されたキーが最上位レベルに配置されます。モジュールが複数のコマンドまたは RPC を実行する場合、モジュールの応答には代わりに、辞書のリストである results
キーが含まれます。リスト内の各要素は 1 つのコマンドまたは RPC に対応し、そのコマンドまたは RPC に対して返されるすべてのキーが含まれます。
たとえば、次の応答は 1 つの RPC の実行に対応します。
"junos_result": { "attrs": null, "changed": false, "failed": false, "format": "xml", "kwargs": null, "msg": "The RPC executed successfully.", "parsed_output": { "interface-information": { "physical-interface": [ [...output omitted...] } }, "rpc": "get-interface-information", "stdout": "<interface-information style=\"normal\">\n <physical-interface>\n [...output omitted...] </physical-interface>\n</interface-information>\n" "stdout_lines": [ "<interface-information style=\"normal\">", " <physical-interface>", [...output omitted...] " </physical-interface>", "</interface-information>" ] }
場合によっては、コマンドまたは RPC の出力が広範囲に及ぶことがあり、モジュールの応答で出力を抑制する必要がある場合があります。モジュールの応答で出力キーを省略するには、そのモジュールの引数リストに return_output: false
を含めます。
tasks: - name: Get interface information juniper.device.rpc: rpcs: "get-interface-information" return_output: false register: junos_result
コマンドまたは RPC 出力の形式を指定する方法
command
モジュールと rpc
モジュールは、デバイスからの RPC 応答をモジュール応答のいくつかの異なるキー(stdout
、stdout_lines
、parsed_output
)に格納します。parsed_output
キーは、コマンドまたは RPC 出力形式が XML または JSON の場合にのみ存在し、JSON データ構造に解析されるデータが含まれています。
stdout
キーと stdout_lines
キーには、モジュールに定義されているデフォルト形式のデータが含まれています。デフォルトでは、command
モジュールはコマンド出力をテキスト形式で返し、rpc
モジュールはRPC出力をXML形式形式で返します。
別の出力形式を指定するには、 formats
引数を含め、目的の形式と等しい値を設定します。サポートされている形式は次のとおりです。
-
json
-
text
-
xml
formats
パラメーターは、文字列または文字列のリストのいずれかを取ります。複数のコマンドまたは RPC を実行し、1 つの形式のみを指定した場合、出力形式は実行されるすべてのコマンドと RPC で同じになります。各コマンドまたは RPC の出力に異なる形式を指定するには、formats
引数に目的の形式のリストを設定します。リストには、コマンドやRPCと同じ数のフォーマットを指定する必要があります。
以下のプレイブックは、インベントリグループ内の各デバイスで 2 つの RPC を実行し、実行されたすべての RPC の出力のテキスト形式を要求します。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and system uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" formats: "text" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
Playbook が実行されると、モジュール応答の stdout
キーと stdout_lines
キーには、テキスト形式の RPC 応答が含まれます。
次のプレイブックは、インベントリグループの各デバイスで 2 つの RPC を実行し、最初の RPC の出力をテキスト形式で、2 番目の RPC の出力を JSON 形式で要求します。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and system uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" formats: - "text" - "json" register: junos_result - name: Print response ansible.builtin.debug: var: junos_result
コマンドまたは RPC 出力をファイルに保存する方法
juniper.device.command
およびjuniper.device.rpc
モジュールを使用してデバイス上でコマンドまたはRPCを実行する場合、dest
またはdest_dir
モジュール引数を含めることで、返されたデータをローカルのAnsible制御ノード上のファイルに保存できます。dest_dir
オプションは、各コマンドまたは RPC の出力をデバイスごとに個別のファイルに保存しますが、dest
オプションは、すべてのコマンドと RPC の出力をデバイス向けの同じファイルに保存します。ターゲット名を持つ出力ファイルが既に存在する場合、モジュールはそのファイルを上書きします。
データをファイルに保存していて、モジュールの応答でコマンドまたは RPC 出力を複製したくない場合は、オプションでモジュールの引数リストに return_output: false
を含めることができます。 return_output
を false
に設定すると、モジュールはモジュールの応答で出力キーを省略します。これは、デバイスが大量のデータを返す場合に必要になることがあります。
次のセクションでは、 dest_dir
オプションと dest
オプションの使用方法について説明します。
dest_dir
取得したデータが保存されるローカルAnsible制御ノード上のディレクトリを指定するには、dest_dir
引数を含め、ターゲットディレクトリへのパスを定義します。モジュールは、デバイスで実行された各コマンドまたはRPCの出力を、hostname_name.formatという名前の個別のファイルに保存します。
-
hostname- コマンドまたは RPC が実行されるデバイスのホスト名。
-
name—管理対象デバイスで実行されたコマンドまたは RPC の名前。このモジュールは、コマンド名のスペースをアンダースコア(_ )に置き換えます。
-
format- 出力の形式( json、 text、または xml)。
以下のプレイブックは、インベントリグループ内の各デバイスで2つのRPCを実行し、各デバイスの各RPCの出力を、Ansible制御ノード上のプレイブックディレクトリ内の個別のファイルに保存します。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" dest_dir: "{{ playbook_dir }}"
その結果、ホスト dc1a.example.net の出力ファイルは次のようになります。
-
dc1a.example.net_get-software-information.xml
-
dc1a.example.net_get-system-uptime-information.xml
同様に、以下のプレイブックは、インベントリグループ内の各デバイスで同等のコマンドを実行し、各デバイスの各コマンドの出力を、Ansible制御ノード上のプレイブックディレクトリ内の個別のファイルに保存します。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.command: commands: - "show version" - "show system uptime" dest_dir: "{{ playbook_dir }}"
その結果、ホスト dc1a.example.net の出力ファイルは次のようになります。
-
dc1a.example.net_show_version.テキスト
-
dc1a.example.net_show_system_uptime.テキスト
宛先
ターゲット ノードのすべてのコマンドまたは RPC 出力がローカルの Ansible 制御ノードに保存されるパスとファイル名を指定するには、 dest
引数を含め、ファイル名またはファイルのフルパスを定義します。 dest
引数を含め、ディレクトリを省略すると、ファイルは Playbook ディレクトリに保存されます。複数のデバイスでコマンドやRPCを実行する場合、 dest
引数には {{ inventory_hostname }}
などの変数を含めて、各デバイスのファイル名を区別する必要があります。ファイル名を区別しないと、各デバイスの出力ファイルが他のデバイスの出力ファイルを上書きします。
次のプレイブックは、インベントリグループの各デバイスでRPCを実行します。すべてのRPCの出力は、デバイスごとに個別のファイルに保存され、ファイルはAnsible制御ノードのプレイブックディレクトリに配置されます。各ファイルは、デバイスのホスト名によって一意に識別されます。
--- - name: Get device information hosts: dc1 connection: local gather_facts: no tasks: - name: Get software and uptime information juniper.device.rpc: rpcs: - "get-software-information" - "get-system-uptime-information" dest: "{{ inventory_hostname }}-system-information.xml"
たとえば、ホスト dc1a.example.net の結果の出力ファイルは dc1a.example.net-system-information.xml され、デバイス上で実行されたすべての RPC の出力が含まれます。