Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

对在 Junos 设备上执行 Ansible 模块的用户进行身份验证

身份验证概述

瞻博网络提供了可用于管理 Junos 设备的 Ansible 模块。瞻博网络模块通过 juniper.device 托管在 Ansible Galaxy 上的集合进行分布。

通过瞻博网络模块,您可以通过 SSH、telnet 或串行控制台连接直接连接到 Junos 设备并对其进行管理。这些模块还支持通过 SSH 或 telnet 连接连接到连接到设备 CONSOLE 端口的控制台服务器。远程设备必须能够使用密码或其他标准 SSH 身份验证机制对用户进行身份验证,具体取决于连接协议。

使用 Ansible 管理 Junos 设备时,访问设备最便捷的方式是配置 SSH 密钥。SSH 密钥使远程设备能够识别受信任的用户。或者,您可以在执行模块和 playbook 时提供用户名和密码。

对于 SSH 连接,瞻博网络模块会先尝试基于 SSH 公钥的身份验证,然后再尝试基于密码的身份验证。使用 SSH 密钥时,提供的密码将用作解锁私有 SSH 密钥的密码短语。使用基于密码的身份验证时,提供的密码将用作设备密码。如果正在使用基于 SSH 公钥的身份验证,并且 SSH 私钥的密码短语为空,则不需要密码。但是,我们不建议使用带有空密码短语的 SSH 私钥。若要检索基于密码的身份验证或受密码保护的 SSH 密钥的密码,可以从操作指南或命令行提示输入密码,也可以创建安全存储密码的保管库加密数据文件。

您可以通过以下方式为瞻博网络模块指定连接和身份验证参数。如果未显式定义这些值,则在某些情况下会使用默认值,如了解 瞻博网络模块的默认值中所述。如果您在多个位置定义参数的值,Ansible 会根据变量优先级选择值,如 Ansible 官方文档中的 了解变量优先级 中所述。

  • Ansible 变量 - 您可以使用常规 Ansible 变量(例如,在清单或保管库文件中定义的变量、主机或组变量)或者使用命令行选项来指定连接和身份验证参数值。

  • SSH 客户端配置文件 — 对于 SSH 连接,瞻博网络模块会自动查询位于 ~/.ssh/config 的默认 SSH 配置文件(如果存在)。您还可以使用选项来 ssh_config 指定其他配置文件。这些模块对给定连接使用 SSH 配置文件中的任何相关设置,除非您显式定义覆盖该设置的变量。

  • 模块参数 - 模块 juniper.device 支持将本地连接 (connection: local) 的连接和身份验证相关选项指定为顶级模块参数。

  • vars: 部分 - 模块 juniper.device 支持在剧本 vars: 部分中为本地和持久连接指定与连接和身份验证相关的选项, 如何在 vars: 本地和持久连接部分中定义身份验证参数中对此进行了介绍。

本文档讨论使用瞻博网络模块管理 Junos 设备时身份验证的不同方面。

了解瞻博网络模块的默认值

您可以显式定义管理 Junos 设备的模块的连接和身份验证参数。如果未定义参数,则模块在某些情况下会使用默认值。 表 1 概述了集合中 juniper.device 模块的通用连接参数的默认值和变量优先级。有关各个模块接受的参数的信息,请参阅该模块的 API 参考文档。

表 1:连接参数的默认值和变量优先级

参数名称

参数别名

描述

默认值和变量优先级

host

hostname

ip

应与之建立连接的远程设备的主机名或 IP 地址。

{{ inventory_hostname }}

passwd

password

用于向受管设备进行身份验证的用户密码或 SSH 密钥密码短语。

  1. ANSIBLE_NET_PASSWORD 环境变量

  2. 指定的 -k 值或 --ask-pass 命令行选项

ssh_config

SSH 客户端配置文件的路径。

如果省略此参数,则模块将使用默认位置的 SSH 配置文件(如果存在)。

~/.ssh/config

ssh_private_key_file

ssh_keyfile

用于向远程设备进行身份验证的 SSH 私钥文件的路径。

如果未显式指定路径且未找到默认值,则模块将使用用户的 SSH 配置中指定的 SSH 私钥文件或特定于操作系统的默认值。

  1. ANSIBLE_NET_SSH_KEYFILE 环境变量

  2. 指定的 --private-key 值或 --key-file 命令行选项

  3. 没有

user

username

用于向受管节点进行身份验证的用户名。

  1. ANSIBLE_NET_USERNAME 环境变量

  2. remote_user 由 Ansible 定义

  3. USER 环境变量

执行瞻博网络模块时,连接始终需要参数 host 。但是,您不必显式指定主机,因为它默认为 {{ inventory_hostname }}

