Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

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

了解如何在使用 Ansible 集合中的juniper.device模块集时juniper.device对用户进行身份验证。

瞻博网络提供 Ansible 模块,可用来管理运行 Junos OS 的设备和运行 Junos OS 演化版的设备。瞻博网络模块通过该系列进行 juniper.device 分发。该 juniper.device 集合包括两组模块:

本主题讨论如何在仅使用 juniper.device 模块集时对用户进行身份验证。有关使用模块 junipernetworks.junos 连接到Junos设备并与之进行身份验证的信息,请参阅 使用 juniper.device.junos_* Ansible 模块管理Junos设备

身份验证概述

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

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

对于 SSH 连接,模块首先 juniper.device 尝试基于 SSH 公钥的身份验证,然后尝试基于密码的身份验证。使用基于密码的身份验证时,提供的密码将用作设备密码。使用 SSH 密钥时,提供的密码是用于解锁私有密钥的密码。如果将密钥加载到 SSH 身份验证代理中,或者 SSH 私钥的密码为空,则无需提供密码。但是,我们不建议使用带有空密码的 SSH 私钥。

Ansible 提供了许多方法来为基于密码的身份验证或受密码保护的 SSH 密钥提供密码。一些选项包括使用操作指南提示符、提供命令行选项或创建安全存储密码的保管库加密数据文件。有关更多信息,请参阅 Ansible 官方文档。

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

  • Ansible 变量 - 您可以使用普通的 Ansible 变量(例如,清单或 Vault 文件中定义的变量、主机或组变量或命令行参数)指定连接和身份验证参数值。

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

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

  • 剧本 vars: 部分 — 模块 juniper.device 支持在 Play 部分 vars: 中为本地和持久连接指定与连接和身份验证相关的选项,详见 如何在 变量中定义身份验证参数: 本地和持久连接部分

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

您可以为管理 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 命令行选项

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:部分为模块定义连接和身份验证参数juniper.device。除了通过其他方式(例如,在 SSH 配置文件中、在 Ansible 清单文件中、作为命令行参数或作为模块参数)定义参数外,还可以使用此选项来定义参数。该vars:部分允许您在单个位置定义通用连接参数,该位置中的所有模块都可以用于连接到主机。此外,某些 Ansible 连接需要在 play 中定义参数时使用该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,它建立与每个主机的连接,该连接在剧中执行所有任务期间持续存在。play的vars:部分定义了持久连接的身份验证参数。和 passwd 值引用 user 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 密钥连接到 Junos 设备,无需定义任何与连接或身份验证相关的参数,除非它们与默认参数不同。

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

    或者,您可以通过以下方式指定 SSH 私钥的路径: 在 SSH 配置文件中定义它;设置 ANSIBLE_NET_SSH_KEYFILE 环境变量;或者在执行操作指南时定义 --private-key OR --key-file 命令行选项。

  • 要使用受密码保护的 SSH 密钥文件连接到 Junos 设备(推荐的方法),您可以通过多种方式引用 SSH 密钥文件密码短语。例如,您可以使用 passwd 参数、定义 Ansible 变量或提供命令行选项。

    以下示例使用命令行选项执行 --ask-pass 操作指南,以提示用户输入密码:

    注意:用户有责任以适合其环境的安全方式获取 SSH 密钥文件密码短语。最佳做法是在执行操作指南时提示输入密码,或者使用加密的保管库存储变量,而不是以未加密的格式存储凭据。

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

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

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

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

要在操作指南中定义用于获取用户密码或 SSH 密钥密码的交互式提示:

  1. 该代码下方vars_prompt:包括代码,提示输入用户的密码或 SSH 密钥密码短语(以及可选的用户名),并将该值存储在变量中。
  2. 设置 user and passwd 参数,以便每个参数引用其各自的变量。
  3. 包括要执行的任务。
  4. 执行操作指南,提示您输入用户名和密码。当您输入密码时,终端不会回应密码,因为变量设置为 private: yes

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

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

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

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

此示例使用 Ansible 保管库创建并加密新的保管库文件。您还可以加密单个变量或使用多个具有不同密码的加密文件。有关使用 Ansible 保管库加密内容和文件的详细信息,请参阅 Ansible 官方文档。

要创建和使用包含必需变量(包括密码)的 Ansible 保管库文件,请执行以下操作:

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

    如果改为在保管库中定义实际 user 变量和 passwd 变量,则模块会自动选取它们,而无需在 playbook 中显式定义它们。

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

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

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

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

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

  • user 以及 passwd—Junos OS 登录凭据

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

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

  • port- 端口,如果与默认端口不同

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