无法打开shell:Ansible v2.3.1.0

时间:2017-07-08 01:16:32

标签: ansible cisco

因此,我每天都使用Ansible来管理我们的AWS实例,现在我正在测试管理我们的网络基础架构(我是网络人员,谁可以做一些系统管理员工作)但是已经运行成为一个我似乎无法解决的问题。

我在这里有一台Cisco 3750G,我启用了SSH。我可以使用指定的用户ssh并运行我的playbook中失败的所有命令。

我能够成功地从Ansible到此交换机使用ping模块,但每当我尝试使用ios_commandsios_configs模块时,它都会失败并显示错误unable to open shell

我使用Ansible v2.3.1.0,它具有持久连接作为新功能。做了一些谷歌搜索,我找到了一些有这个问题的人,并以各种方式修复了它(没有一个对我有用)。

我尝试的事情:

  • secrets.yaml文件中指定连接变量。 然后使用我的用户名,auth_pass和密码指定provider 在秘密文件中。
  • ansible_connection设置更改为localssh(均未 工作)
  • 我的ansible.cfg文件中已禁用host_key_checking

在那之后我没有尝试: - 在手册中手动创建提供者连接变量   本身。 - 使用了2个不同的模块ios_commandsios_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

2 个答案:

答案 0 :(得分:2)

我终于弄清楚这里发生了什么。 这是事情的组合。

  • 2.3的持久连接功能对我来说是必须的,所以我不得不这样做 降级至2.2.0.0

  • 然后我不得不在我的库存中手动指定我的python解释器。 显然你可以以不安装它的方式安装paramiko /usr/bin/python而是前往/usr/local/bin/python 是Ansible运行其模块的地方。

  • 我也认为ios_commandios_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

secrets.yml

---
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

的任务/ 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"