Autenticar a los usuarios que ejecutan módulos de Ansible en dispositivos Junos
Comprenda cómo autenticar a los usuarios cuando se utiliza el conjunto de juniper.device módulos de la colección de juniper.device Ansible.
Juniper Networks proporciona módulos de Ansible que puede usar para administrar dispositivos que ejecutan Junos OS y dispositivos que ejecutan Junos OS evolucionado. Los módulos de Juniper Networks se distribuyen a través de la juniper.device colección. La juniper.device colección incluye dos conjuntos de módulos:
-
juniper.devicemódulos (command,config,facts,file_copypmtudsoftwarepingrpcjsnapy, )srx_clustersystemtable -
junipernetworks.junosmódulos (juniper.device.junos_*)
En este tema se explica cómo autenticar a los usuarios cuando se utiliza solo el conjunto de juniper.device módulos. Para obtener información sobre el uso de los junipernetworks.junos módulos para conectarse y autenticarse con dispositivos Junos, consulte Uso de los módulos de Ansible juniper.device.junos_* para administrar dispositivos Junos.
Descripción general de la autenticación
Los juniper.device módulos le permiten conectarse directamente y administrar dispositivos Junos mediante SSH, Telnet o una conexión de consola serie. Los módulos también admiten la conexión al dispositivo a través de una conexión SSH o telnet a un servidor de consola que está conectado al puerto del CONSOLE dispositivo. El dispositivo remoto debe ser capaz de autenticar al usuario mediante una contraseña u otros mecanismos de autenticación SSH estándar, según el protocolo de conexión.
Cuando utilice Ansible para administrar dispositivos Junos, la forma más cómoda de acceder al dispositivo es configurar las claves SSH. Las claves SSH permiten que el dispositivo remoto identifique a los usuarios de confianza. Como alternativa, puede proporcionar un nombre de usuario y una contraseña al ejecutar módulos y playbooks.
En el caso de las conexiones SSH, los módulos primero prueban la autenticación basada en clave pública SSH y, luego, prueban la juniper.device autenticación basada en contraseña. Cuando se utiliza la autenticación basada en contraseña, la contraseña proporcionada se utiliza como contraseña del dispositivo. Cuando se utilizan claves SSH, la contraseña proporcionada es la frase de contraseña para desbloquear la clave privada. No es necesario proporcionar una contraseña si carga la clave en un agente de autenticación SSH o si la clave privada SSH tiene una frase de contraseña vacía. Sin embargo, no recomendamos usar claves privadas SSH con frases de contraseña vacías.
Ansible proporciona muchos métodos para proporcionar una contraseña para la autenticación basada en contraseña o claves SSH protegidas con contraseña. Algunas opciones incluyen el uso de un indicador de playbook, proporcionar opciones de línea de comandos o crear un archivo de datos cifrado en la bóveda que almacene la contraseña de forma segura. Consulte la documentación oficial de Ansible para obtener más información.
Puede especificar parámetros de conexión y autenticación para los juniper.device módulos de las siguientes maneras. Si no define explícitamente los valores, en algunos casos se utilizan valores predeterminados. Los valores predeterminados se describen en Descripción de los valores predeterminados de los módulos de Juniper Networks. Si define el valor de un parámetro en varios lugares, Ansible selecciona el valor en función de la prioridad de la variable, tal y como se describe en Descripción de la prioridad de la variable en los documentos oficiales de Ansible.
-
Variables de Ansible: puede especificar los valores de los parámetros de conexión y autenticación utilizando variables normales de Ansible, por ejemplo, variables definidas en archivos de inventario o almacén, variables de host o grupo, o argumentos de línea de comandos.
-
Archivo de configuración de cliente SSH: para las conexiones SSH, los módulos consultan automáticamente el archivo de configuración SSH predeterminado en ~/.ssh/config, si existe. Puede incluir la
ssh_configopción de especificar un archivo de configuración diferente. Los módulos utilizan cualquier configuración relevante en el archivo de configuración SSH para la conexión dada, a menos que defina explícitamente variables que anulen la configuración. -
Argumentos de módulo: los módulos admiten la especificación de opciones relacionadas con la
juniper.deviceconexión y la autenticación para conexiones locales (connection: local) como argumentos de módulo de nivel superior. -
Sección del libro
vars:de estrategias: los módulos admiten la especificación de opciones relacionadas con lajuniper.deviceconexión y la autenticación para conexiones locales y persistentes en la sección devars:una reproducción, que se describe en Cómo definir parámetros de autenticación en las variables: Sección para conexiones locales y persistentes.
Descripción de los valores predeterminados de los módulos de Juniper Networks
Puede definir explícitamente los parámetros de conexión y autenticación para los módulos que administran dispositivos Junos. Si no define un parámetro, el módulo utiliza un valor predeterminado en algunos casos. En la tabla 1 se describen los valores predeterminados y la precedencia de las variables para los parámetros de conexión comunes para el conjunto de juniper.device módulos. Para obtener información sobre los argumentos aceptados para los módulos individuales, consulte la documentación de referencia de la API para ese módulo.
|
Nombre del parámetro |
alias de parámetros |
Descripción |
Valor predeterminado y prioridad de variable |
|---|---|---|---|
|
|
|
Nombre de host o dirección IP del dispositivo remoto con el que se debe establecer la conexión. |
|
|
|
|
La contraseña del usuario o la frase de contraseña de la clave SSH son necesarias para autenticarse con el dispositivo administrado. |
|
|
|
– |
Ruta a un archivo de configuración de cliente SSH. Si omite este parámetro, los módulos utilizarán el archivo de configuración SSH en la ubicación predeterminada, si existe. |
~/.ssh/config |
|
|
|
Ruta al archivo de clave privada SSH que se usa para autenticarse con el dispositivo remoto. Si no especifica explícitamente la ruta de acceso y no se encuentra ningún valor predeterminado, el módulo utiliza el archivo de clave privada SSH especificado en la configuración SSH del usuario o el valor predeterminado específico del sistema operativo. |
|
|
|
|
Nombre de usuario que se utiliza para autenticarse con el nodo administrado. |
|
Al ejecutar los módulos de Juniper Networks, el host argumento siempre es necesario para una conexión. Sin embargo, no es necesario especificar explícitamente el host porque el valor predeterminado es {{ inventory_hostname }}.
Puede ejecutar los módulos con cualquier cuenta de usuario que tenga acceso al dispositivo Junos administrado. Se aplican los privilegios de acceso a la cuenta de usuario de Junos OS, y la clase configurada para el usuario de Junos OS determina los permisos. Si no especifica un usuario, el usuario se establece de acuerdo con el algoritmo descrito user en la Tabla 1. Consulte la documentación de Ansible para conocer la prioridad utilizada para definir remote_user, que se puede establecer de varias maneras, entre las que se incluyen:
-
-uo la--useropción de línea de comandos -
ANSIBLE_REMOTE_USERvariable de entorno -
remote_useropciones de configuración
Cómo definir los parámetros de autenticación en las variables: Sección para conexiones locales y persistentes
Puede definir parámetros de conexión y autenticación para los juniper.device módulos en la sección de vars: la obra. Esta opción se añade a la definición de los parámetros por otros medios, por ejemplo, en el archivo de configuración SSH, en el archivo de inventario de Ansible, como argumentos de línea de comandos o como argumentos de módulo. La vars: sección le permite definir parámetros de conexión comunes en una sola ubicación que todos los módulos del juego pueden usar para conectarse a un host. Además, algunas conexiones de Ansible requieren el uso de la vars: sección al definir los parámetros dentro de la reproducción, como se describe aquí.
Los juniper.device módulos admiten los siguientes tipos de conexiones de Ansible:
-
Conexiones locales, que se definen mediante el uso de
connection: local -
Conexiones persistentes, que se definen mediante el
connection: juniper.device.pyez
Tanto para las conexiones locales como para las persistentes, Ansible ejecuta los módulos localmente en el nodo de control. Cuando se utiliza connection: local, Ansible establece una conexión independiente con el host para cada tarea del juego que requiera una conexión. Por el contrario, cuando se usa connection: juniper.device.pyez, Ansible establece una conexión única y persistente con un host, que persiste durante la ejecución de todas las tareas de la obra.
Utilice los mismos parámetros de conexión y autenticación para las conexiones persistentes que para las conexiones locales, y los valores predeterminados de los parámetros se aplican a ambos tipos de conexiones. En el caso de las conexiones locales, puede definir los parámetros de conexión y autenticación en la sección o como argumentos de vars: módulo. Si define los parámetros en ambos lugares, los argumentos del módulo tienen prioridad. Sin embargo, cuando defina parámetros dentro de una reproducción para conexiones persistentes, debe definir los parámetros en la vars: sección. Con las conexiones persistentes, solo hay una conexión única para todas las tareas y, por lo tanto, debe definir los parámetros globalmente para que se apliquen a todas las tareas de ese juego.
El siguiente manual ejecuta dos juniper.device módulos en cada host del grupo de inventario. La jugada define la conexión de Ansible como juniper.device.pyez, que establece una conexión con cada host que persiste durante la ejecución de todas las tareas de la jugada. La sección de vars: reproducción define los parámetros de autenticación para la conexión persistente. Las user variables de referencia y passwd valores definidos en el archivo de vault-vars.yaml almacén.
---
- name: Get Device Facts
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars:
user: "{{ vault_admin_username }}"
passwd: "{{ vault_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 }}"
Cómo autenticar al usuario mediante claves SSH
Los juniper.device módulos le permiten utilizar claves SSH para conectarse a un dispositivo Junos o a un servidor de consola que esté conectado al dispositivo. Para autenticar a un usuario mediante claves SSH, primero genere las claves en el nodo de control de Ansible y, luego, configure las claves en el dispositivo al que se conectará el módulo, ya sea el dispositivo Junos administrado o el servidor de consola conectado al dispositivo Junos.
Genere y configure las claves SSH
Para generar claves SSH en el nodo de control de Ansible y configurar la clave pública en el dispositivo remoto:
Uso de claves SSH en manuales de Ansible
Después de generar el par de claves SSH y configurar la clave pública en el dispositivo remoto, puede usar la clave para conectarse al dispositivo. Los módulos de Juniper Networks consultan automáticamente el archivo de configuración de SSH predeterminado en ~/.ssh/config, si existe. También puede definir la ssh_config opción para especificar un archivo de configuración diferente. Los módulos utilizan cualquier configuración relevante en el archivo de configuración SSH para la conexión dada, a menos que defina explícitamente variables que anulen la configuración. Además, los módulos buscan automáticamente claves en la ubicación predeterminada y claves que se cargan activamente en un agente de claves SSH.
Para definir una configuración específica para las claves SSH, puede incluir los argumentos adecuados en el manual de estrategias de Ansible. Defina los argumentos en la ubicación adecuada para el conjunto de módulos y la conexión de Ansible. Por ejemplo, para las obras que usan los juniper.device módulos con una conexión persistente, debe definir la configuración en la vars: sección. Los siguientes factores determinan qué argumentos se incluyen en el manual de estrategias:
-
La ubicación de la llave
-
Si la clave está cargada activamente en un agente de claves SSH
-
Si la clave está protegida por contraseña
-
Si el archivo de configuración SSH del usuario ya define la configuración para ese host
Los siguientes ejemplos describen cómo abordar los diferentes escenarios:
-
Para conectarse a un dispositivo Junos mediante claves SSH cargadas activamente en el agente de claves SSH nativo o que se encuentren en la ubicación predeterminada y no tengan protección con contraseña, no es necesario definir ningún argumento relacionado con la conexión o autenticación, a menos que difieran del valor predeterminado.
juniper.device.facts: savedir: "{{ playbook_dir }}" -
Para conectarse a un dispositivo Junos con claves SSH que no se encuentran en la ubicación predeterminada y no tienen protección con contraseña, establezca el
ssh_private_key_fileargumento en la ruta del archivo de clave privada SSH. Por ejemplo:vars: ssh_private_key_file: "/home/user/.ssh/id_rsa_alternate" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}"Alternativamente, puede especificar la ruta de la clave privada SSH: definiéndola en el archivo de configuración SSH; estableciendo la variable de
ANSIBLE_NET_SSH_KEYFILEentorno; o definiendo la opción de línea de--private-keycomandos o--key-filecuando ejecute el manual. -
Para conectarse a un dispositivo Junos mediante un archivo de clave SSH protegido con contraseña, que es el método recomendado, puede hacer referencia a la frase de contraseña del archivo de clave SSH de varias maneras. Por ejemplo, puede usar el
passwdargumento, definir variables de Ansible o proporcionar opciones de línea de comandos.En el siguiente ejemplo, se ejecuta el manual con la
--ask-passopción de línea de comandos para solicitar al usuario la frase de contraseña: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:
Nota: Es responsabilidad del usuario obtener la frase de contraseña del archivo de clave SSH de una manera segura y adecuada para su entorno. Se recomienda solicitar la frase de contraseña al ejecutar el manual o almacenar la variable mediante un almacén cifrado en lugar de almacenar las credenciales en un formato no cifrado.Para obtener más información sobre el uso de un archivo de solicitud o de bóveda cifrado para la frase de contraseña de clave SSH, consulte Cómo autenticar al usuario mediante un manual de estrategias o una solicitud de contraseña de línea de comandos y Cómo autenticar al usuario mediante un archivo cifrado de Ansible Vault.
Para obtener instrucciones sobre el uso de claves SSH para conectarse a un servidor de consola, consulte Cómo autenticarse a través de un servidor de consola.
Cómo autenticar al usuario mediante un manual de estrategias o un mensaje de contraseña de línea de comandos
Para autenticar a un usuario que ejecuta módulos de Ansible, puede solicitar las credenciales del usuario al ejecutar el manual. Por ejemplo, puede definir un mensaje interactivo en el manual o puede ejecutar el manual con la -k opción de línea de comandos o --ask-pass para solicitar la contraseña. Cuando se utilizan claves SSH, la contraseña proporcionada se utiliza como frase de contraseña de clave SSH privada. Cuando se utiliza la autenticación basada en contraseña, la contraseña proporcionada se utiliza como contraseña del dispositivo.
Para definir un mensaje interactivo en el manual para obtener la contraseña del usuario o la frase de contraseña de la clave SSH:
Como alternativa, puede ejecutar un libro de estrategias con la -k opción de línea de comandos o --ask-pass para solicitar la contraseña o la frase de contraseña. Considere el siguiente manual de estrategias, que utiliza el nombre de usuario predeterminado:
---
- 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
Ejecute el manual e incluya la opción de -k línea de comandos o --ask-pass , la cual solicita la contraseña y no la repite en la línea de comandos.
user@localhost:~$ ansible-playbook playbook.yaml --ask-pass SSH password: PLAY [Get Device Facts] *********************************************** ...
Cómo autenticar al usuario mediante un archivo cifrado de Ansible Vault
Puede utilizar Ansible Vault para almacenar de forma segura contraseñas y otros valores confidenciales de conexión y autenticación en un archivo de datos cifrado en Vault. A continuación, el manual puede hacer referencia a esas variables en la ubicación adecuada para el conjunto de módulos y el tipo de conexión de Ansible, por ejemplo, en la sección de la reproducción o como argumentos de vars: módulo.
En este ejemplo, se utiliza el almacén de Ansible para crear y cifrar un nuevo archivo de almacén. También puede cifrar variables individuales o usar varios archivos cifrados con contraseñas diferentes. Consulte la documentación oficial de Ansible para obtener información detallada sobre el uso del almacén de Ansible para cifrar contenido y archivos.
Para crear y utilizar un archivo de almacén de Ansible que contenga las variables necesarias, incluidas las contraseñas:
Cómo autenticarse a través de un servidor de consola
Los módulos de Ansible de Juniper Networks se pueden conectar a dispositivos Junos a través de un servidor de consola. Para las conexiones SSH a través de un servidor de consola, debe proporcionar las credenciales de autenticación tanto para el servidor de consola como para el dispositivo de Junos. Puede utilizar una contraseña de dispositivo o un archivo de clave SSH protegido con contraseña para la autenticación del servidor de consola.
Para conectarse a un dispositivo Junos a través de un servidor de consola, debe proporcionar los siguientes parámetros en su manual, si no hay un valor predeterminado o si el valor predeterminado no es adecuado:
-
host: nombre de host o dirección IP del servidor de la consola -
userypasswd: credenciales de inicio de sesión de Junos OS -
cs_user—Nombre de usuario del servidor de la consola -
cs_passwd—Se requiere la contraseña del dispositivo o la frase de contraseña del archivo de clave SSH para autenticarse con el servidor de la consola -
port—Puerto, si es diferente del predeterminado
En el ejemplo siguiente, las credenciales para el usuario de Junos OS y el usuario del servidor de consola se definen en un archivo de almacén de Ansible. A continuación, se hace referencia a las variables del almacén en el manual de estrategias. En este caso, el cs_passwd argumento es la frase de contraseña para la clave SSH especificada en el ssh_private_key_file argumento.
---
- name: Get Device Facts
hosts: dc1_con
connection: local
gather_facts: no
vars_files:
- vault-vars.yaml
vars:
host: "{{ inventory_hostname }}"
user: "{{ vault_junos_username }}"
passwd: "{{ vault_junos_password }}"
cs_user: "{{ vault_cs_username }}"
cs_passwd: "{{ vault_cs_key_password }}"
ssh_private_key_file: "/home/user/.ssh/id_rsa_dc"
port: 3007
tasks:
- name: Retrieve facts from Junos devices
juniper.device.facts:
savedir: "{{ playbook_dir }}"