Verwenden von Ansible zum Ausführen von Befehlen und RPCs auf Junos-Geräten
ZUSAMMENFASSUNG Verwenden Sie die Ansible-Module von Juniper Networks, um Befehle für den Betriebsmodus und RPCs auf Junos-Geräten auszuführen.
Juniper Networks bietet Ansible-Module, mit denen Sie Befehle im Betriebsmodus und Remote Procedure Calls (RPCs) auf Junos-Geräten ausführen können. Tabelle 1 gibt einen Überblick über die Module.
Inhaltsgruppe |
Modulname |
---|---|
|
In den folgenden Abschnitten wird erläutert, wie Sie die Module verwenden, die Modulantwort analysieren, das Ausgabeformat angeben und die Ausgabe in einer Datei speichern.
Um gezielte Daten einfacher aus der Betriebsausgabe zu extrahieren, können Sie das 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.
Ausführen von Befehlen mit den Modulen von Juniper Networks
Das juniper.device.command
Modul ermöglicht das Ausführen von Befehlen im Betriebsmodus auf Junos-Geräten. Das Modul benötigt ein Argument, bei dem es sich um eine Liste von einem oder mehreren Junos OS-Befehlen für den Betriebsmodus handelt, commands
die auf dem Gerät ausgeführt werden sollen.
Das folgende Playbook führt zwei Betriebsmodusbefehle auf jedem Gerät in der Bestandslistengruppe aus und zeigt die Modulantwort in der Standardausgabe an. In diesem Beispiel authentifiziert sich das command
Modul beim Gerät mithilfe von SSH-Schlüsseln am Standardspeicherort.
--- - 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 zur Antwort und zum Ausgabeformat des Moduls finden Sie unter Grundlegendes zur Modulantwort und Angeben des Formats für die Befehls- oder RPC-Ausgabe.
So führen Sie RPCs mit den Modulen von Juniper Networks aus
Die Junos XML-API ist eine XML-Darstellung von Junos OS-Konfigurationsanweisungen und Befehlen für den Betriebsmodus. Sie definiert eine XML-Entsprechung für alle Anweisungen in der Junos OS-Konfigurationshierarchie und für 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 Remote Procedure Calls (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 im Antwort-Tag-Element eingeschlossen sind.
Das juniper.device.rpc
Modul ermöglicht das Ausführen von RPCs auf Junos-Geräten. Für die Module ist ein Argument erforderlich, bei dem es sich um eine Liste von einem oder mehreren Junos OS RPCs handelt, rpcs
die auf dem Gerät ausgeführt werden sollen.
Das folgende Playbook führt den get-interface-information
RPC auf jedem Gerät in der Bestandslistengruppe aus und zeigt die Modulantwort in der Standardausgabe an. , Der RPC entspricht dem Befehl für den show interfaces
Betriebsmodus. In diesem Beispiel authentifiziert sich das rpc
Modul beim Gerät mithilfe von SSH-Schlüsseln am Standardspeicherort.
--- - 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
Weitere Informationen zum Zuordnen von CLI-Befehlen zu RPC-Anforderungs-Tags finden Sie im Junos XML API Explorer für Betriebs-Tags.
Informationen zur Antwort und zum Ausgabeformat des Moduls finden Sie unter Grundlegendes zur Modulantwort und Angeben des Formats für die Befehls- oder RPC-Ausgabe.
Das juniper.device.rpc
Modul unterstützt die Option, mit der kwargs
Sie Schlüsselwortargumente und -werte für die RPCs angeben können. Der Wert von kwargs
kann sein:
-
Ein einzelnes Wörterbuch mit Schlüsselwörtern und Werten
-
Eine Liste von Wörterbüchern, die Argumente für mehrere RPCs liefern
Es muss eine Eins-zu-Eins-Entsprechung zwischen den Elementen in der kwargs
Liste und den RPCs in der rpcs
Liste geben. Wenn Sie mehrere RPCs ausführen und für einen RPC keine Argumente erforderlich sind, legen Sie das entsprechende kwargs
Listenelement auf ein leeres Wörterbuch {}
fest. Wenn für ein einzelnes RPC-Argument kein Wert erforderlich ist, legen Sie den Wert auf true
fest.
Sie müssen in RPC-Argumenten Unterstriche anstelle von Bindestrichen verwenden, die unter bestimmten Umständen zu Ausnahmen oder Fehlern führen können.
Das folgende Playbook führt die angegebenen RPCs auf jedem Gerät in der Bestandslistengruppe aus und zeigt die Modulantwort in der Standardausgabe an. Der get-interface-information
RPC fordert eine knappe Pegelausgabe für die lo0.0-Schnittstelle an, und der get-lldp-interface-neighbors
RPC fordert Informationen für die ge-0/0/0-Schnittstelle 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
Grundlegendes zur Modulantwort
juniper.device.rpc
Die juniper.device.command
und-Module speichern die RPC-Antwort des Geräts in mehreren verschiedenen Schlüsseln in der Modulantwort. Die Daten für jeden Schlüssel sind wie folgt aufgebaut:
-
stdout
Die RPC-Antwort ist eine einzelne mehrzeilige Zeichenfolge. -
stdout_lines
Die RPC-Antwort ist eine Liste mit einzeiligen Zeichenfolgen. -
parsed_output
: Die RPC-Antwort wird in eine JSON-Datenstruktur (JavaScript Object Notation) geparst. Dieser Schlüssel wird nur zurückgegeben, 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 und enthält alle Schlüssel, die für diesen Befehl oder RPC zurückgegeben werden.
Die folgende Antwort entspricht z. B. 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 erforderlich sein, die Ausgabe in der Antwort des Moduls zu unterdrücken. Wenn Sie die Ausgabeschlüssel in der Antwort des Moduls weglassen möchten, fügen 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
Angeben des Formats für die Befehls- oder RPC-Ausgabe
Die command
und-Module speichern die RPC-Antwort des Geräts in mehreren verschiedenen Schlüsseln in der Modulantwortstdout
: , stdout_lines
, und parsed_output
.rpc
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 im Standardformat, das für das Modul definiert ist. Standardmäßig gibt das command
Modul die Befehlsausgabe im Textformat und die rpc
RPC-Ausgabe im XML-Format zurück.
Wenn Sie ein anderes Ausgabeformat angeben möchten, schließen Sie das formats
Argument ein, und legen Sie den Wert auf das gewünschte Format fest. Folgende Formate werden unterstützt:
-
json
-
text
-
xml
Der formats
Parameter akzeptiert entweder eine Zeichenfolge oder eine Liste von Zeichenfolgen. Wenn Sie mehrere Befehle oder RPCs ausführen und nur ein einzelnes Format angeben, ist das Ausgabeformat für alle ausgeführten Befehle und RPCs identisch. Wenn Sie ein anderes Format für die Ausgabe der einzelnen Befehle oder RPCs angeben möchten, legen Sie das formats
Argument auf eine Liste der gewünschten Formate fest. In der Liste muss die gleiche Anzahl von Formaten angegeben werden, wie Befehle oder RPCs vorhanden sind.
Das folgende Playbook führt zwei RPCs auf jedem Gerät in der Bestandslistengruppe aus und 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
Wenn das Playbook ausgeführt wird, enthalten die stdout
Schlüssel und stdout_lines
in der Modulantwort die RPC-Antwort im Textformat.
Das folgende Playbook führt zwei RPCs auf jedem Gerät in der Bestandslistengruppe aus und 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
Speichern des Befehls oder der RPC-Ausgabe in einer Datei
Wenn Sie die juniper.device.command
juniper.device.rpc
und-Module verwenden, um einen Befehl oder RPC auf einem Gerät auszuführen, können Sie die zurückgegebenen Daten in einer Datei auf dem lokalen Ansible-Steuerungsknoten speichern, indem Sie die Argumente oder dest
dest_dir
module einfügen. Während die dest_dir
Option die Ausgabe für jeden Befehl oder RPC in separaten Dateien für ein Gerät speichert, speichert die dest
Option 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 den Befehl oder die RPC-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. Dies kann erforderlich sein, wenn das Gerät eine erhebliche Datenmenge zurückgibt.
In den folgenden Abschnitten wird beschrieben, wie Sie die dest_dir
Optionen und dest
verwenden.
dest_dir
Um das Verzeichnis auf dem lokalen Ansible-Kontrollknoten 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 Bestandslistengruppe aus und 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 Bestandslistengruppe aus und 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
Um den Pfad und den Dateinamen anzugeben, unter dem alle Befehle oder RPC-Ausgaben für einen Zielknoten auf dem lokalen Ansible-Kontrollknoten gespeichert werden, fügen Sie das dest
Argument hinzu und definieren Sie den Dateinamen oder den vollständigen Pfad der Datei. Wenn Sie das dest
Argument einschließen, 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 {{ inventory_hostname }}
enthalten, 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.
Das folgende Playbook führt RPCs auf jedem Gerät in der Bestandslistengruppe aus. Die Ausgabe für alle RPCs wird für jedes Gerät in einer separaten Datei gespeichert, und die Datei wird im Playbook-Verzeichnis auf dem Ansible-Steuerungsknoten abgelegt. Jede Datei wird durch den Hostnamen des Geräts eindeutig 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 wird 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.