1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

telnet action plugin (#27983)

* draft telnet action plugin

docs in module

* updated per feedback

* fixed imports

* pep8 fixes

* added meta import even though its useless
This commit is contained in:
Brian Coca 2017-08-11 22:46:26 -04:00 committed by Peter Sprygada
parent 039383d90f
commit 40d29936a4
2 changed files with 156 additions and 0 deletions

View file

@ -0,0 +1,75 @@
# this is a virtual module that is entirely implemented server side
# Copyright: Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import absolute_import, division, print_function
__metaclass__ = type
ANSIBLE_METADATA = {'metadata_version': '1.0',
'status': ['preview'],
'supported_by': 'community'}
DOCUMENTATION = '''
---
module: telnet
short_description: Executes a low-down and dirty telnet command
version_added: 2.4
description:
- Executes a low-down and dirty telnet command, not going through the module subsystem.
- This is mostly to be used for enabling ssh on devices that only have telnet enabled by default.
options:
commands:
description:
- List of commands to be executed in the telnet session.
required: True
host:
description:
- The host/target on which to execute the command
required: False
default: remote_addr
user:
description:
- The user for login
required: False
default: remote_user
password:
description:
- The password for login
port:
description:
- Remote port to use
default: 23
timeout:
description:
- timeout for remote operations
default: 120
command:
description:
- Command to execute in telnet session
required: True
pause:
description:
- Seconds to pause between each command issued
required: False
default: 1
notes:
- The C(environment) keyword does not work with this task
author:
- Ansible Core Team
'''
EXAMPLES = '''
- name: Force ssh on IOS
telnet:
command: transport input ssh
user: cisco
password: cisco
'''
RETURN = '''
output:
description: output of each command is an element in this list
type: list
returned: always
sample: [ 'success', 'success', '', 'warning .. something' ]
'''

View file

@ -0,0 +1,81 @@
# (c) 2017, Ansible Project
#
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
#
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import telnetlib
from time import sleep
from ansible.module_utils._text import to_native
from ansible.module_utils.six import text_type
from ansible.plugins.action import ActionBase
class ActionModule(ActionBase):
TRANSFERS_FILES = False
def run(self, tmp=None, task_vars=None):
if self._task.environment and any(self._task.environment):
self._display.warning('The telnet task does not support the environment keyword')
result = super(ActionModule, self).run(tmp, task_vars)
if self._play_context.check_mode:
# in --check mode, always skip this module execution
result['skipped'] = True
result['msg'] = 'The telnet task does not support check mode'
else:
result['changed'] = True
result['failed'] = False
host = self._task.args.get('host', self._play_context.remote_addr)
user = self._task.args.get('user', self._play_context.remote_user)
password = self._task.args.get('password', self._play_context.password)
# FIXME, default to play_context?
port = self._task.args.get('port', '23')
timeout = self._task.args.get('timeout', 120)
pause = self._task.args.get('pause', 1)
login_prompt = self._task.args.get('login_prompt', "login: ")
password_prompt = self._task.args.get('password_prompt', "Password: ")
commands = self._task.args.get('command')
if isinstance(commands, text_type):
commands = commands.split(',')
if isinstance(commands, list) and commands:
tn = telnetlib.Telnet(host, port, timeout)
output = []
try:
tn.read_until(login_prompt)
tn.write('%s\n' % user)
if password:
tn.read_until(password_prompt)
tn.write('%s\n' % password)
for cmd in commands:
tn.write(cmd)
output.append(tn.read_until(''))
sleep(pause)
tn.write("exit\n")
except EOFError as e:
result['failed'] = True
result['msg'] = 'Telnet action failed: %s' % to_native(e)
finally:
if tn:
tn.close()
result['output'] = output
else:
result['failed'] = True
result['msg'] = 'Telnet requries a command to execute'
return result