在管理 Junos 设备时排除 Ansible 身份验证错误
以下部分概述了使用 Ansible 管理运行 Junos OS 的设备和运行 Junos OS Evolved 的设备时可能遇到的身份验证错误。这些部分还介绍了每个错误的潜在原因和解决方案。
身份验证错误故障排除
问题
描述
在执行juniper.device集合中的juniper.device模块或junipernetworks.junos模块期间,Ansible 控制节点会生成ConnectAuthError错误或AuthenticationException身份验证失败的错误。例如:
"msg": "Unable to make a PyEZ connection: ConnectAuthError(dc1a.example.net)"
或
"msg": "AuthenticationException('Authentication failed.')"
原因
Junos 设备可能无法对用户进行身份验证,原因如下:
-
用户在 Junos 设备上没有帐户。
-
用户的帐户在 Junos 设备上配置了基于文本的密码,但在执行模块时密码错误或未为用户提供密码。
-
用户在 Junos 设备上有一个配置了 SSH 密钥的帐户,但无法在设备或控制节点上访问 SSH 密钥。
解决方案
确保执行模块的用户在所有目标 Junos 设备上都有 Junos OS 登录帐户。帐户必须配置 SSH 公钥/私钥对或基于文本的密码。如果帐户使用 SSH 密钥,请验证用户是否可以访问密钥。
排除属性conn_type错误
问题
描述
在执行 juniper.device 模块期间,Ansible 控制节点会生成以下错误:
AttributeError: 'JuniperJunosModule' object has no attribute 'conn_type'
原因
较旧的已弃用 Juniper.junos 模块支持使用 provider 字典来定义连接和身份验证参数,但模块 juniper.device 不支持使用 provider 字典。如果您引用 provider 字典,模块将生成上述错误。
解决方案
对于 juniper.device 模块(不包括 juniper.device.junos_* 模块),如果您在剧本中提供连接和身份验证参数,则必须在适合 Ansible 连接的位置定义参数。
-
对于持久连接 (),
connection: juniper.device.pyez请在部分vars:下定义参数。 -
对于本地连接 (),
connection: local请在部分下vars:定义参数或作为顶级模块参数。
以下 playbook 使用持久连接,并在 playbook 的 vars 部分中定义了身份验证参数。
---
- name: Get device facts
hosts: dc1
connection: juniper.device.pyez
gather_facts: no
vars_prompt:
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
vars:
passwd: "{{ DEVICE_PASSWORD }}"
tasks:
- name: Get device facts
juniper.device.facts:
savedir: "{{ playbook_dir }}"
以下操作指南使用本地连接,并将身份验证参数定义为模块参数。
---
- name: Get device facts
hosts: dc1
connection: local
gather_facts: no
vars_prompt:
- name: "DEVICE_PASSWORD"
prompt: "Device password"
private: yes
tasks:
- name: Get device facts
juniper.device.facts:
passwd: "{{ DEVICE_PASSWORD }}"
savedir: "{{ playbook_dir }}"