From 1a7c0969549361ba3a348b7e588d1713ad09616a Mon Sep 17 00:00:00 2001 From: Brian Coca Date: Thu, 14 Dec 2017 10:35:46 -0500 Subject: [PATCH] new redis lookup (#33883) * new redis lookup deprecated redis_kv * typo fix --- .../lookup/{redis_kv.py => _redis_kv.py} | 4 + lib/ansible/plugins/lookup/redis.py | 111 ++++++++++++++++++ 2 files changed, 115 insertions(+) rename lib/ansible/plugins/lookup/{redis_kv.py => _redis_kv.py} (93%) create mode 100644 lib/ansible/plugins/lookup/redis.py diff --git a/lib/ansible/plugins/lookup/redis_kv.py b/lib/ansible/plugins/lookup/_redis_kv.py similarity index 93% rename from lib/ansible/plugins/lookup/redis_kv.py rename to lib/ansible/plugins/lookup/_redis_kv.py index ec9865c9e0..213aeb3dd4 100644 --- a/lib/ansible/plugins/lookup/redis_kv.py +++ b/lib/ansible/plugins/lookup/_redis_kv.py @@ -9,6 +9,10 @@ DOCUMENTATION = """ author: Jan-Piet Mens version_added: "0.9" short_description: fetch data from Redis + deprecated: + why: This lookup uses options intermingled with terms which blurs the interface between settings and data + version: '2.9' + alternative: new 'redis' lookup description: - this looup returns a list of items given to it, if any of the top level items is also a list it will flatten it, but it will not recurse requirements: diff --git a/lib/ansible/plugins/lookup/redis.py b/lib/ansible/plugins/lookup/redis.py new file mode 100644 index 0000000000..cf8453ded2 --- /dev/null +++ b/lib/ansible/plugins/lookup/redis.py @@ -0,0 +1,111 @@ +# (c) 2012, Jan-Piet Mens +# (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 + +DOCUMENTATION = """ + lookup: redis + author: + - Jan-Piet Mens (@jpmens) + - Ansible Core + version_added: "0.9" + short_description: fetch data from Redis + description: + - This looup returns a list of results from a Redis DB corresponding to a list of items given to it + requirements: + - redis (python library https://github.com/andymccurdy/redis-py/) + options: + _terms: + description: list of keys to query + host: + description: location of Redis host + default: '127.0.0.1' + env: + - name: ANSIBLE_REDIS_HOST + ini: + - section: lookup_redis + key: host + port: + port: + description: port on which Redis is listening on + default: 6379A + type: int + env: + - name: ANSIBLE_REDIS_PORT + ini: + - section: lookup_redis + key: port + socket: + description: path to socket on which to query Redis, this option overrides host and port options when set. + type: path + env: + - name: ANSIBLE_REDIS_SOCKET + ini: + - section: lookup_redis + key: socket +""" + +EXAMPLES = """ +- name: query redis for somekey (default or configured settings used) + debug: msg="{{ lookup('redis', 'somekey'}}" + +- name: query redis for list of keys and non-default host and port + debug: msg="{{ lookup('redis', item, host='myredis.internal.com', port=2121) }}" + loop: '{{list_of_redis_keys}}' + +- name: use list directly + debug: msg="{{ lookup('redis', 'key1', 'key2', 'key3') }}" + +- name: use list directly with a socket + debug: msg="{{ lookup('redis', 'key1', 'key2', socket='/var/tmp/redis.sock') }}" + +""" + +RETURN = """ +_raw: + description: value(s) stored in Redis +""" + +import os + +HAVE_REDIS = False +try: + import redis + HAVE_REDIS = True +except ImportError: + pass + +from ansible.errors import AnsibleError +from ansible.plugins.lookup import LookupBase + + +class LookupModule(LookupBase): + + def run(self, terms, variables, **kwargs): + + if not HAVE_REDIS: + raise AnsibleError("Can't LOOKUP(redis_kv): module redis is not installed") + + # get options + self.set_options(direct=kwargs) + + # setup connection + host = self.get_option('host') + port = self.get_option('port') + socket = self.get_option('socket') + if socket is None: + conn = redis.Redis(host=host, port=port) + else: + conn = redis.Redis(unix_socket_path=socket) + + ret = [] + for term in terms: + try: + res = conn.get(term) + if res is None: + res = "" + ret.append(res) + except Exception: + ret.append("") # connection failed or key not found + return ret