您可以使用有权访问托管 Junos 设备的任何用户帐户来执行瞻博网络模块。执行模块时,将强制实施 Junos OS 用户帐户访问权限,并且为 Junos OS 用户帐户配置的类将确定权限。如果未指定用户,则根据表 1 中描述的user算法设置用户。请参阅 Ansible 文档,了解用于定义 remote_user的优先级,可以通过多种方式定义,包括:

  • -u--user 命令行选项

  • ANSIBLE_REMOTE_USER 环境变量

  • remote_user 配置设置

如何在 vars 中定义身份验证参数:本地和持久连接部分

您可以在剧vars:中为模块定义连接和身份验证参数juniper.device。此外,您还可以像往常一样通过其他变量(例如,在 SSH 配置文件、Ansible 清单文件中、命令行参数或模块参数)来定义它们。通过该vars:部分,您可以在单个位置定义通用连接参数,重中的所有模块都可以使用该参数连接到主机。此外,在 play 中定义参数时,某些 Ansible 连接需要使用该vars:部分,如此处所述。

这些 juniper.device 模块支持以下 Ansible 连接类型:

  • 本地连接,这些连接通过使用 connection: local

  • 持久连接,定义方式为 connection: juniper.device.pyez

对于本地和永久连接,Ansible 都会在控制节点上本地执行模块。使用 connection: local时,Ansible 会为剧中需要连接的每个任务建立与主机的单独连接。相比之下,当您使用 connection: juniper.device.pyez时,Ansible 会与主机建立单个持久连接,该连接会在执行剧中的所有任务时持续存在。

对持久连接使用的连接和身份验证参数与对本地连接使用的参数相同,了解 瞻博网络模块的默认值 中讨论的默认参数值适用于这两种类型的连接。对于本地连接,可以在本节中 vars: 定义连接和身份验证参数,也可以将其定义为模块参数。如果在两个位置定义参数,则模块参数优先。但是,在持久连接的播放中定义参数时,必须在部分 vars: 中定义参数。对于持久连接,所有任务只有一个连接,因此您必须全局定义参数,以便它们应用于该方案中的所有任务。

以下操作指南在清单组中的每个主机上执行两个 juniper.device 模块。该剧将 Ansible 连接定义为 ,该连接 juniper.device.pyez会与每个主机建立连接,该连接会在执行剧中的所有任务期间持续存在。持久连接的身份验证参数在播放部分 vars: 中定义。 user passwd 和 值引用 Vault 文件中定义的 vault-vars.yaml 变量。

如何使用 SSH 密钥对用户进行身份验证

通过瞻博网络 juniper.device 模块,您可以使用 SSH 密钥连接到 Junos 设备或连接到该设备的控制台服务器。要使用 SSH 密钥对用户进行身份验证,请先在 Ansible 控制节点上生成密钥,然后在模块将连接的设备(受管 Junos 设备或连接到 Junos 设备的控制台服务器)上配置密钥。

生成和配置 SSH 密钥

要在 Ansible 控制节点上生成 SSH 密钥并在远程设备上配置公钥:

  1. 在 Ansible 控制节点上,为所需用户生成公钥和私钥 SSH 密钥对,并提供所需的选项,例如:
  2. (可选)将密钥加载到本机 SSH 密钥代理中。例如:
  3. 在模块将连接到的每台设备上配置公钥,其中可能包括 Junos 设备或连接到 Junos 设备的控制台服务器。

    在 Junos 设备上配置公钥的最简单方法是在相应的用户帐户下加载包含公钥的文件。

  4. 使用密钥登录设备,验证密钥是否正常工作。

在 Ansible 操作指南中使用 SSH 密钥

生成 SSH 密钥对并在远程设备上配置公钥后,即可使用密钥连接到设备。瞻博网络模块会自动查询位于 ~/.ssh/config 的默认 SSH 配置文件(如果存在)。您还可以定义 ssh_config 选项以指定其他配置文件。这些模块对给定连接使用 SSH 配置文件中的任何相关设置,除非您显式定义覆盖该设置的变量。此外,这些模块会自动查找默认位置中的密钥,以及在 SSH 密钥代理中主动加载的密钥。

