使用 Ansible 连接到 Junos 设备
了解如何在使用 Ansible 集合中的juniper.device模块集时juniper.device连接到 Junos 设备。
瞻博网络提供 Ansible 模块,可用来管理运行 Junos OS 的设备和运行 Junos OS 演化版的设备。瞻博网络模块通过该系列进行 juniper.device 分发。该 juniper.device 集合包括两组模块:
-
juniper.device模块 (command, ,config,factspmtudrpcfile_copysrx_clusterjsnapytablepingsoftwaresystem) -
junipernetworks.junos模块 (juniper.device.junos_*)
本文档讨论如何使用模块集仅用于 juniper.device 连接到使用不同协议和 Ansible 连接的 Junos 设备。有关使用模块连接到 junipernetworks.junos Junos设备的信息,请参阅 使用 juniper.device.junos_* Ansible 模块管理Junos设备。
连接方法概述
通过这些 juniper.device 模块 ,您可以使用 SSH、telnet 或串行控制台连接连接到 Junos 设备。当您的终端或笔记本电脑物理连接到 Junos 设备上的 控制台 端口时,您必须使用串行控制台连接。您可以使用 SSH 或 telnet 连接到设备的管理接口或直接连接到设备 控制台端口的 控制台服务器。
具有出厂默认配置的新设备或已归零的设备需要通过控制台连接进行访问。因此,您可以使用 Ansible 初始配置尚未配置为远程访问的设备。直接连接到设备时,可以使用串行控制台连接,也可以通过直接连接到设备的控制台服务器使用 telnet 或 SSH。
默认情况下,模块juniper.device使用 SSH 连接到设备。要使用 telnet 或串行控制台连接,请将参数设置为mode适当的值。要以 telnet 连接到设备,请将参数telnet设置为 mode 。要使用串行控制台连接,请将参数serial设置为 mode 。表 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 是为 Play 中的每个任务建立与主机的单独连接,还是与主机建立单个连接,该连接在 Play 中的所有任务中都持续存在。有关指定 Ansible 连接的信息,请参阅了解本地和持久 Ansible 连接。
了解本地和持久 Ansible 连接
这些 juniper.device 模块 不需要 Junos 设备上的 Python,因为这些模块使用 Junos PyEZ 和通过 NETCONF 的 Junos XML API 与设备进行接口。因此,要在 Junos 设备上执行操作,您必须在安装了 Python 的 Ansible 控制节点上本地运行模块。可以通过包含在 connection: local playbook 中来在本地运行模块。当您使用 connection: local时,Ansible 会为剧中在主机上执行操作的每个任务建立与主机的单独连接。
这些 juniper.device 模块还支持 connection: juniper.device.pyez 建立与主机的持久连接。当您使用持久连接时,Ansible 仍会在控制节点上本地执行模块。但是,持久连接建立并维护与每个主机的单个连接,该连接在执行过程中的所有任务期间持续存在。持久连接对于执行多个任务可能比对剧中的每个任务使用单独的主机连接更有效。
表 2 总结了模块集中模块的 juniper.device Ansible 连接。
|
Ansible 连接 |
描述 |
|---|---|
|
|
在 Ansible 控制节点上本地执行模块,但要为剧中在主机上执行操作的每个任务建立与主机的单独连接。 |
|
|
在 Ansible 控制节点上本地执行模块,但与主机建立持久连接,该连接在执行所有任务期间持续存在。 |
您可以在 playbook 中为本地和持久连接定义连接和身份验证参数。本地连接为每个任务建立与主机的单独连接。因此,您可以在 play 部分 vars: 和模块的参数列表中定义本地连接的连接和身份验证参数。模块参数优先。相比之下,持久连接对剧中的所有任务都有一个连接。因此,您必须在剧情 vars: 部分中为全局持久连接定义连接和身份验证参数。
以下操作指南将与用于剧中所有任务的每个主机建立持久连接。用户的凭据存储在 Ansible 保管库文件中,在剧 vars: 情部分中全局定义。
---
- name: Get Device Information
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars:
host: "{{ inventory_hostname }}"
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 }}"
使用 SSH 连接到设备
这些 juniper.device 模块 支持使用 SSH 连接到 Junos 设备。您可以在设备的管理接口上通过 SSH 建立 NETCONF 会话。您还可以与直接连接到设备 CONSOLE 端口的控制台服务器建立 SSH 连接。SSH 服务器必须能够使用标准 SSH 身份验证机制对用户进行身份验证,如在 Junos 设备上执行 Ansible 模块的用户进行身份验证中所述。要通过 SSH 建立 NETCONF 会话,还必须满足为 Junos OS 托管节点设置 Ansible 中所述的要求。
这些模块会自动查询位于 ~/.ssh/config 的默认 SSH 配置文件(如果存在)。您还可以包含该 ssh_config 参数以指定不同的配置文件。
对于与 Junos 设备或连接到设备的控制台服务器的 SSH 连接,模块首先尝试基于 SSH 公钥的身份验证,然后尝试基于密码的身份验证。使用基于密码的身份验证时,提供的密码将用作设备密码。使用 SSH 密钥时,提供的密码是用于解锁私有密钥的密码。如果将密钥加载到 SSH 密钥代理中,或者 SSH 私有密钥的密码为空,则无需提供密码。但是,我们不建议使用带有空密码的 SSH 私钥。
以下操作指南通过 SSH 与 Junos 设备建立 NETCONF 会话,并检索设备事实。该操作指南使用加载在 SSH 密钥代理中的 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
这些模块还允许您通过与控制台服务器的 SSH 连接连接到 Junos 设备。在这种情况下,您必须为 Junos 设备和控制台服务器指定登录凭据。使用 和 passwd 参数user指定 Junos OS 登录凭据。使用 和 cs_passwd 参数cs_user指定控制台服务器凭据。当 SSH 密钥正在使用时,cs_passwd是私钥的密码。此外,如果适用,将参数设置为port映射到 TTY 设备的 TCP 端口。
以下操作指南会提示用户输入控制台服务器和 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 }}"
port: 3007
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 连接到设备
借助这些 juniper.device 模块 ,您可以使用 telnet 连接到 Junos 设备,从而提供对网络设备的未加密访问。您可以通过 telnet 连接到设备的管理接口或直接连接到设备 CONSOLE 端口的控制台服务器。通过控制台服务器访问设备,您初始配置尚未配置为远程访问的新设备或已归零的设备。要以 telnet 连接到管理接口,您必须在需要访问该接口的所有设备上的层次结构级别配置 [edit system services] Telnet 服务。
要以 telnet 连接到远程设备,请将参数telnet设置为mode,并选择性地包含用于port指定端口的参数。当您设置为modetelnet但省略该port参数时,默认port值为 23。对于持久连接,请在部分vars:下定义mode和port。对于本地连接,您可以在部分下vars:定义参数或作为模块参数。
以下操作指南使用端口 7016 telnet 到 Junos 设备,检索设备事实,并将其保存到文件中。操作指南会提示您输入用户名和密码。
---
- 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
使用串行控制台连接连接到设备
通过这些 juniper.device 模块 ,您可以使用串行控制台连接连接到 Junos 设备。这在您必须初始配置尚未配置为远程访问的新设备时非常有用。要使用此连接方法,您的终端或笔记本电脑必须通过 CONSOLE 端口物理连接到 Junos 设备。有关连接到 Junos 设备上的 CONSOLE 端口的详细说明,请参阅特定设备的硬件文档。
要通过串行控制台连接连接到 Junos 设备,请将模块的mode参数serial设置为 ,并可选择包含该port参数以指定端口。当您设置为modeserial但省略该port参数时,默认port值为 /dev/ttyUSB0。对于持久连接,请在部分vars:下定义mode和port。对于本地连接,您可以在部分下vars:定义参数或作为模块参数。
以下操作指南通过 CONSOLE 端口连接到 Junos 设备,然后加载并提交初始配置。操作指南会提示您输入用户名和密码。
---
- 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