'When the playbook specifies a lookup, this method is run.  The
arguments to the lookup become the arguments to this method.  One
additional keyword argument named ``variables`` is added to the method
call.  It contains the variables available to ansible at the time the
lookup is templated.  For instance::
"{{ lookup(\'url\', \'https://toshio.fedorapeople.org/one.txt\', validate_certs=True) }}"
would end up calling the lookup plugin named url\'s run method like this::
run([\'https://toshio.fedorapeople.org/one.txt\'], variables=available_variables, validate_certs=True)
Lookup plugins can be used within playbooks for looping.  When this
happens, the first argument is a list containing the terms.  Lookup
plugins can also be called from within playbooks to return their
values into a variable or parameter.  If the user passes a string in
this case, it is converted into a list.
Errors encountered during execution should be returned by raising
AnsibleError() with a message describing the error.
Any strings returned by this method that could ever contain non-ascii
must be converted into python\'s unicode type as the strings will be run
through jinja2 which has this requirement.  You can use::
from ansible.module_utils._text import to_text
result_string = to_text(result_string)'

@abstractmethod
def run(self, terms, variables=None, **kwargs):

    pass
