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 分发,这些集合和 Juniper.junos 角色托管在 Ansible Galaxy 上。

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

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

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

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

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

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

  • 模块参数 - juniper.deviceJuniper.junos 模块支持将本地连接 (connection: local) 的连接和身份验证相关选项指定为顶级模块参数。此外, Juniper.junos 模块支持在模块参数中使用提供程序字典,如 如何在 Juniper.junos 模块中定义提供程序参数中所述。

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

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

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

您可以为管理 Junos 设备的模块显式定义连接和身份验证参数。如果未定义参数,模块在某些情况下会使用默认值。表 1 概述了集合和Juniper.junos角色中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 中定义身份验证参数:本地和持久连接部分

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

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

  • 本地连接,由 connection: local

  • 持久连接,由 connection: juniper.device.pyez

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

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

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

如何在 Juniper.junos 模块中定义提供程序参数

从版本 2.0.0 开始 Juniper.junos ,除了 Juniper.junos 支持每个连接和身份验证相关参数的单个顶级模块参数外,这些模块还支持该 provider 参数。该 provider 参数使您能够在一个位置为多个模块定义连接和身份验证参数,并轻松地将这些值传递给使用这些值的模块。此外,如果以后需要更新参数,则只需在单个位置进行更新。

注意:

juniper.device集合模块不支持使用该provider参数。

provider 参数接受一个字典,其中包含连接到设备并对其进行身份验证所需的连接详细信息。 host 参数对于连接始终是必需的,但如果模块使用 的 host默认值,则不必显式指定值。字典可以选择定义连接所需的其他参数,包括 userpasswdssh_private_key_file等。有关各个模块接受的参数的信息,请参阅该模块的 API 参考文档。

在以下示例中, credentials 变量是定义 hostuserpasswd 参数的字典:

以下示例 playbook 使用单个 provider 参数将连接详细信息传递给模块, juniper_junos_facts 而不是定义单个模块参数。添加使用这些 Juniper.junos 模块的其他任务时,可以为每个模块引用相同的字典。

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

瞻博网络 juniper.deviceJuniper.junos 模块使您能够使用 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 连接的位置定义参数,例如,在 vars: 将模块与持久连接一起使用 juniper.device 的重头戏部分中。要包含的参数取决于密钥的位置、密钥是否主动加载到 SSH 密钥代理中、密钥是否受密码保护以及用户的 SSH 配置文件是否已定义该主机的设置。

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

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

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

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

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

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

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

如何使用剧本或命令行密码提示符对用户进行身份验证

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

要在剧本中定义交互式提示以获取用户的密码或 SSH 密钥密码,请执行以下操作:

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

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

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

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

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

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

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

    如果改为在保管库中定义实际变量 userpasswd 变量,则模块会自动拾取它们,您无需在剧本中显式定义它们。

  5. 使用提示输入保管库密码的选项执行--ask-vault-pass剧本。

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

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

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

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

  • userpasswd—Junos OS 登录凭据

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

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

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