forked from ansible/ansible
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding a cli transport option for the bigip_command module. (ansible#…
…30391) * Adding a cli transport option for the bigip_command module. * Fixing keyerror when using other f5 modules. Adding version_added for new option in bigip_command. * Removing local connection check because the F5 tasks can be delegated to any host that has the libraries for REST. * Using the network_common load_provider. * Adding unit test to cover cli transport and updating previous unit test to ensure cli was not called.
- Loading branch information
1 parent
6d16739
commit 50052b3
Showing
6 changed files
with
225 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
# | ||
# (c) 2016 Red Hat Inc. | ||
# | ||
# This file is part of Ansible | ||
# | ||
# Ansible is free software: you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License as published by | ||
# the Free Software Foundation, either version 3 of the License, or | ||
# (at your option) any later version. | ||
# | ||
# Ansible is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>. | ||
# | ||
from __future__ import (absolute_import, division, print_function) | ||
__metaclass__ = type | ||
|
||
import sys | ||
import copy | ||
|
||
from ansible import constants as C | ||
from ansible.module_utils.f5_utils import F5_COMMON_ARGS | ||
from ansible.module_utils.network_common import load_provider | ||
from ansible.plugins.action.normal import ActionModule as _ActionModule | ||
|
||
try: | ||
from __main__ import display | ||
except ImportError: | ||
from ansible.utils.display import Display | ||
display = Display() | ||
|
||
|
||
class ActionModule(_ActionModule): | ||
|
||
def run(self, tmp=None, task_vars=None): | ||
transport = self._task.args.get('transport', 'rest') | ||
|
||
display.vvvv('connection transport is %s' % transport, self._play_context.remote_addr) | ||
|
||
if transport == 'cli': | ||
provider = load_provider(F5_COMMON_ARGS, self._task.args) | ||
self._task.args.pop('provider', None) | ||
pc = copy.deepcopy(self._play_context) | ||
pc.connection = 'network_cli' | ||
pc.network_os = 'bigip' | ||
pc.remote_addr = provider.get('server', self._play_context.remote_addr) | ||
pc.port = int(provider['server_port'] or self._play_context.port or 22) | ||
pc.remote_user = provider.get('user', self._play_context.connection_user) | ||
pc.password = provider.get('password', self._play_context.password) | ||
pc.timeout = int(provider.get('timeout', C.PERSISTENT_COMMAND_TIMEOUT)) | ||
|
||
display.vvv('using connection plugin %s' % pc.connection, pc.remote_addr) | ||
connection = self._shared_loader_obj.connection_loader.get('persistent', pc, sys.stdin) | ||
|
||
socket_path = connection.run() | ||
display.vvvv('socket_path: %s' % socket_path, pc.remote_addr) | ||
if not socket_path: | ||
return {'failed': True, | ||
'msg': 'unable to open shell. Please see: ' + | ||
'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'} | ||
|
||
# make sure we are in the right cli context which should be | ||
# enable mode and not config mode | ||
rc, out, err = connection.exec_command('prompt()') | ||
while '(config' in str(out): | ||
display.vvvv('wrong context, sending exit to device', self._play_context.remote_addr) | ||
connection.exec_command('exit') | ||
rc, out, err = connection.exec_command('prompt()') | ||
|
||
task_vars['ansible_socket'] = socket_path | ||
|
||
result = super(ActionModule, self).run(tmp, task_vars) | ||
return result |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# | ||
# (c) 2016 Red Hat Inc. | ||
# | ||
# This file is part of Ansible | ||
# | ||
# Ansible is free software: you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License as published by | ||
# the Free Software Foundation, either version 3 of the License, or | ||
# (at your option) any later version. | ||
# | ||
# Ansible is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>. | ||
# | ||
from __future__ import (absolute_import, division, print_function) | ||
__metaclass__ = type | ||
|
||
import re | ||
|
||
from ansible.plugins.terminal import TerminalBase | ||
from ansible.errors import AnsibleConnectionFailure | ||
|
||
|
||
class TerminalModule(TerminalBase): | ||
|
||
terminal_stdout_re = [ | ||
re.compile(br"[\r\n]?(?:\([^\)]+\)){,5}(?:>|#) ?$"), | ||
re.compile(br"[\r\n]?[\w+\-\.:\/\[\]]+(?:\([^\)]+\)){,3}(?:>|#) ?$"), | ||
re.compile(br"\[\w+\@[\w\-\.]+(?: [^\]])\] ?[>#\$] ?$") | ||
] | ||
|
||
terminal_stderr_re = [ | ||
re.compile(br"% ?Error"), | ||
re.compile(br"% User not present"), | ||
re.compile(br"% ?Bad secret"), | ||
re.compile(br"invalid input", re.I), | ||
re.compile(br"(?:incomplete|ambiguous) command", re.I), | ||
re.compile(br"connection timed out", re.I), | ||
re.compile(br"[^\r\n]+ not found", re.I), | ||
re.compile(br"'[^']' +returned error code: ?\d+"), | ||
re.compile(br"[^\r\n]\/bin\/(?:ba)?sh") | ||
] | ||
|
||
def on_open_shell(self): | ||
try: | ||
self._exec_cli_command(b'modify cli preference display-threshold 0 pager disabled') | ||
except AnsibleConnectionFailure: | ||
raise AnsibleConnectionFailure('unable to set terminal parameters') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters