Fixes and additions for f5 modules (#39986)

Small fixes in the f5 module utils. I believe the action plugins now
work consistently across types of connections
This commit is contained in:
Tim Rupp 2018-05-11 11:45:42 -07:00 committed by GitHub
parent 8654508cbd
commit 00a6b19e58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 172 additions and 162 deletions

View file

@ -19,6 +19,7 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import sys
import copy
@ -43,17 +44,16 @@ except ImportError:
class ActionModule(_ActionModule):
def run(self, tmp=None, task_vars=None):
del tmp # tmp no longer has any effect
socket_path = None
transport = 'rest'
if self._play_context.connection == 'network_cli':
provider = self._task.args.get('provider', {})
if any(provider.values()):
display.warning('provider is unnecessary when using network_cli and will be ignored')
del self._task.args['provider']
display.warning("'provider' is unnecessary when using 'network_cli' and will be ignored")
elif self._play_context.connection == 'local':
provider = load_provider(f5_provider_spec, self._task.args)
transport = provider['transport'] or 'rest'
transport = provider['transport'] or transport
display.vvvv('connection transport is %s' % transport, self._play_context.remote_addr)
@ -70,17 +70,14 @@ class ActionModule(_ActionModule):
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: ' +
'msg': 'Unable to open shell. Please see: ' +
'https://docs.ansible.com/ansible/network_debug_troubleshooting.html#unable-to-open-shell'}
task_vars['ansible_socket'] = socket_path
else:
self._task.args['provider'] = ActionModule.rest_implementation(provider, self._play_context)
else:
return {'failed': True, 'msg': 'Connection type %s is not valid for this module' % self._play_context.connection}
@ -96,61 +93,5 @@ class ActionModule(_ActionModule):
conn.send_command('exit')
out = conn.get_prompt()
result = super(ActionModule, self).run(task_vars=task_vars)
result = super(ActionModule, self).run(tmp, task_vars)
return result
@staticmethod
def rest_implementation(provider, play_context):
"""Provides a generic argument spec using Play context vars
This method will return a set of default values to use for connecting
to a remote BIG-IP in the event that you do not use either
* The environment fallback variables F5_USER, F5_PASSWORD, etc
* The "provider" spec
With this "spec" (for lack of a better name) Ansible will attempt
to fill in the provider arguments itself using the play context variables.
These variables are contained in the list of MAGIC_VARIABLE_MAPPING
found in the constants file
* https://github.com/ansible/ansible/blob/devel/lib/ansible/constants.py
Therefore, if you do not use the provider nor that environment args, this
method here will be populate the "provider" dict with with the necessary
F5 connection params, from the following host vars,
* remote_addr=('ansible_ssh_host', 'ansible_host'),
* remote_user=('ansible_ssh_user', 'ansible_user'),
* password=('ansible_ssh_pass', 'ansible_password'),
* port=('ansible_ssh_port', 'ansible_port'),
* timeout=('ansible_ssh_timeout', 'ansible_timeout'),
* private_key_file=('ansible_ssh_private_key_file', 'ansible_private_key_file'),
For example, this may leave your inventory looking like this
bigip2 ansible_host=1.2.3.4 ansible_port=10443 ansible_user=admin ansible_password=admin
:param provider:
:param play_context:
:return:
"""
provider['transport'] = 'rest'
if provider.get('server') is None:
provider['server'] = play_context.remote_addr
if provider.get('server_port') is None:
default_port = provider['server_port'] if provider['server_port'] else 443
provider['server_port'] = int(play_context.port or default_port)
if provider.get('timeout') is None:
provider['timeout'] = C.PERSISTENT_COMMAND_TIMEOUT
if provider.get('user') is None:
provider['user'] = play_context.connection_user
if provider.get('password') is None:
provider['password'] = play_context.password
return provider