因此,我每天都使用Ansible来管理我们的AWS实例,现在我正在测试管理我们的网络基础架构(我是网络人员,谁可以做一些系统管理员工作)但是已经运行成为一个我似乎无法解决的问题。
我在这里有一台Cisco 3750G,我启用了SSH。我可以使用指定的用户ssh并运行我的playbook中失败的所有命令。
我能够成功地从Ansible到此交换机使用ping模块,但每当我尝试使用ios_commands
或ios_configs
模块时,它都会失败并显示错误unable to open shell
。
我使用Ansible v2.3.1.0,它具有持久连接作为新功能。做了一些谷歌搜索,我找到了一些有这个问题的人,并以各种方式修复了它(没有一个对我有用)。
我尝试的事情:
secrets.yaml
文件中指定连接变量。
然后使用我的用户名,auth_pass和密码指定provider
在秘密文件中。 ansible_connection
设置更改为local
和ssh
(均未
工作)ansible.cfg
文件中已禁用host_key_checking 在那之后我没有尝试:
- 在手册中手动创建提供者连接变量
本身。
- 使用了2个不同的模块ios_commands
和ios_configs
(其中有一些是
两个模块之间的区别,但对我来说两者都应该相同)
https://docs.ansible.com/ansible/network_debug_troubleshooting.html#category-unable-to-open-shell 该文档指出,我所看到的错误通常是一个身份验证问题,但在这里似乎并非如此。
其他人遇到这个或有任何见解? 如果有人想查看,我有一个日志文件,其中包含我的playbook运行的调试输出。 我已在下面发布了我的示例剧本以供审核。
主机:切换 gather_facts:没有 连接:本地 任务:
- name: GATHER CREDENTIALS
include_vars: secrets.yaml
- name: DEFINE CONNECTION PROVIDER
set_fact:
provider:
username: "{{ creds['username'] }}"
password: " {{ creds['password'] }}"
auth_pass: "{{ creds['auth_pass'] }}"
- name: Show interfaces
ios_config:
provider: "{{ provider }}"
commands:
- show ip int br
register: cisco_int
- debug: var=cisco_int.stdout_lines
答案 0 :(得分:2)
我终于弄清楚这里发生了什么。 这是事情的组合。
2.3的持久连接功能对我来说是必须的,所以我不得不这样做 降级至2.2.0.0
然后我不得不在我的库存中手动指定我的python解释器。
显然你可以以不安装它的方式安装paramiko
/usr/bin/python
而是前往/usr/local/bin/python
是Ansible运行其模块的地方。
我也认为ios_command
和ios_config
的行为是错误的
很相似。 config
用于global / interface config中的命令
模式。 command
从用户和priv exec模式运行。
现在我的playbook运行了,我可以在3750上获得show ip int br
的输出。
答案 1 :(得分:0)
我知道你说你降级了。如果你决定给2.3另一个镜头,这可能会有所帮助。当我从2.2移动到2.3时,我遇到了一个相同的问题。我使用以下格式运行我的基本剧本。虽然在我的TACACS设置中我没有使用启用密码,但我包含了该选项。
[ios:vars]
ansible_python_interpreter=/usr/bin/python
ansible_connection = local
# If SSH/ For Telnet - Port=23
port=22
[ios]
ios-swt-1
ios-rtr-1
---
creds:
username: ansible
password: '@ns1Bl3'
#Uncomment For Enable:
#auth_pass: 3n@bl3
---
- hosts: ios
gather_facts: no
connection: local
tasks:
- name: obtain login credentials
include_vars: secrets.yml
- name: define provider
set_fact:
provider:
host: "{{ inventory_hostname }}"
username: "{{ creds['username'] }}"
password: "{{ creds['password'] }}"
#Uncomment next line if enable password is needed
#auth_pass: "{{ creds['auth_pass'] }}"
transport: cli
- include: tasks/ios_command-freeform.yml
---
- name: Freeform Task
ios_command:
provider: "{{ provider }}"
commands:
# Change the command after "-" to any IOS command you would like to run.
- show version
register: freeform
# Provides an output if -vvv is not used when running ansible-playbook
- debug: var=freeform.stdout_lines
- name: append to output
# append the command output to a local file
copy:
content: "{{ freeform.stdout[0] }}"
dest: "play_results/{{ inventory_hostname }}.txt"