当我从 Ansible 服务器手动通过 SSH 连接到 Cisco 路由器时,我在命令行上看到以下内容:
me@ubuntu01:~/ansible$
me@ubuntu01:~/ansible$ ssh [email protected]
Password:
####################### Cisco Router 101 ########################
Hi, welcome to the company router! Pls don't mess it up.
####################### Cisco Router 101 ########################
cisco101 line 388
% Password expiration warning.
cisco101#
cisco101#
遗憾的是,我无法重置该密码,所以我必须学会忍受“密码过期警告”消息。
我想使用 Ansible 访问此路由器。显然,通过 SSH 连接到路由器是可行的。以下是我的 POC 清单文件:
[routers]
10.10.10.101
[routers:vars]
ansible_network_os=ios
ansible_ssh_user=user01
ansible_ssh_password=password123
我的剧本是:
---
- hosts: routers
vars:
ansible_python_interpreter: auto
- tasks:
- name: Gather only the config and default facts
cisco.ios.ios_facts:
gather_subset:
- config
可惜:
me@ubuntu01:~/ansible$
me@ubuntu01:~/ansible$
me@ubuntu01:~/ansible$ ansible-playbook myPlaybook.yml -i /home/me/inventory.txt
PLAY [routers] **********************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************
Monday 10 April 2023 19:31:48 +0000 (0:00:00.061) 0:00:00.061 **********
[WARNING]: Ignoring timeout(10) for ansible.legacy.ios_facts
[WARNING]: Unhandled error in Python interpreter discovery for host 10.10.10.101: unexpected output from Python interpreter
discovery
fatal: [10.10.10.101]: FAILED! => changed=false
ansible_facts: {}
failed_modules:
ansible.legacy.ios_facts:
ansible_facts:
discovered_interpreter_python: /usr/bin/python
failed: true
module_stderr: ''
module_stdout: |-
C
####################### Cisco Router 101 ########################
Hi, welcome to the company router! Pls don't mess it up.
####################### Cisco Router 101 ########################
cisco101 line 388
Line has invalid autocommand "/bin/sh -c '/usr/bin/python && sleep 0'"
msg: |-
MODULE FAILURE
See stdout/stderr for the exact error
rc: 0
warnings:
- Platform unknown on host 10.10.10.101 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible/2.10/reference_appendices/interpreter_discovery.html for more information.
msg: |-
The following modules failed to execute: ansible.legacy.ios_facts
PLAY RECAP ********************************************************************************************************************
10.10.10.101 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Playbook run took 0 days, 0 hours, 0 minutes, 3 seconds
Monday 10 April 2023 19:31:52 +0000 (0:00:03.741) 0:00:03.802 **********
===============================================================================
Gathering Facts -------------------------------------------------------------------------------------------------------- 3.74s
me@ubuntu01:~/ansible$
在我进一步阐述之前:
- 我的 Ubuntu 是 Ubuntu 18.04.5 LTS
- 我的 Ansible 是版本 ansible 2.10.7(Python 版本 3.6.9)
- 我的 Ansible-Playbook 是版本 2.10.7(Python 版本 3.6.9)
- 路由器运行的是 Cisco IOS 版本 15.4(3)M3(不是 IOS XR)
好的:那么到底出了什么问题?我认为有两种可能:
(A) 我猜想,当我手动记录时看到的“密码过期警告”可能会使 Ansible 感到困惑。 (B) Cisco 路由器运行的是较低版本的 Python,导致 Ansible 出现故障。
据我所知,路由器没有运行任何版本的 Python。或者至少,我在路由器上找不到“显示 Python 版本”命令来验证。
我的直觉告诉我,问题出在 (A) 上。如果是这样,有什么方法可以教 Ansible 忽略“密码过期警告”消息吗?如果问题是 (B)...我该怎么办?谢谢
答案1
您尝试在网络设备上执行 Ansible,但由于该设备缺少标准 Linux 命令,更不用说 Python 解释器,因此失败。
为了解决这个问题,有一种特殊的连接类型,适用于依赖于 CLI 解析器而不是 Python 代码执行的网络设备。您尝试使用的 IOS 模块需要network_cli
如下设置的连接类型:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
ansible_become: yes
ansible_become_method: enable
答案2
可以确认 ansible_(insert_variable) 后面的空格也修复了我的问题,并且解决了我变量中完整的 ansible.netcommon.network_cli 的问题