没有用户名和密码的Ansible telnet

问题描述

我必须制作一个有趣的剧本,该剧本通过telnet连接到特定telnet端口上的终端集中器来连接到全新的cisco路由器。

到目前为止,这是我的剧本

---
- name: Telnet test
  hosts: localhost
  connection: local
  tasks:
    - name: telnet test
      telnet:
        host: 10.145.0.200
        port: 4009
        send_newline: yes
        prompts:
          - '[>|#]'
        command:
          - enable
          - term len 0
          - show ver

我的问题是,当建立连接时,剧本只是停留在任务中而没有向cisco路由器发送任何命令,我该如何连接到没有用户名密码的设备?

我不得不取消剧本,因为它会永远留在任务中

ansible-playbook 2.9.13
  config file = /home/niclas/ansible/gc/ansible.cfg
  configured module search path = ['/home/niclas/.ansible/plugins/modules','/usr/share/ansible/plugins/modules']
  ansible python module location = /home/niclas/.local/lib/python3.8/site-packages/ansible
  executable location = /usr/bin/ansible-playbook
  python version = 3.8.2 (default,Jul 16 2020,14:00:26) [GCC 9.3.0]
Using /home/niclas/ansible/gc/ansible.cfg as config file
host_list declined parsing /home/niclas/ansible/gc/inventory.yml as it did not pass its verify_file() method
Parsed /home/niclas/ansible/gc/inventory.yml inventory source with ini plugin

PLAYBOOK: testTelnet.yml ***********************************************************************************************
1 plays in testTelnet.yml

PLAY [Telnet test] *****************************************************************************************************
Meta: ran handlers

TASK [telnet test] *****************************************************************************************************
task path: /home/niclas/ansible/gc/testTelnet.yml:6
^C [ERROR]: User interrupted execution

编辑错误

❯ ansible-playbook testTelnet.yml -vvv
ansible-playbook 2.9.13
  config file = /home/niclas/ansible/gc/ansible.cfg
  configured module search path = ['/home/niclas/.ansible/plugins/modules',14:00:26) [GCC 9.3.0]
Using /home/niclas/ansible/gc/ansible.cfg as config file
host_list declined parsing /home/niclas/ansible/gc/inventory.yml as it did not pass its verify_file() method
Parsed /home/niclas/ansible/gc/inventory.yml inventory source with ini plugin

PLAYBOOK: testTelnet.yml ***********************************************************************************************
1 plays in testTelnet.yml

PLAY [Telnet test] *****************************************************************************************************
Meta: ran handlers

TASK [telnet test] *****************************************************************************************************
task path: /home/niclas/ansible/gc/testTelnet.yml:6
The full traceback is:
Traceback (most recent call last):
  File "/home/niclas/.local/lib/python3.8/site-packages/ansible/executor/task_executor.py",line 147,in run
    res = self._execute()
  File "/home/niclas/.local/lib/python3.8/site-packages/ansible/executor/task_executor.py",line 665,in _execute
    result = self._handler.run(task_vars=variables)
  File "/home/niclas/.local/lib/python3.8/site-packages/ansible/plugins/action/telnet.py",line 59,in run
    tn = telnetlib.Telnet(host,port,timeout)
  File "/usr/lib/python3.8/telnetlib.py",line 218,in __init__
    self.open(host,line 235,in open
    self.sock = socket.create_connection((host,port),timeout)
  File "/usr/lib/python3.8/socket.py",line 808,in create_connection
    raise err
  File "/usr/lib/python3.8/socket.py",line 796,in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
fatal: [localhost]: Failed! => {
    "msg": "Unexpected failure during module execution.","stdout": ""
}

PLAY RECAP *************************************************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    Failed=1    skipped=0    rescued=0    ignored=0

解决方法

我认为ansible的命令解释器无法理解cisco的提示。我认为您应该使用cisco.ios插件代替,该插件在此处进行描述:https://docs.ansible.com/ansible/latest/collections/cisco/ios/ios_command_module.html

更新

由于telnet任务不了解cisco.ios命令,因此您应该使用另一种连接方法。希望您的cisco设备支持SSH,然后就可以建立连接。

在这种情况下,我认为您的剧本应如下所示:

ansible_connection: ansible.netcommon.network_cli
ansible_network_os: cisco.ios.ios
ansible_user: cisco
ansible_password: ciscopass
ansible_become: yes
ansible_become_method: enable
ansible_become_password: if_you_have_enable_password_define_it_here

---
- hosts: ansible.ini_defined_group_name_for_cisco_device
    tasks:
    - name: log into cisco device and init this commands
      cisco.ios.ios_command:
        commands:
          - show version
          - term len 0