问题描述
我必须制作一个有趣的剧本,该剧本通过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