在管理 Junos 设备时,排除 Ansible 连接错误
以下部分概述了使用 Ansible 管理 Junos 设备时可能遇到的连接错误。这些部分还介绍了每个错误的潜在原因和解决方案。
故障排除失败或无效的连接错误
问题
描述
在 Junos 设备上执行 juniper.device
模块期间,Ansible 控制节点会生成有关 SSH 连接失败或命令未知的错误。例如:
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ", "unreachable": true}
或
unknown command: /bin/sh\r\n
原因
当模块未在 Ansible 控制节点上本地运行时,可能会出现这些错误。
通常,Ansible 需要在托管节点上使用 Python,并且 Ansible 控制节点会将模块发送到该节点,在该节点执行,然后将其删除。瞻博网络模块不需要在 Junos 设备上使用 Python,因为它们使用 Junos PyEZ 和基于 NETCONF 的 Junos XML API 与设备连接。因此,要在 Junos 设备上执行操作,必须在安装了 Python 的 Ansible 控制节点上本地运行模块。如果 Ansible 尝试直接在 Junos 设备上执行模块,将生成错误。
溶液
要指示 Ansible 控制节点在本地运行 juniper.device
模块,请 connection: local
包含在 Ansible 操作指南中,或者在执行单个模块时包含 --connection local
命令行参数。例如:
--- - name: Get Device Facts hosts: junos connection: local gather_facts: no
对未知主机错误进行故障排除
问题
描述
在模块执行 juniper.device
期间,Ansible 控制节点会 ConnectUnknownHostError
生成错误。
"msg": "Unable to make a PyEZ connection: ConnectUnknownHostError(dc1a.example.net)"
原因
主机未在 Ansible 清单文件中定义,或者 Ansible 控制节点无法解析主机名。
直接或从操作指南执行 Ansible 模块时,必须在 Ansible 清单文件中定义模块参数或操作指南中引用的任何主机。清单文件的默认位置是 /etc/ansible/hosts。如果清单文件引用了主机名,则 Ansible 控制节点必须能够解析主机名。
溶液
更新 Ansible 清单文件以包含丢失的主机,并确保 DNS 解析正常工作。
有关 Ansible 清单文件的信息,请参阅 在管理 Junos 设备时了解 Ansible 清单文件 ,以及 https://www.ansible.com/ 上的官方 Ansible 文档。
拒绝连接错误疑难解答
问题
描述
在模块执行 juniper.device
期间,Ansible 控制节点会 ConnectRefusedError
生成错误。例如:
"msg": "Unable to make a PyEZ connection: ConnectRefusedError(dc1a.example.net)"
原因
拒绝连接错误的最可能原因是 Junos 设备上未启用 NETCONF over SSH。
要快速测试是否启用了 NETCONF,请验证执行 Ansible 模块的用户帐户是否可以成功启动与设备的 NETCONF 会话。
user@ansible-cn:~$ ssh user@dc1a.example.net -p 830 -s netconf
如果用户能够在默认的 NETCONF 端口 (830) 或设备上专门为 NETCONF 配置的端口上成功与设备建立 NETCONF 会话,则 NETCONF 将启用。否则,您必须在设备上启用 NETCONF over SSH。
溶液
在 Junos 设备上启用 NETCONF-over-SSH 服务。
[edit] user@host# set system services netconf ssh user@host# commit