diff --git a/database/redis b/database/redis index 4e3793daa09..8cddb925ab8 100644 --- a/database/redis +++ b/database/redis @@ -22,8 +22,9 @@ module: redis short_description: Various redis commands, slave and flush description: - Unified utility to interact with redis instances. - 'slave' Sets a redis instance in slave or master mode. + 'slave' Sets a redis instance in slave or master mode. 'flush' Flushes all the instance or a specified db. + 'config' Ensures a configuration setting on an instance. version_added: "1.3" options: command: @@ -31,7 +32,7 @@ options: - The selected redis command required: true default: null - choices: [ "slave", "flush" ] + choices: [ "slave", "flush", "config" ] login_password: description: - The password used to authenticate with (usually not used) @@ -75,6 +76,16 @@ options: required: false default: all choices: [ "all", "db" ] + name: + description: + - A redis config key. + required: false + default: null + value: + description: + - A redis config value. + required: false + default: null notes: @@ -100,6 +111,12 @@ EXAMPLES = ''' # Flush only one db in a redis instance - redis: command=flush db=1 flush_mode=db + +# Configure local redis to have 10000 max clients +- redis: command=config name=maxclients value=10000 + +# Configure local redis to have lua time limit of 100 ms +- redis: command=config name=lua-time-limit value=100 ''' try: @@ -146,7 +163,7 @@ def flush(client, db=None): def main(): module = AnsibleModule( argument_spec = dict( - command=dict(default=None, choices=['slave', 'flush']), + command=dict(default=None, choices=['slave', 'flush', 'config']), login_password=dict(default=None), login_host=dict(default='localhost'), login_port=dict(default='6379'), @@ -155,6 +172,8 @@ def main(): slave_mode=dict(default='slave', choices=['master', 'slave']), db=dict(default=None), flush_mode=dict(default='all', choices=['all', 'db']), + name=dict(default=None), + value=dict(default=None) ), supports_check_mode = True ) @@ -272,7 +291,34 @@ def main(): module.exit_json(changed=True, flushed=True, db=db) else: # Flush never fails :) module.fail_json(msg="Unable to flush '%d' database" % db) + elif command == 'config': + name = module.params['name'] + value = module.params['value'] + r = redis.StrictRedis(host=login_host, + port=login_port, + password=login_password) + + try: + r.ping() + except Exception, e: + module.fail_json(msg="unable to connect to database: %s" % e) + + + try: + old_value = r.config_get(name)[name] + except Exception, e: + module.fail_json(msg="unable to read config: %s" % e) + changed = old_value != value + + if module.check_mode or not changed: + module.exit_json(changed=changed, name=name, value=value) + else: + try: + r.config_set(name, value) + except Exception, e: + module.fail_json(msg="unable to write config: %s" % e) + module.exit_json(changed=changed, name=name, value=value) else: module.fail_json(msg='A valid command must be provided')