在管理 Junos 设备时排除 Ansible 连接错误
以下章节概述了使用 Ansible 管理 Junos 设备时可能遇到的连接错误。这些部分还介绍了每个错误的潜在原因和解决方案。
排除连接失败、未知命令或未找到解释器错误
问题
描述
当您执行 juniper.device 模块或 junipernetworks.junos 集合中的 juniper.device 模块时,Ansible 控制节点会生成有关连接失败、未知命令或无法找到 Python 解释器的错误。例如:
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ", "unreachable": true}
或
unknown command: /bin/sh\r\n
或
[ERROR]: Task failed: Action failed: The module interpreter '/home/user/projects/Ansible/.venv/bin/python' was not found.
原因
当 Ansible 控制节点未在本地运行模块时,可能会出现这些错误。
通常,Ansible 需要在托管节点上使用 Python。Ansible 控制节点将模块发送到节点,在该节点中执行模块,然后将其删除。 juniper.device 这些模块不需要托管设备上的 Python,因为这些模块使用 Junos XML API 和 NETCONF 与设备进行交互。因此,要在 Junos 设备上执行操作,必须在安装 Python 的 Ansible 控制节点上本地运行模块。如果 Ansible 尝试直接在 Junos 设备上执行模块,则会生成错误。
解决方案
要指示 Ansible 控制节点在本地运行模块,您必须为模块集定义适当的连接参数。您可以在不同位置定义参数,例如,在清单文件、主机或组变量文件、操作指南中或作为命令行参数。连接类型因您选择的模块集而异,在某些情况下,还取决于单个模块。有关详细信息,请参阅:
未知主机错误故障排除
问题
描述
执行juniper.device集合中的juniper.device模块或junipernetworks.junos模块时,Ansible 控制节点会生成有关未知主机、主机模式或地址的错误。
"msg": "Unable to make a PyEZ connection: ConnectUnknownHostError(dc1a.example.net)"
或
[WARNING]: Could not match supplied host pattern, ignoring: name
或
"msg": "[Errno -5] No address associated with hostname"
原因
当 Ansible 清单文件未定义主机或 Ansible 控制节点无法解析主机名时,将发生这些错误。
当您直接或从操作指南执行 Ansible 模块时,必须在 Ansible 清单文件中定义模块参数或操作指南中引用的任何主机。清单文件的默认位置为 /etc/ansible/hosts。Ansible 控制节点必须能够解析您在清单文件中定义的任何主机的主机名。
解决方案
更新 Ansible 清单文件,以包含丢失的主机,并确保 DNS 解析工作正常。
有关 Ansible 清单文件的信息,请参阅 在管理 Junos 设备时了解 Ansible 清单文件 以及 https://www.ansible.com/ 上的 Ansible 官方文档。
排除拒绝连接错误和套接字错误
问题
描述
当您执行juniper.device集合中的juniper.device模块或模块junipernetworks.junos时,Ansible 控制节点会生成ConnectRefusedError错误或套接字错误。例如:
"msg": "Unable to make a PyEZ connection: ConnectRefusedError(dc1a.example.net)"
或
"msg": "Could not open socket to 198.51.100.101:830"
原因
导致这些错误的最可能原因是 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
主机网络操作系统错误排解
问题
描述
当您执行junipernetworks.junos集合(模块)juniper.device.junos_*中的juniper.device模块时,Ansible 控制节点会生成host network os错误。例如:
[ERROR]: Task failed: Unable to automatically determine host network os. Please manually configure ansible_network_os value for this host
原因
这些 juniper.device.junos_* 模块要求您为运行 Junos OS 的目标主机或运行 Junos OS Evolved 的目标主机指定 Ansible 网络操作系统 juniper.device.junos 。
解决方案
在适合您的环境的位置和文件格式所需的语法中定义 ansible_network_os 变量。例如,您可以在清单文件或主机或组变量文件中定义变量。
以下 INI 格式的清单文件示例定义了清单组中的junos主机的 Ansible 网络操作系统juniper.device.junos:
[junos] router1.example.com router2.example.com router3.example.com [junos:vars] ansible_network_os=juniper.device.junos ansible_connection=ansible.netcommon.netconf