要定义 SSH 密钥的特定设置,您可以在 Ansible 操作指南中包含相应的参数。在适合您的模块集和 Ansible 连接的位置定义参数,例如,在使用具有持久连接的juniper.device模块的播放部分中vars:定义参数。要包含的参数取决于密钥的位置、密钥是否主动加载到 SSH 密钥代理中、密钥是否受密码保护,以及用户的 SSH 配置文件是否已定义该主机的设置。

  • 要使用主动加载到本机 SSH 密钥代理中的 SSH 密钥或位于默认位置且没有密码保护的 SSH 密钥连接到 Junos 设备,无需定义任何连接或与身份验证相关的参数,除非它们与默认参数不同。

  • 要使用不在默认位置且没有密码保护的 SSH 密钥连接到 Junos 设备,请将 ssh_private_key_file 参数设置为 SSH 私钥文件的路径。例如:

    或者,您可以通过在 SSH 配置文件中定义 SSH 私钥来指定 SSH 私钥的路径;通过设置 ANSIBLE_NET_SSH_KEYFILE 环境变量;或者在执行 playbook 时定义 --private-key--key-file 命令行选项。

  • 要使用受密码保护的 SSH 密钥文件(推荐方法)连接到 Junos 设备,您可以在参数中 passwd 引用 SSH 密钥文件密码,或者使用普通的 Ansible 变量或命令行选项提供密码。

    用户有责任以适合其环境的安全方式获取 SSH 密钥文件密码。最佳做法是在每次调用操作指南期间提示它,或者使用加密的保管库存储变量,而不是以未加密的格式存储凭据。例如,您可以使用命令行选项执行 playbook --ask-pass ,并在出现提示时提供 SSH 密钥文件密码,如下所示:

    有关对 SSH 密钥密码短语使用提示或加密保管库文件的更多信息,请参阅 如何使用操作指南或命令行密码提示符对用户进行身份验证如何使用 Ansible 保管库加密文件对用户进行身份验证

有关使用 SSH 密钥连接到控制台服务器的说明,请参阅 如何通过控制台服务器进行身份验证

如何使用操作指南或命令行密码提示符对用户进行身份验证

要对执行 Ansible 模块的用户进行身份验证,您可以在执行操作指南时提示输入用户的凭据。例如,您可以在 playbook 中定义交互式提示,也可以使用 -k--ask-pass 命令行选项执行 playbook 以提示输入密码。使用 SSH 密钥时,提供的密码将用作解锁私有 SSH 密钥的密码短语。使用基于密码的身份验证时,提供的密码将用作设备密码。

要在 playbook 中定义交互式提示以获取用户的密码或 SSH 密钥密码短语:

  1. 在该代码下vars_prompt:包含代码,提示输入用户的密码或 SSH 密钥密码短语(以及可选的用户名),并将值存储在变量中。
  2. 设置和passwd参数,user使每个参数都引用其各自的变量。
  3. 包括要执行的任务。
  4. 执行 playbook,这将提示输入用户名和密码,并且不会在命令行上回应密码,因为变量设置为 private: yes

或者,您可以使用或 --ask-pass 命令行选项执行操作指南-k,以提示输入密码或密码短语。请考虑以下使用默认用户名的操作指南:

执行 playbook,并包括 -k or --ask-pass 命令行选项,该选项会提示输入密码,并且不会回应命令行上的密码。

如何使用 Ansible 保管库加密文件对用户进行身份验证

您可以创建一个 Ansible 保管库,以便将保存的密码和其他敏感连接和身份验证值安全地存储在保管库加密的数据文件中。然后,您的剧本可以在适合您的模块集和 Ansible 连接类型的位置引用这些变量,例如,在剧本 vars: 部分或作为模块参数。

要创建和使用包含所需变量(包括密码)的 Ansible 保管库文件:

  1. 创建保管库加密的数据文件,并指定加密、解密、编辑和使用数据文件所需的密码。
  2. 在文件中定义所需的变量并保存它。
  3. 验证文件是否已加密。
  4. 在操作指南中,包括保管库加密的变量文件,并在适合您的模块和 Ansible 连接类型的位置引用所需的变量。
    注意:

    如果您改为在 Vault 中定义实际 user 变量和 passwd 变量,则模块会自动获取它们,并且您无需在操作指南中显式定义它们。

  5. 使用--ask-vault-pass选项执行操作指南,该选项会提示输入保管库密码。

如何通过控制台服务器进行身份验证

瞻博网络 Ansible 模块可以通过控制台服务器连接到 Junos 设备。对于通过控制台服务器的 SSH 连接,您需要为控制台服务器和 Junos 设备提供身份验证凭据。您可以使用设备密码或受密码保护的 SSH 密钥文件进行控制台服务器身份验证。

要通过控制台服务器连接到 Junos 设备,如果没有默认值或默认值不合适,则必须在操作指南中提供以下参数:

  • host- 控制台服务器主机名或 IP 地址

  • userpasswd—Junos OS 登录凭据

  • cs_user- 控制台服务器用户名

  • cs_passwd- 向控制台服务器进行身份验证所需的设备密码或 SSH 密钥文件密码

在以下示例中,Junos OS 用户和控制台服务器用户的凭据在 Ansible 保管库文件中定义。然后,在 playbook 中引用 vault 变量。在这种情况下, cs_passwd 参数是参数中 ssh_private_key_file 指定的 SSH 密钥的密码短语。