juniper.device.command Verwenden der Module und juniper.device.rpc Ansible zum Ausführen von Befehlen und RPCs auf Junos-Geräten
Sie können die Module und juniper.device.rpc Ansible juniper.device.command verwenden, um Betriebsmodusbefehle und RPCs auf Junos-Geräten auszuführen.
Juniper Networks stellt Ansible-Module bereit, mit denen Sie Betriebsmodusbefehle und Remote Procedure Calls (RPCs) auf Geräten ausführen können, auf denen Junos OS und Geräte mit Junos OS Evolved ausgeführt werden. Tabelle 1 skizziert die Module. Wenn Sie bereits einen bestimmten Satz von Modulen aus der juniper.device Sammlung verwenden, verwenden Sie die Module für diesen Satz.
|
Kollektion |
Modul-Set |
Modulname |
|---|---|---|
|
|
|
|
|
|
In den folgenden Abschnitten wird erläutert, wie Sie die juniper.device.command juniper.device.rpc and-Module verwenden, die Antwort des Moduls analysieren, das Ausgabeformat angeben und die Ausgabe in einer Datei speichern.
Um gezielte Daten einfacher aus der Betriebsausgabe zu extrahieren, können Sie die juniper.device.table Modul auch mit benutzerdefinierten oder vordefinierten Junos PyEZ-Betriebstabellen verwenden. Weitere Informationen finden Sie unter Verwenden von Ansible mit Junos PyEZ-Tabellen zum Abrufen von Betriebsinformationen von Junos-Geräten.
So führen Sie Befehle mit dem juniper.device.command Modul aus
Das juniper.device.command Modul ermöglicht es Ihnen, Betriebsmodusbefehle auf Junos-Geräten auszuführen. Das Modul benötigt ein Argument, , bei dem es sich um eine Liste von einem oder mehreren Junos OS-Betriebsmodusbefehlen handelt, commandsdie auf dem Gerät ausgeführt werden sollen.
Das folgende Playbook führt zwei Betriebsmodusbefehle auf jedem Gerät in der Bestandslistengruppe aus. Das Playbook zeigt die Antwort des Moduls in der Standardausgabe (stdout) an.
---
- 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
Informationen zum Antwort- und Ausgabeformat des Moduls finden Sie unter Grundlegendes zur Modulantwort und zum Angeben des Formats für die Befehls- oder RPC-Ausgabe.
Ausführen von RPCs mit dem juniper.device.rpc Modul
Die Junos XML API ist eine XML-Darstellung von Junos OS Konfigurationsanweisungen und Betriebsmodusbefehlen. Es definiert eine XML-Entsprechung für alle Anweisungen in der Junos OS-Konfigurationshierarchie und viele der Betriebsmodusbefehle, die Sie in der Junos OS CLI ausgeben. Jeder Betriebsmodusbefehl mit einem Junos XML-Gegenstück wird einem Anforderungs-Tag-Element und ggf. einem Antwort-Tag-Element zugeordnet. Anforderungs-Tags werden in RPCs innerhalb von NETCONF- oder Junos XML-Protokollsitzungen verwendet, um Informationen von einem Junos-Gerät anzufordern. Der Server gibt die Antwort mithilfe von Junos XML-Elementen zurück, die in das entsprechende Antwort-Tag-Element eingeschlossen sind.
Das juniper.device.rpc Modul ermöglicht es Ihnen, RPCs auf Junos-Geräten auszuführen. Das Modul benötigt ein Argument, bei dem es sich um eine Liste eines oder mehrerer Junos OS RPCs handelt, rpcsdie auf dem Gerät ausgeführt werden sollen.
Das folgende Playbook führt den get-interface-information RPC auf jedem Gerät in der Bestandsgruppe aus und zeigt die Antwort des Moduls in stdout an. Der RPC entspricht dem show interfaces Betriebsmodusbefehl.
---
- 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
Informationen zum Zuordnen von CLI-Befehlen zu RPC-Anforderungs-Tags finden Sie im Junos XML API Explorer für Betriebs-Tags.
Informationen zum Antwort- und Ausgabeformat des Moduls finden Sie unter Grundlegendes zur Modulantwort und zum Angeben des Formats für die Befehls- oder RPC-Ausgabe.
Das juniper.device.rpc Modul unterstützt die kwargs Option, mit der Sie Schlüsselwortargumente und -werte für die RPCs angeben können. Der Wert von kwargs kann sein:
-
Ein einziges Wörterbuch mit Schlüsselwörtern und Werten
-
Eine Liste von Wörterbüchern, die Argumente für mehrere RPCs liefert
Es muss eine Eins-zu-Eins-Übereinstimmung zwischen den Elementen in der kwargs Liste und den RPCs in der rpcs Liste bestehen. Wenn Sie mehrere RPCs ausführen und ein RPC keine Argumente erfordert, setzen Sie das entsprechende kwargs Listenelement auf ein leeres Wörterbuch {}. Wenn für ein einzelnes RPC-Argument kein Wert erforderlich ist, wird der Wert auf truegesetzt.
Sie müssen in RPC-Argumenten Unterstriche anstelle von Bindestrichen verwenden, was unter bestimmten Umständen zu Ausnahmen oder Fehlern führen kann.
Das folgende Playbook führt die angegebenen RPCs auf jedem Gerät in der Bestandsgruppe aus und zeigt die Antwort des Moduls in stdout an. Der get-interface-information RPC fordert eine knappe Ausgabe für die lo0.0-Schnittstelle an. Der get-lldp-interface-neighbors RPC fordert Informationen für die Schnittstelle ge-0/0/0 an. Der get-software-information RPC verwendet ein leeres Wörterbuch, um den RPC ohne zusätzliche Argumente auszuführen.
---
- 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
Die Reaktion des Moduls verstehen
Die juniper.device.command Module und juniper.device.rpc speichern die RPC-Antwort des Geräts in mehreren verschiedenen Schlüsseln in der Modul-Antwort. Die Daten für jeden Schlüssel sind wie folgt strukturiert:
-
stdout– RPC-Antwort ist eine einzelne mehrzeilige Zeichenfolge. -
stdout_lines—RPC-Antwort ist eine Liste von einzeiligen Zeichenfolgen. -
parsed_output– Die RPC-Antwort wird in eine JSON-Datenstruktur (JavaScript Object Notation) analysiert. Dieser Schlüssel ist nur vorhanden, wenn das Format der Daten XML oder JSON ist.
Wenn das Modul einen einzelnen Befehl oder RPC ausführt, platziert die Antwort des Moduls die zurückgegebenen Schlüssel auf der obersten Ebene. Wenn das Modul mehrere Befehle oder RPCs ausführt, enthält die Antwort des Moduls stattdessen einen results Schlüssel, bei dem es sich um eine Liste von Wörterbüchern handelt. Jedes Element in der Liste entspricht einem einzelnen Befehl oder RPC. Er enthält alle Schlüssel, die für diesen Befehl oder RPC zurückgegeben werden.
Die folgende Antwort entspricht beispielsweise der Ausführung eines einzelnen 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>"
]
}
In einigen Fällen kann die Befehls- oder RPC-Ausgabe umfangreich sein, und es kann notwendig sein, die Ausgabe in der Antwort des Moduls zu unterdrücken. Um die Ausgabeschlüssel in der Antwort des Moduls wegzulassen, schließen Sie sie in die Argumentliste dieses Moduls ein return_output: false .
tasks:
- name: Get interface information
juniper.device.rpc:
rpcs: "get-interface-information"
return_output: false
register: junos_result
Festlegen des Formats für die Befehls- oder RPC-Ausgabe
rpc Die command und-Module speichern die RPC-Antwort des Geräts in mehreren verschiedenen Schlüsseln in der Modul-Antwort: stdout, stdout_linesund parsed_output. Der parsed_output Schlüssel, der nur vorhanden ist, wenn das Befehls- oder RPC-Ausgabeformat XML oder JSON ist, enthält Daten, die in eine JSON-Datenstruktur analysiert werden.
Die stdout Schlüssel und stdout_lines enthalten Daten in dem für das Modul definierten Standardformat. Standardmäßig gibt das command Modul die Befehlsausgabe im Textformat zurück, und das rpc Modul gibt die RPC-Ausgabe im XML-Format zurück.
Um ein anderes Ausgabeformat anzugeben, schließen Sie das formats Argument ein, und legen Sie den Wert auf das erforderliche Format fest. Zu den unterstützten Formaten gehören:
-
json -
text -
xml
Der formats Parameter akzeptiert entweder eine Zeichenfolge oder eine Liste von Zeichenfolgen. Wenn Sie nur ein einzelnes Format angeben, verwenden alle ausgeführten Befehle oder RPCs dieses Format. Um für jeden Befehl oder RPC ein anderes Format anzugeben, legen Sie das formats Argument auf eine Liste der erforderlichen Formate fest. Die Anzahl der Formate muss mit der Anzahl der Befehle oder RPCs übereinstimmen.
Das folgende Playbook führt zwei RPCs auf jedem Gerät in der Bestandsgruppe aus. Das Playbook fordert das Textformat für die Ausgabe aller ausgeführten RPCs an.
---
- 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
In der Antwort des Moduls enthalten die stdout Schlüssel und stdout_lines die RPC-Antwort im Textformat.
Das folgende Playbook führt zwei RPCs auf jedem Gerät in der Bestandsgruppe aus. Das Modul fordert die Ausgabe für den ersten RPC im Textformat und die Ausgabe für den zweiten RPC im JSON-Format an.
---
- 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
So speichern Sie den Befehl oder die RPC-Ausgabe in einer Datei
Wenn Sie das juniper.device.command ODER-Modul juniper.device.rpc verwenden, können Sie die zurückgegebenen Daten in einer Datei auf dem lokalen Ansible-Steuerungsknoten speichern. Um die Daten zu speichern, fügen Sie das dest Argument or dest_dir Modul ein. Die dest_dir Option speichert die Ausgabe für jeden Befehl oder RPC in separaten Dateien für ein Gerät. Die dest Option speichert die Ausgabe für alle Befehle und RPCs in derselben Datei für ein Gerät. Wenn bereits eine Ausgabedatei mit dem Zielnamen vorhanden ist, überschreibt das Modul die Datei.
Wenn Sie die Daten in einer Datei speichern und die Ausgabe in der Antwort des Moduls nicht duplizieren möchten, können Sie sie optional in die Argumentliste des Moduls aufnehmen return_output: false . Die Einstellung return_output auf false bewirkt, dass das Modul die Ausgabetasten in der Antwort des Moduls weglässt. Das Weglassen der Schlüssel kann erforderlich sein, wenn das Gerät eine erhebliche Datenmenge zurückgibt.
In den folgenden Abschnitten wird erläutert, wie Sie die dest_dir Optionen and dest verwenden.
dest_dir
Um das Verzeichnis auf dem lokalen Ansible-Steuerungsknoten anzugeben, in dem die abgerufenen Daten gespeichert werden, fügen Sie das dest_dir Argument hinzu und definieren Sie den Pfad zum Zielverzeichnis. Das Modul speichert die Ausgabe für jeden Befehl oder RPC, der auf einem Gerät ausgeführt wird, in einer separaten Datei mit dem Namen hostname_name.format Dabei gilt:
-
hostname– Hostname des Geräts, auf dem der Befehl oder RPC ausgeführt wird.
-
name– Name des Befehls oder RPC, der auf dem verwalteten Gerät ausgeführt wird. Das Modul ersetzt Leerzeichen im Befehlsnamen durch Unterstriche ( _ ).
-
format– Format der Ausgabe, das json, text oder xml sein kann.
Das folgende Playbook führt zwei RPCs auf jedem Gerät in der Bestandsgruppe aus. Das Playbook speichert die Ausgabe für jeden RPC für jedes Gerät in einer separaten Datei im Playbook-Verzeichnis auf dem Ansible-Steuerungsknoten.
---
- 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 }}"
Die resultierenden Ausgabedateien für Host-dc1a.example.net sind:
-
dc1a.example.net_get-software-information.xml
-
dc1a.example.net_get-system-uptime-information.xml
Auf ähnliche Weise führt das folgende Playbook die entsprechenden Befehle auf jedem Gerät in der Inventargruppe aus. Das Playbook speichert die Ausgabe für jeden Befehl für jedes Gerät in einer separaten Datei im Playbook-Verzeichnis auf dem Ansible-Steuerungsknoten:
---
- 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 }}"
Die resultierenden Ausgabedateien für Host-dc1a.example.net sind:
-
dc1a.example.net_show_version.text
-
dc1a.example.net_show_system_uptime.text
dest
Sie können die dest Option verwenden, um die Ausgabedatei anzugeben, in der alle Befehls- oder RPC-Ausgaben für einen Zielknoten auf dem lokalen Ansible-Steuerungsknoten gespeichert werden. Definieren Sie den Dateinamen oder den vollständigen Pfad der Datei. Wenn Sie das dest Argument angeben, aber das Verzeichnis weglassen, werden die Dateien im Playbook-Verzeichnis gespeichert. Wenn Sie Befehle oder RPCs auf mehreren Geräten ausführen, muss das dest Argument eine Variable enthalten, z. B {{ inventory_hostname }} . um den Dateinamen für jedes Gerät zu unterscheiden. Wenn Sie die Dateinamen nicht unterscheiden, überschreibt die Ausgabedatei für jedes Gerät die Ausgabedatei der anderen Geräte.
Im folgenden Playbook werden RPCs auf jedem Gerät in der Inventargruppe ausgeführt. Das Playbook speichert die Ausgabe für alle RPCs in einer separaten Datei für jedes Gerät. Die Datei wird im Playbook-Verzeichnis auf dem Ansible-Steuerungsknoten abgelegt. Jede Datei wird eindeutig durch den Hostnamen des Geräts identifiziert.
---
- 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"
Beispielsweise ist die resultierende Ausgabedatei für Host-dc1a.example.net dc1a.example.net-system-information.xml und enthält die Ausgabe für alle RPCs, die auf dem Gerät ausgeführt werden.