From af051d6f77db306a555f71121f14c745a4ed0363 Mon Sep 17 00:00:00 2001 From: Jan-Piet Mens Date: Sat, 15 Jun 2013 22:21:34 +0200 Subject: [PATCH 1/2] ini_file: add support for lists of options/values --- library/files/ini_file | 57 +++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/library/files/ini_file b/library/files/ini_file index c1de5fee39d..921450d572d 100644 --- a/library/files/ini_file +++ b/library/files/ini_file @@ -107,12 +107,21 @@ def do_ini(module, filename, section=None, option=None, value=None, state='prese changed = True else: if option is not None: - try: - if cp.get(section, option): - cp.remove_option(section, option) - changed = True - except: - pass + if type(option) == str: + try: + if cp.get(section, option): + cp.remove_option(section, option) + changed = True + except: + pass + else: + for o in option: + try: + if cp.get(section, o): + cp.remove_option(section, o) + changed = True + except: + pass if state == 'present': if cp.has_section(section) == False: @@ -123,17 +132,31 @@ def do_ini(module, filename, section=None, option=None, value=None, state='prese changed = True if option is not None and value is not None: - try: - oldvalue = cp.get(section, option) - if str(value) != str(oldvalue): + olist = [] + vlist = [] + if type(option) == str and type(value) == str: + olist.append(option) + vlist.append(value) + else: + olist = list(option) + vlist = list(value) + if len(olist) != len(vlist): + module.fail_json(msg="Option and value lists must be of same lengths") + n = 0 + for option in olist: + value = vlist[n] + n = n + 1 + try: + oldvalue = cp.get(section, option) + if str(value) != str(oldvalue): + cp.set(section, option, value) + changed = True + except ConfigParser.NoSectionError: + cp.set(section, option, value) + changed = True + except ConfigParser.NoOptionError: cp.set(section, option, value) changed = True - except ConfigParser.NoSectionError: - cp.set(section, option, value) - changed = True - except ConfigParser.NoOptionError: - cp.set(section, option, value) - changed = True if changed: if backup: @@ -156,8 +179,8 @@ def main(): argument_spec = dict( dest = dict(required=True), section = dict(required=True), - option = dict(required=False), - value = dict(required=False), + option = dict(required=False, type='list'), + value = dict(required=False, type='list'), backup = dict(default='no', type='bool'), state = dict(default='present', choices=['present', 'absent']) ), From 07bea63533ce56509231dd34b298b148ef34116d Mon Sep 17 00:00:00 2001 From: Daniil Date: Tue, 18 Jun 2013 00:15:12 +0400 Subject: [PATCH 2/2] Allow 'ec2.group' field to handle lists of groups --- library/cloud/ec2 | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/library/cloud/ec2 b/library/cloud/ec2 index 90dcd833b39..80e7da4fd0f 100644 --- a/library/cloud/ec2 +++ b/library/cloud/ec2 @@ -36,7 +36,7 @@ options: aliases: [] group: description: - - security group to use with the instance + - security group (or list of groups) to use with the instance required: false default: null aliases: [] @@ -183,6 +183,18 @@ local_action: count: 5 instance_tags: '{"db":"postgres"}' monitoring=yes' +# Multiple groups example +local_action: + module: ec2 + keypair: mykey + group: [databases, internal-services, sshable, and-so-forth] + instance_type: m1.large + image: ami-6e649707 + wait: yes + wait_timeout: 500 + count: 5 + instance_tags: '{"db":"postgres"}' monitoring=yes' + # VPC example local_action: module: ec2 @@ -208,7 +220,7 @@ def main(): argument_spec = dict( key_name = dict(required=True, aliases = ['keypair']), id = dict(), - group = dict(), + group = dict(type='list'), group_id = dict(), region = dict(choices=['eu-west-1', 'sa-east-1', 'us-east-1', 'ap-northeast-1', 'us-west-2', 'us-west-1', 'ap-southeast-1', 'ap-southeast-2']), zone = dict(), @@ -285,14 +297,18 @@ def main(): # Here we try to lookup the group id from the security group name - if group is set. if group_name: grp_details = ec2.get_all_security_groups() - for grp in grp_details: - if str(group_name) in str(grp): - group_id = str(grp.id) + if type(group_name) == list: + group_id = list(filter(lambda grp: str(grp.id) if str(tmp) in str(grp) else None, grp_details) for tmp in group_name) + elif type(group_name) == str: + for grp in grp_details: + if str(group_name) in str(grp): + group_id = [str(grp.id)] + group_name = [group_name] # Now we try to lookup the group id testing if group exists. elif group_id: grp_details = ec2.get_all_security_groups(group_ids=group_id) grp_item = grp_details[0] - group_name = grp_item.name + group_name = [grp_item.name ] except boto.exception.NoAuthHandlerFound, e: module.fail_json(msg = str(e)) @@ -329,9 +345,9 @@ def main(): 'user_data': user_data} if vpc_subnet_id: - params['security_group_ids'] = [group_id] + params['security_group_ids'] = group_id else: - params['security_groups'] = [group_name] + params['security_groups'] = group_name res = ec2.run_instances(**params) except boto.exception.BotoServerError, e: