From eaa45dcbd9e0deef3b78145afa86d7fe7c8500fb Mon Sep 17 00:00:00 2001 From: Bret Martin Date: Fri, 4 Sep 2015 19:44:35 -0400 Subject: [PATCH] Add network_interfaces parameter to ec2 module to support launch-time ENIs --- cloud/amazon/ec2.py | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/cloud/amazon/ec2.py b/cloud/amazon/ec2.py index 9ad64c8e9fb..1b97d908b4a 100644 --- a/cloud/amazon/ec2.py +++ b/cloud/amazon/ec2.py @@ -240,6 +240,13 @@ options: required: false default: null aliases: [] + network_interfaces: + version_added: "2.0" + description: + - A list of existing network interfaces to attach to the instance at launch. When specifying existing network interfaces, none of the assign_public_ip, private_ip, vpc_subnet_id, group, or group_id parameters may be used. (Those parameters are for creating a new network interface at launch.) + required: false + default: null + aliases: [] author: - "Tim Gerla (@tgerla)" @@ -826,11 +833,21 @@ def create_instances(module, ec2, vpc, override_count=None): count_tag = module.params.get('count_tag') source_dest_check = module.boolean(module.params.get('source_dest_check')) termination_protection = module.boolean(module.params.get('termination_protection')) + network_interfaces = module.params.get('network_interfaces') # group_id and group_name are exclusive of each other if group_id and group_name: module.fail_json(msg = str("Use only one type of parameter (group_name) or (group_id)")) + if (network_interfaces and + (assign_public_ip or private_ip or vpc_subnet_id + or group_name or group_id)): + module.fail_json( + msg=str("network_interfaces must not be set when specifying " + + "assign_public_ip, private_ip, vpc_subnet_id, group, " + + "or group_id, which are used to create a new network " + + "interface.")) + vpc_id = None if vpc_subnet_id: if not vpc: @@ -926,11 +943,21 @@ def create_instances(module, ec2, vpc, override_count=None): interfaces = boto.ec2.networkinterface.NetworkInterfaceCollection(interface) params['network_interfaces'] = interfaces else: - params['subnet_id'] = vpc_subnet_id - if vpc_subnet_id: - params['security_group_ids'] = group_id + if network_interfaces: + interfaces = [] + for i, network_interface_id in enumerate(network_interfaces): + interface = boto.ec2.networkinterface.NetworkInterfaceSpecification( + network_interface_id=network_interface_id, + device_index=i) + interfaces.append(interface) + params['network_interfaces'] = \ + boto.ec2.networkinterface.NetworkInterfaceCollection(*interfaces) else: - params['security_groups'] = group_name + params['subnet_id'] = vpc_subnet_id + if vpc_subnet_id: + params['security_group_ids'] = group_id + else: + params['security_groups'] = group_name if volumes: bdm = BlockDeviceMapping() @@ -1284,6 +1311,7 @@ def main(): volumes = dict(type='list'), ebs_optimized = dict(type='bool', default=False), tenancy = dict(default='default'), + network_interfaces = dict(type='list') ) )