ec2_lookup 4.78 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
#!/usr/bin/python
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.

DOCUMENTATION = '''
---
module: ec2_lookup
short_description: returns a list of ec2 instances that meet search criteria
description:
     - Returns a list of ec2 instances that meet search criteria
version_added: "1.4"
options:
  region:
    description:
      - The AWS region to use.  Must be specified if ec2_url
        is not used.  If not specified then the value of the
        EC2_REGION environment variable, if any, is used.
    required: false
    default: null
    aliases: [ 'aws_region', 'ec2_region' ]
  aws_secret_key:
    description:
      - AWS secret key. If not set then the value of
        the AWS_SECRET_KEY environment variable is used.
    required: false
    default: null
    aliases: [ 'ec2_secret_key', 'secret_key' ]
  aws_access_key:
    description:
      - AWS access key. If not set then the value of the
        AWS_ACCESS_KEY environment variable is used.
    required: false
    default: null
    aliases: [ 'ec2_access_key', 'access_key' ]
  tags:
    desription:
      - tags to lookup
    required: false
    default: null
    type: dict
    aliases: []

requirements: [ "boto" ]
author: John Jarvis
'''

EXAMPLES = '''
# Note: None of these examples set aws_access_key, aws_secret_key, or region.
# It is assumed that their matching environment variables are set.

# Return all instances that match the tag "Name: foo"
- local_action:
John Jarvis committed
65
    module: ec2_lookup
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
    tags:
        Name: foo
'''

import sys

AWS_REGIONS = ['ap-northeast-1',
               'ap-southeast-1',
               'ap-southeast-2',
               'eu-west-1',
               'sa-east-1',
               'us-east-1',
               'us-west-1',
               'us-west-2']

try:
    import boto.ec2
    from boto.ec2 import connect_to_region
except ImportError:
    print "failed=True msg='boto required for this module'"
    sys.exit(1)


def main():

    module=AnsibleModule(
        argument_spec=dict(
            ec2_url=dict(),
            region=dict(aliases=['aws_region', 'ec2_region'],
                        choices=AWS_REGIONS),
            aws_secret_key=dict(aliases=['ec2_secret_key', 'secret_key'],
                                no_log=True),
            aws_access_key=dict(aliases=['ec2_access_key', 'access_key']),
99
            tags=dict(default=None),
100 101 102
        )
    )

103
    tags_param = module.params.get('tags')
104
    tags = {}
105 106 107 108 109 110 111 112 113
    if isinstance(tags_param, list):
      for item in module.params.get('tags'):
          for k,v in item.iteritems():
              tags[k] = v
    elif isinstance(tags_param, dict):
        tags = tags_param
    else:
        module.fail_json(msg="Invalid format for tags")

114

115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
    aws_secret_key = module.params.get('aws_secret_key')
    aws_access_key = module.params.get('aws_access_key')
    region = module.params.get('region')
    ec2_url = module.params.get('ec2_url')

    # If we have a region specified, connect to its endpoint.
    if region:
        try:
            ec2 = connect_to_region(region, aws_access_key_id=aws_access_key,
                                    aws_secret_access_key=aws_secret_key)
        except boto.exception.NoAuthHandlerFound, e:
            module.fail_json(msg=str(e))
    # If we specified an ec2_url then try connecting to it
    elif ec2_url:
        try:
            ec2 = boto.connect_ec2_endpoint(ec2_url, aws_access_key,
                                            aws_secret_key)
        except boto.exception.NoAuthHandlerFound, e:
            module.fail_json(msg=str(e))
    else:
        module.fail_json(msg="Either region or ec2_url must be specified")

    instances = []
    instance_ids = []
    for res in ec2.get_all_instances(filters={'tag:' + tag: value
                                     for tag, value in tags.iteritems()}):
        for inst in res.instances:
142 143 144 145
            if inst.state == "running":
                instances.append({k: v for k, v in inst.__dict__.iteritems()
                                  if isinstance(v, (basestring))})
                instance_ids.append(inst.id)
146 147 148 149 150 151 152 153
    module.exit_json(changed=False, instances=instances,
                     instance_ids=instance_ids)


# this is magic, see lib/ansible/module_common.py
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>

main()