Authentifizieren von Benutzern, die Ansible-Module auf Junos-Geräten ausführen
Authentifizierung – Übersicht
Juniper Networks bietet Ansible-Module, mit denen Sie Junos-Geräte verwalten können. Die Module von Juniper Networks werden über die Sammlung verteilt, die juniper.device
auf Ansible Galaxy gehostet wird.
Mit den Modulen von Juniper Networks können Sie eine direkte Verbindung zu Junos-Geräten herstellen und diese über SSH, Telnet oder eine serielle Konsolenverbindung verwalten. Die Module unterstützen auch die Verbindung mit dem Gerät über eine SSH- oder Telnet-Verbindung zu einem Konsolenserver, der mit dem Port des Geräts CONSOLE
verbunden ist. Das Remotegerät muss in der Lage sein, den Benutzer je nach Verbindungsprotokoll mit einem Kennwort oder anderen standardmäßigen SSH-Authentifizierungsmechanismen zu authentifizieren.
Wenn Sie Ansible zum Verwalten von Junos-Geräten verwenden, ist der bequemste Weg, auf das Gerät zuzugreifen, die Konfiguration von SSH-Schlüsseln. SSH-Schlüssel ermöglichen es dem Remotegerät, vertrauenswürdige Benutzer zu identifizieren. Alternativ können Sie beim Ausführen von Modulen und Playbooks einen Benutzernamen und ein Kennwort angeben.
Bei SSH-Verbindungen versuchen die Module von Juniper Networks zunächst, mit SSH die Public Key-basierte Authentifizierung und dann die passwortbasierte Authentifizierung. Wenn SSH-Schlüssel verwendet werden, wird das angegebene Passwort als Passphrase zum Entsperren des privaten SSH-Schlüssels verwendet. Wenn die kennwortbasierte Authentifizierung verwendet wird, wird das angegebene Kennwort als Gerätekennwort verwendet. Wenn die SSH-Authentifizierung mit öffentlichem Schlüssel verwendet wird und der private SSH-Schlüssel eine leere Passphrase aufweist, ist kein Kennwort erforderlich. Es wird jedoch nicht empfohlen, private SSH-Schlüssel mit leeren Passphrasen zu verwenden. Um ein Kennwort für die kennwortbasierte Authentifizierung oder kennwortgeschützte SSH-Schlüssel abzurufen, können Sie über das Playbook oder die Befehlszeile zur Eingabe des Kennworts auffordern, oder Sie können eine im Tresor verschlüsselte Datendatei erstellen, in der das Kennwort sicher gespeichert wird.
Sie können Verbindungs- und Authentifizierungsparameter für die Module von Juniper Networks wie folgt angeben. Wenn Sie die Werte nicht explizit definieren, werden in einigen Fällen Standardwerte verwendet, wie unter Grundlegendes zu den Standardwerten für Juniper Networks-Module beschrieben. Wenn Sie den Wert eines Parameters an mehreren Stellen definieren, wählt Ansible den Wert basierend auf der Variablenrangfolge aus, wie unter Grundlegendes zur Variablenrangfolge in der offiziellen Ansible-Dokumentation beschrieben.
-
Ansible-Variablen: Sie können die Werte der Verbindungs- und Authentifizierungsparameter angeben, indem Sie normale Ansible-Variablen verwenden, z. B. Variablen, die in Inventar- oder Tresordateien definiert sind, in Host- oder Gruppenvariablen oder mithilfe von Befehlszeilenoptionen.
-
SSH-Client-Konfigurationsdatei: Bei SSH-Verbindungen fragen die Module von Juniper Networks automatisch die SSH-Standardkonfigurationsdatei unter ~/.ssh/config ab, sofern vorhanden. Sie können auch die
ssh_config
Option zum Angeben einer anderen Konfigurationsdatei einschließen. Die Module verwenden alle relevanten Einstellungen in der SSH-Konfigurationsdatei für die angegebene Verbindung, es sei denn, Sie definieren explizit Variablen, die die Einstellung außer Kraft setzen. -
Modulargumente: Die
juniper.device
Module unterstützen die Angabe von verbindungs- und authentifizierungsbezogenen Optionen für lokale Verbindungen (connection: local
) als Modulargumente der obersten Ebene. -
vars:
-Abschnitt: Diejuniper.device
Module unterstützen das Angeben von verbindungs- und authentifizierungsbezogenen Optionen für lokale und persistentevars:
Verbindungen im Abschnitt eines Spiels, der unter Definieren von Authentifizierungsparametern in den vars: Abschnitt für lokale und persistente Verbindungen beschrieben wird.
In diesem Dokument werden die verschiedenen Aspekte der Authentifizierung bei der Verwendung der Juniper Networks-Module zur Verwaltung von Junos-Geräten erläutert.
Grundlegendes zu den Standardwerten für Module von Juniper Networks
Sie können die Verbindungs- und Authentifizierungsparameter für Module, die Junos-Geräte verwalten, explizit definieren. Wenn Sie keinen Parameter definieren, verwendet das Modul in einigen Fällen einen Standardwert. In Tabelle 1 sind die Standardwerte und die Variablenrangfolge für allgemeine Verbindungsparameter für Module in der juniper.device
Auflistung aufgeführt. Informationen zu den Argumenten, die für die einzelnen Module akzeptiert werden, finden Sie in der API-Referenzdokumentation für dieses Modul.
Parametername |
Parameter-Aliasnamen |
Beschreibung |
Standardwert und Variablenrangfolge |
---|---|---|---|
|
|
Hostname oder IP-Adresse des Remote-Geräts, mit dem die Verbindung hergestellt werden soll. |
|
|
|
Das Kennwort oder die Passphrase des SSH-Schlüssels des Benutzers, die für die Authentifizierung beim verwalteten Gerät verwendet wird. |
|
|
– |
Pfad zu einer SSH-Clientkonfigurationsdatei. Wenn Sie diesen Parameter weglassen, verwenden die Module die SSH-Konfigurationsdatei am Standardspeicherort, sofern vorhanden. |
~/.ssh/config |
|
|
Pfad zu der privaten SSH-Schlüsseldatei, die für die Authentifizierung beim Remotegerät verwendet wird. Wenn Sie den Pfad nicht explizit angeben und kein Standardwert gefunden wird, verwendet das Modul die SSH-Datei mit dem privaten Schlüssel, die in der SSH-Konfiguration des Benutzers angegeben ist, oder den betriebssystemspezifischen Standardwert. |
|
|
|
Benutzername, der für die Authentifizierung beim verwalteten Knoten verwendet wird. |
|
Beim Ausführen von Juniper Networks-Modulen wird das host
Argument immer für eine Verbindung benötigt. Sie müssen den Host jedoch nicht explizit angeben, da er standardmäßig auf {{ inventory_hostname }}
.
Sie können Juniper Networks-Module mit jedem Benutzerkonto ausführen, das Zugriff auf das verwaltete Junos-Gerät hat. Wenn Sie die Module ausführen, werden die Zugriffsberechtigungen des Junos OS-Benutzerkontos erzwungen, und die für das Junos OS-Benutzerkonto konfigurierte Klasse bestimmt die Berechtigungen. Wenn Sie keinen Benutzer angeben, wird der Benutzer gemäß dem in Tabelle 1 beschriebenen user
Algorithmus festgelegt. In der Ansible-Dokumentation finden Sie die Rangfolge für die Definition remote_user
von , die auf verschiedene Arten definiert werden kann, darunter:
-
-u
oder--user
Befehlszeilenoption -
ANSIBLE_REMOTE_USER
Umgebungsvariable -
remote_user
Konfigurationseinstellung
So definieren Sie Authentifizierungsparameter in den Variablen: Abschnitt für lokale und persistente Verbindungen
Sie können Verbindungs- und Authentifizierungsparameter für die juniper.device
Module im Abschnitt des vars:
Spiels definieren. Sie können sie nicht nur wie gewohnt über andere Variablen definieren, z. B. in der SSH-Konfigurationsdatei, in der Ansible-Bestandsdatei, als Befehlszeilenargumente oder als Modulargumente. Der vars:
Abschnitt ermöglicht es Ihnen, allgemeine Verbindungsparameter an einem einzigen Ort zu definieren, über den alle Module im Spiel eine Verbindung zu einem Host herstellen können. Darüber hinaus erfordern bestimmte Ansible-Verbindungen die Verwendung des vars:
Abschnitts beim Definieren der Parameter innerhalb des Spiels, wie hier beschrieben.
Die juniper.device
Module unterstützen die folgenden Ansible-Verbindungstypen:
-
lokale Verbindungen, die durch die Verwendung von
connection: local
-
persistente Verbindungen, die mithilfe von
connection: juniper.device.pyez
Sowohl für lokale als auch für persistente Verbindungen führt Ansible Module lokal auf dem Steuerungsknoten aus. Wenn Sie verwenden connection: local
, stellt Ansible für jede Aufgabe im Spiel, für die eine Verbindung erforderlich ist, eine separate Verbindung zum Host her. Im Gegensatz dazu stellt Ansible bei der Verwendung connection: juniper.device.pyez
von eine einzelne, dauerhafte Verbindung zu einem Host her, die über die Ausführung aller Aufgaben im Spiel bestehen bleibt.
Sie verwenden für persistente Verbindungen dieselben Verbindungs- und Authentifizierungsparameter wie für lokale Verbindungen, und die Standardparameterwerte, die unter Grundlegendes zu den Standardwerten für Juniper Networks-Module erläutert werden, gelten für beide Arten von Verbindungen. Für lokale Verbindungen können Sie die Verbindungs- und Authentifizierungsparameter entweder im vars:
Abschnitt oder als Modulargumente definieren. Wenn Sie die Parameter an beiden Stellen definieren, haben die Modulargumente Vorrang. Wenn Sie jedoch Parameter innerhalb eines Spiels für persistente Verbindungen definieren, müssen Sie die Parameter im vars:
Abschnitt definieren. Bei persistenten Verbindungen gibt es nur eine einzige Verbindung für alle Aufgaben, und daher müssen Sie die Parameter global definieren, damit sie für alle Aufgaben in diesem Spiel gelten.
Das folgende Playbook führt zwei juniper.device
Module auf jedem Host in der Bestandslistengruppe aus. Die Wiedergabe definiert die Ansible-Verbindung als juniper.device.pyez
, wodurch eine Verbindung zu jedem Host hergestellt wird, die über die Ausführung aller Aufgaben im Spiel bestehen bleibt. Die Authentifizierungsparameter für die persistente Verbindung werden im Abschnitt des Spiels vars:
definiert. Die user
Werte und passwd
verweisen auf Variablen, die in der vault-vars.yaml
Tresordatei definiert sind.
--- - name: Get Device Facts hosts: dc1 connection: juniper.device.pyez gather_facts: no vars: user: "{{ admin_username }}" passwd: "{{ admin_password }}" vars_files: - vault-vars.yaml tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Get hardware inventory juniper.device.command: commands: "show chassis hardware" dest_dir: "{{ playbook_dir }}"
Authentifizieren des Benutzers mithilfe von SSH-Schlüsseln
Mit den Modulen von Juniper Networks können Sie SSH-Schlüssel juniper.device
verwenden, um eine Verbindung zu einem Junos-Gerät oder zu einem Konsolenserver herzustellen, der mit dem Gerät verbunden ist. Um einen Benutzer mithilfe von SSH-Schlüsseln zu authentifizieren, generieren Sie zuerst die Schlüssel auf dem Ansible-Steuerungsknoten und konfigurieren Sie dann die Schlüssel auf dem Gerät, mit dem das Modul verbunden wird, entweder auf dem verwalteten Junos-Gerät oder auf dem mit dem Junos-Gerät verbundenen Konsolenserver.
Generieren und Konfigurieren der SSH-Schlüssel
So generieren Sie SSH-Schlüssel auf dem Ansible-Steuerungsknoten und konfigurieren den öffentlichen Schlüssel auf dem Remote-Gerät:
Verwenden von SSH-Schlüsseln in Ansible-Playbooks
Nachdem Sie das SSH-Schlüsselpaar generiert und den öffentlichen Schlüssel auf dem Remotegerät konfiguriert haben, können Sie den Schlüssel verwenden, um eine Verbindung mit dem Gerät herzustellen. Die Module von Juniper Networks fragen automatisch die SSH-Standardkonfigurationsdatei unter ~/.ssh/config ab, sofern vorhanden. Sie können auch die ssh_config
Option definieren, eine andere Konfigurationsdatei anzugeben. Die Module verwenden alle relevanten Einstellungen in der SSH-Konfigurationsdatei für die angegebene Verbindung, es sei denn, Sie definieren explizit Variablen, die die Einstellung außer Kraft setzen. Darüber hinaus suchen die Module automatisch nach Schlüsseln am Standardspeicherort und Schlüsseln, die aktiv in einem SSH-Schlüsselagenten geladen werden.
Um bestimmte Einstellungen für SSH-Schlüssel zu definieren, können Sie die entsprechenden Argumente in Ihr Ansible-Playbook aufnehmen. Definieren Sie die Argumente an der Stelle, die für Ihren Satz von Modulen und die Ansible-Verbindung geeignet ist, z. B. im vars:
Abschnitt für Wiedere, die die juniper.device
Module mit einer persistenten Verbindung verwenden. Welche Argumente eingeschlossen werden sollen, hängt vom Speicherort des Schlüssels ab, davon, ob der Schlüssel aktiv in einen SSH-Schlüsselagenten geladen wird, ob der Schlüssel kennwortgeschützt ist und ob die SSH-Konfigurationsdatei des Benutzers bereits Einstellungen für diesen Host definiert.
-
Um eine Verbindung zu einem Junos-Gerät über SSH-Schlüssel herzustellen, die aktiv in den nativen SSH-Schlüsselagenten geladen werden oder sich am Standardspeicherort befinden und nicht über einen Kennwortschutz verfügen, müssen Sie keine verbindungs- oder authentifizierungsbezogenen Argumente definieren, es sei denn, sie weichen von den Standardargumenten ab.
juniper.device.facts: savedir: "{{ playbook_dir }}"
-
Um eine Verbindung zu einem Junos-Gerät über SSH-Schlüssel herzustellen, die sich nicht am Standardspeicherort befinden und nicht über einen Kennwortschutz verfügen, legen Sie das
ssh_private_key_file
Argument auf den Pfad der privaten SSH-Schlüsseldatei fest. Zum Beispiel:vars: ssh_private_key_file: "/home/user/.ssh/id_rsa_alternate" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"
Alternativ können Sie den Pfad des privaten SSH-Schlüssels angeben, indem Sie ihn in der SSH-Konfigurationsdatei definieren. durch Festlegen der
ANSIBLE_NET_SSH_KEYFILE
Umgebungsvariablen oder durch Definieren der--private-key
Befehlszeilenoption oder--key-file
beim Ausführen des Playbooks. -
Um eine Verbindung zu einem Junos-Gerät über eine kennwortgeschützte SSH-Schlüsseldatei herzustellen, was die empfohlene Methode ist, können Sie im
passwd
Argument auf die Passphrase der SSH-Schlüsseldatei verweisen oder das Kennwort mithilfe normaler Ansible-Variablen oder Befehlszeilenoptionen angeben.Es liegt in der Verantwortung des Benutzers, die Passphrase für die SSH-Schlüsseldatei auf sichere Weise zu erhalten, die für seine Umgebung geeignet ist. Es empfiehlt sich, entweder bei jedem Aufruf des Playbooks dazu aufzufordern oder die Variablen in einem verschlüsselten Tresor zu speichern, anstatt die Anmeldeinformationen in einem unverschlüsselten Format zu speichern. Sie können z. B. das Playbook mit der
--ask-pass
Befehlszeilenoption ausführen und die Passphrase für die SSH-Schlüsseldatei angeben, wenn Sie dazu aufgefordert werden, wie hier gezeigt:vars: ssh_private_key_file: "/home/user/.ssh/id_rsa_dc" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"
user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password:
Weitere Informationen zur Verwendung einer Eingabeaufforderung oder einer verschlüsselten Tresordatei für die Passphrase des SSH-Schlüssels finden Sie unter Authentifizieren des Benutzers mithilfe eines Playbooks oder einer Befehlszeilen-Kennworteingabeaufforderung und Authentifizieren des Benutzers mithilfe einer mit einem Ansible-Tresor verschlüsselten Datei.
Anweisungen zur Verwendung von SSH-Schlüsseln zum Herstellen einer Verbindung mit einem Konsolenserver finden Sie unter Authentifizierung über einen Konsolenserver.
Authentifizieren des Benutzers mithilfe eines Playbooks oder einer Eingabeaufforderung für das Befehlszeilenkennwort
Um einen Benutzer zu authentifizieren, der Ansible-Module ausführt, können Sie beim Ausführen des Playbooks zur Eingabe der Anmeldeinformationen des Benutzers auffordern. Sie können z. B. eine interaktive Eingabeaufforderung im Playbook definieren, oder Sie können das Playbook mit der -k
Befehlszeilenoption or --ask-pass
ausführen, um zur Eingabe des Kennworts aufzufordern. Wenn SSH-Schlüssel verwendet werden, wird das angegebene Passwort als Passphrase zum Entsperren des privaten SSH-Schlüssels verwendet. Wenn die kennwortbasierte Authentifizierung verwendet wird, wird das angegebene Kennwort als Gerätekennwort verwendet.
So definieren Sie eine interaktive Eingabeaufforderung im Playbook, um das Kennwort oder die Passphrase des SSH-Schlüssels des Benutzers zu erhalten:
Alternativ können Sie ein Playbook mit der -k
Befehlszeilenoption oder --ask-pass
ausführen, um zur Eingabe des Kennworts oder der Passphrase aufzufordern. Betrachten Sie das folgende Playbook, in dem der Standardbenutzername verwendet wird:
--- - name: Get Device Facts hosts: all connection: local gather_facts: no tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print facts ansible.builtin.debug: var: junos.version
Führen Sie das Playbook aus, und fügen Sie die -k
Befehlszeilenoption or --ask-pass
ein, die zur Eingabe des Kennworts auffordert und das Kennwort nicht in der Befehlszeile wiedergibt.
user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password: PLAY [Get Device Facts] *********************************************** ...
Authentifizieren des Benutzers mithilfe einer durch Ansible Vault verschlüsselten Datei
Sie können einen Ansible-Tresor erstellen, in dem gespeicherte Kennwörter und andere sensible Verbindungs- und Authentifizierungswerte sicher in einer durch den Tresor verschlüsselten Datendatei gespeichert werden. Ihr Playbook kann dann an der für Ihren Satz von Modulen und den Ansible-Verbindungstyp geeigneten Position auf diese Variablen verweisen, z. B. im Abschnitt des Spiels vars:
oder als Modulargumente.
So erstellen und verwenden Sie eine Ansible-Tresordatei mit den erforderlichen Variablen, einschließlich Kennwörtern:
Authentifizierung über einen Konsolenserver
Die Ansible-Module von Juniper Networks können über einen Konsolenserver mit Junos-Geräten verbunden werden. Für SSH-Verbindungen über einen Konsolenserver müssen Sie die Anmeldeinformationen für die Authentifizierung sowohl für den Konsolenserver als auch für das Junos-Gerät angeben. Sie können entweder ein Gerätekennwort oder eine kennwortgeschützte SSH-Schlüsseldatei für die Konsolenserver-Authentifizierung verwenden.
Um über einen Konsolenserver eine Verbindung zu einem Junos-Gerät herzustellen, müssen Sie die folgenden Parameter in Ihrem Playbook angeben, wenn kein Standardwert vorhanden oder der Standardwert nicht geeignet ist:
-
host
– Hostname oder IP-Adresse des Konsolenservers -
user
undpasswd
—Anmeldedaten für Junos OS -
cs_user
– Benutzername des Konsolenservers -
cs_passwd
– Für die Authentifizierung beim Konsolenserver ist ein Gerätekennwort oder eine Passphrase für die SSH-Schlüsseldatei erforderlich.
Im folgenden Beispiel werden die Anmeldeinformationen für den Junos OS-Benutzer und den Konsolenserverbenutzer in einer Ansible-Tresordatei definiert. Auf die Tresorvariablen wird dann im Playbook verwiesen. In diesem Fall ist das cs_passwd
Argument die Passphrase für den SSH-Schlüssel, der ssh_private_key_file
im Argument angegeben ist.
--- - name: Get Device Facts hosts: dc1_con connection: local gather_facts: no vars_files: - vault-vars.yaml vars: host: "{{ inventory_hostname }}" user: "{{ junos_username }}" passwd: "{{ junos_password }}" cs_user: "{{ cs_username }}" cs_passwd: "{{ cs_key_password }}" ssh_private_key_file: "/home/user/.ssh/id_rsa_dc" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"