使用 Ansible 连接到 Junos 设备
总结 瞻博网络 Ansible 模块支持您使用 SSH、telnet 或串行控制台连接连接到 Junos 设备。
瞻博网络提供了可用于管理 Junos 设备的 Ansible 模块。瞻博网络模块通过该系列 juniper.device
进行分发。这些模块可以使用不同的协议和 Ansible 连接连接到 Junos 设备,本文档对此进行了介绍。
连接方法概述
通过 juniper.device
收集模块,可以使用 SSH、telnet 或串行控制台连接连接到 Junos 设备。当您的终端或笔记本电脑物理连接到 Junos 设备上的 CONSOLE 端口时,必须使用串行控制台连接。您可以使用 SSH 或 telnet 连接到设备的管理接口或直接连接到设备 的 CONSOLE 端口的控制台服务器。
具有出厂默认配置的新设备或归零设备需要通过控制台连接进行访问。因此,您可以使用 Ansible 对尚未配置为远程访问的设备进行初始配置,方法是在您直接连接到设备时使用串行控制台连接,或者通过直接连接到设备的控制台服务器使用 telnet 或 SSH。
默认情况下, juniper.device
模块使用 SSH 连接到设备。要使用 telnet 或串行控制台连接,请将 mode
参数设置为适当的值。要 telnet 到设备,请将 mode
参数设置为等于 "telnet"
。要使用串行控制台连接,请将 mode
参数设置为等于 "serial"
。 表 1 汇总了连接模式、某些参数的默认值以及所需的 Junos OS 配置。这些 juniper.device
模块自初始版本起支持所有连接模式。
连接模式 |
参数值 |
默认端口 |
所需的 Junos OS 配置 |
---|---|---|---|
基于 SSH 的 NETCONF(默认) |
– |
830 |
[edit system services] netconf { ssh; } |
串行控制台连接 |
|
/dev/ttyUSB0 |
– |
通过控制台服务器的 SSH |
– |
22 |
– |
Telnet 到 Junos 设备 |
|
23 |
[edit system services] telnet; |
通过控制台服务器的 Telnet |
|
23 |
– |
必须先在 [edit system services]
层次结构级别启用相应的服务,然后才能使用 telnet 或 NETCONF over SSH 访问管理接口。由于 telnet 使用明文密码(因此会产生潜在的安全漏洞),因此我们建议您使用 SSH。
当您执行模块 juniper.device
来管理 Junos 设备时,远程设备必须能够使用适合给定协议的凭据对 Ansible 用户进行身份验证。有关更多信息,请参阅 对在 Junos 设备上执行 Ansible 模块的用户进行身份验证。
juniper.device
这些模块在连接到 Junos 设备时支持不同的 Ansible 连接,包括本地(每任务)连接和永久(每播放)连接。Ansible 连接确定 Ansible 是否为重头戏中的每个任务与主机建立单独的连接,还是与主机建立在重头戏中所有任务上持续存在的单个连接。有关指定 Ansible 连接的信息,请参阅了解本地和持久 Ansible 连接。
了解本地和持久的 Ansible 连接
瞻博网络 Ansible 模块不需要在 Junos 设备上使用 Python,因为它们使用 Junos PyEZ 和通过 NETCONF 的 Junos XML API 与设备连接。因此,要在 Junos 设备上执行操作,必须在安装了 Python 的 Ansible 控制节点上本地运行模块。您可以通过包含在 connection: local
playbook play 中来本地运行模块。使用 connection: local
时,Ansible 会为重头戏中在主机上执行操作的每个任务建立与主机的单独连接。
juniper.device
收集模块还支持connection: juniper.device.pyez
建立与主机的持久连接。使用持久连接时,Ansible 仍会在控制节点上本地执行模块,但它只会与每个主机建立并维护一个连接,该连接会在执行剧中的所有任务时持续存在。与为剧中的每个任务建立与主机的单独连接相比,建立与主机的持久连接对于执行多个任务更有效。
表 2 总结了 Ansible 连接以及支持这些连接的内容集。
Ansible 连接 |
描述 |
内容集支持 |
---|---|---|
|
在 Ansible 控制节点上本地执行模块,但对于在主机上执行操作的重头戏中的每个任务,都要与主机建立单独的连接。 |
|
|
在 Ansible 控制节点上本地执行模块,但与主机建立持久连接,该连接在执行游戏中的所有任务期间都会持续存在。 |
|
使用 connection: local
时,Ansible 会为每个模块建立与主机的单独连接,这意味着您可以在模块的参数列表中定义特定于模块的连接和身份验证参数。相比之下,当您使用 connection: juniper.device.pyez
时,连接会跨剧中的所有任务持续存在,因此您必须全局定义所有模块的连接和身份验证参数。除了通过其他方式(例如在 SSH 配置文件或 Ansible 清单文件中提供参数)之外,您还可以在 vars:
数据部分中定义参数。有关更多详细信息,请参阅 对在 Junos 设备上执行 Ansible 模块的用户进行身份验证。
以下 playbook 将与用于方案中所有任务的每个主机建立持久连接。用户的凭据存储在 Ansible 保管库文件中,在剧本 vars:
部分中定义。
--- - name: Get Device Information hosts: dc1 connection: juniper.device.pyez gather_facts: no vars: host: "{{ inventory_hostname }}" 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 }}"
使用 SSH 连接到设备
瞻博网络 Ansible 模块支持使用 SSH 连接到 Junos 设备。您可以在设备的管理接口上通过 SSH 建立 NETCONF 会话,也可以与直接连接到设备 的 CONSOLE 端口的控制台服务器建立 SSH 连接。SSH 服务器必须能够使用标准 SSH 身份验证机制对用户进行身份验证,如 对在 Junos 设备上执行 Ansible 模块的用户进行身份验证中所述。要通过 SSH 建立 NETCONF 会话,还必须满足 为 Junos OS 托管节点设置 Ansible 中概述的要求。
瞻博网络模块会自动查询位于 ~/.ssh/config 的默认 SSH 配置文件(如果存在)。您还可以包含该 ssh_config
参数以指定其他配置文件。
使用 SSH 连接到 Junos 设备或连接到设备的控制台服务器时,模块会先尝试基于 SSH 公钥的身份验证,然后再尝试基于密码的身份验证。使用基于密码的身份验证时,提供的密码将用作设备密码。使用 SSH 密钥时,提供的密码将用作解锁私钥的密码。如果 SSH 私钥的密码短语为空,则不需要密码。但是,我们不建议使用带有空密码短语的 SSH 私钥。
以下操作指南通过 SSH 与 Junos 设备建立 NETCONF 会话并检索设备事实。操作指南在默认位置使用 SSH 密钥。
--- - name: Get Device Facts hosts: dc1 connection: local gather_facts: no tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print version ansible.builtin.debug: var: junos.version
瞻博网络 Ansible 模块还支持您通过与控制台服务器的 SSH 连接连接到 Junos 设备。在这种情况下,您必须为 Junos 设备和控制台服务器指定登录凭据。使用 user
和 passwd
参数指定 Junos OS 登录凭据, cs_user
并使用和 cs_passwd
参数指定控制台服务器凭据。使用 SSH 密钥时, cs_passwd
是私钥的密码。
以下操作指南将提示您输入控制台服务器和 Junos 设备的用户凭据。该模块先使用控制台服务器进行验证,然后使用 Junos 设备进行验证。如果身份验证成功,操作指南随后将从托管节点检索设备事实并打印 Junos OS 版本。
--- - name: Get Device Facts hosts: dc1_con connection: local gather_facts: no vars_prompt: - name: "CS_USER" prompt: "Console server username" private: no - name: "CS_PASSWORD" prompt: "Console server password" private: yes - name: "JUNOS_USER" prompt: "Junos OS username" private: no - name: "JUNOS_PASSWORD" prompt: "Junos OS password" private: yes vars: cs_user: "{{ CS_USER }}" cs_passwd: "{{ CS_PASSWORD }}" user: "{{ JUNOS_USER }}" passwd: "{{ JUNOS_PASSWORD }}" tasks: - name: "Retrieve facts from Junos devices" juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print version ansible.builtin.debug: var: junos.version
瞻博网络模块会自动查询位于 ~/.ssh/config 的默认 SSH 客户端配置文件(如果存在)。您可以通过包含 ssh_config
参数并指定配置文件的位置来使用其他 SSH 配置文件。例如:
--- - name: Get Device Facts hosts: dc1 connection: local gather_facts: no vars: ssh_config: "/home/admin/.ssh/config_dc" tasks: - name: "Retrieve facts from Junos devices" juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print version ansible.builtin.debug: var: junos.version
使用 Telnet 连接到设备
通过瞻博网络模块,您可以通过 telnet 连接到 Junos 设备,从而对网络设备进行未加密的访问。您可以 telnet 到设备的管理接口或直接连接到设备 的 CONSOLE 端口的控制台服务器。通过控制台服务器访问设备,您可以初始配置尚未配置为远程访问的新设备或归零设备。要 telnet 到管理接口,必须在需要访问接口的所有设备上 [edit system services]
在层次结构级别配置 Telnet 服务。
要 telnet 到远程设备,请将mode
参数"telnet"
设置为,并可选择包含该port
参数以指定端口。如果设置为mode
但"telnet"
省略port
参数,则 的port
值默认为 23。对于持久连接,请在该vars:
部分下定义mode
和port
。对于本地连接,可以在部分下vars:
定义参数,也可以将参数定义为模块参数。
以下操作指南使用端口 7016 telnet 到 Junos 设备,检索设备事实,并将其保存到文件中。playbook 会提示输入用户名和密码。
--- - name: Get Device Facts hosts: dc1 connection: local gather_facts: no vars_prompt: - name: "DEVICE_USERNAME" prompt: "Device username" private: no - name: "DEVICE_PASSWORD" prompt: "Device password" private: yes vars: user: "{{ DEVICE_USERNAME }}" passwd: "{{ DEVICE_PASSWORD }}" mode: "telnet" port: "7016" tasks: - name: Retrieve facts from Junos devices juniper.device.facts: savedir: "{{ playbook_dir }}" - name: Print version ansible.builtin.debug: var: junos.version
使用串行控制台连接连接到设备
借助瞻博网络模块,您可以使用串行控制台连接连接到 Junos 设备,这在您必须在初始配置尚未配置为远程访问的新设备或归零设备时会很有用。要使用此连接方法,您的终端或笔记本电脑必须通过 控制台 端口物理连接到 Junos 设备。有关连接到 Junos 设备上的 CONSOLE 端口的详细说明,请参阅特定设备的硬件文档。
要通过串行控制台连接连接到 Junos 设备,请将模块的mode
参数"serial"
设置为 ,并可选择包含该port
参数以指定端口。如果设置为mode
但"serial"
省略port
参数,则 的port
值默认为 /dev/ttyUSB0
。对于持久连接,请在该vars:
部分下定义mode
和port
。对于本地连接,可以在部分下vars:
定义参数,也可以将参数定义为模块参数。
以下操作指南通过 CONSOLE 端口连接到 Junos 设备,然后加载并提交初始配置。playbook 会提示输入用户名和密码。
--- - name: Load Initial Configuration hosts: dc1 connection: local gather_facts: no vars_prompt: - name: "DEVICE_USERNAME" prompt: "Device username" private: no - name: "DEVICE_PASSWORD" prompt: "Device password" private: yes tasks: - name: Load initial configuration and commit juniper.device.config: user: "{{ DEVICE_USERNAME }}" passwd: "{{ DEVICE_PASSWORD }}" mode: "serial" load: "merge" src: "configs/junos.conf" register: response - name: Print the response ansible.builtin.debug: var: response