在此页面上
在管理 Junos 设备时排除 Ansible 连接错误
以下部分概述了在使用 Ansible 管理 Junos 设备时可能遇到的连接错误。这些部分还介绍了每个错误的潜在原因和解决方案。
排查失败或无效的连接错误
问题
描述
在 Junos 设备上执行 juniper.device
or Juniper.junos
模块期间,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 操作手册中,或Juniper.junos
包含--connection local
命令行参数。例如:
--- - name: Get Device Facts hosts: junos connection: local gather_facts: no
排查未知主机错误
问题
描述
在执行 juniper.device
或 Juniper.junos
模块期间,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
或 Juniper.junos
模块期间,Ansible 控制节点会生成 ConnectRefusedError
错误。例如:
"msg": "Unable to make a PyEZ connection: ConnectRefusedError(dc1a.example.net)"
原因
导致连接被拒绝错误的最可能原因是 Junos 设备上未启用基于 SSH 的 NETCONF。
要快速测试是否启用了 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