#!/usr/bin/python # -*- coding: utf-8 -*- DOCUMENTATION = ''' --- module: glance short_description: Manage OpenStack virtual machine images description: - Upload virtual machine images to OpenStack Image Service (glance) requirements: [ python-glanceclient ] options: name: description: - name of the image required: true format: description: - disk format choices: [ami, ari, aki, vhd, vmdk, raw, qcow2, vdi, iso] required: true is_public: description: - if true, image is public choices: [true, false] aliases: [public] required: false default: false file: description: - path to the file that contains the image required: true aliases: [path] auth_url: description: - URL to Identity service (keystone) catalog endpoint required: true region: description: - OpenStack region name required: false aliases: [region_name] username: description: - user name to authenticate against Identity service aliases: [user, user_name, login_user] password: description: - password to authenticate against Identity service aliases: [pass, login_password] tenant_name: description: - name of the tenant endpoint_type: description: - endpoint URL type choices: [publicURL, internalURL] required: false default: publicURL examples: - code: 'glance: name=cirros file=/tmp/cirros.img format=qcow2 is_public=true auth_url=http://192.168.206.130:5000/v2.0/ username=admin tenant_name=demo password=secrete region=RegionOne endpoint_type=publicURL ' ''' try: from glanceclient import Client from keystoneclient.v2_0 import client as ksclient except ImportError: glanceclient_found = False else: glanceclient_found = True def get_token_and_endpoint(auth_url, username, password, tenant_name, region_name, endpoint_type): keystone = ksclient.Client(username=username, password=password, tenant_name=tenant_name, auth_url=auth_url, region_name=region_name) glance_endpoint = keystone.service_catalog.url_for( service_type="image", endpoint_type=endpoint_type) return (keystone.auth_token, glance_endpoint) def authenticate(auth_url, username, password, tenant_name, region, endpoint_type, version='1'): """Return a keystone client object""" (token, endpoint) = get_token_and_endpoint(auth_url, username, password, tenant_name, region, endpoint_type) return Client(version, endpoint=endpoint, token=token) def get_images(glance, name): """ Retrieve all images with a certain name """ images = [x for x in glance.images.list() if x.name == name] return images def create_image(glance, name, path, disk_format, is_public, check_mode): """ Create a new image from a file on the path. Return a pair. First element indicates whether a change occurred, second one is the ID of the iamge """ # If the image(s) already exists, we're done images = get_images(glance, name) if len(images) > 0: return (False, images[0].id) if check_mode: return (True, None) image = glance.images.create(name=name, disk_format=disk_format, container_format='bare', is_public=is_public) image.update(data=open(path, 'rb')) return (True, image.id) def main(): module = AnsibleModule( argument_spec=dict( name=dict(required=True), file=dict(required=True, aliases=['path']), auth_url=dict(required=True), region=dict(required=False, aliases=['region_name']), username=dict(required=True, aliases=['user', 'user_name', 'login_user']), password=dict(required=True, aliases=['pass', 'login_password']), tenant_name=dict(required=True, aliases=['tenant']), disk_format=dict(required=True, choices=['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', 'vdi', 'iso'], aliases=['disk-format', 'format']), is_public=dict(required=False, default=False, aliases=['public']), endpoint_type=dict(required=False, choices=['publicURL', 'internalURL'], default='publicURL') ), supports_check_mode=True ) name = module.params['name'] path = module.params['file'] auth_url = module.params['auth_url'] region = module.params['region'] username = module.params['username'] password = module.params['password'] tenant_name = module.params['tenant_name'] disk_format = module.params['disk_format'] is_public = module.params['is_public'] endpoint_type = module.params['endpoint_type'] check_mode = module.check_mode glance = authenticate(auth_url, username, password, tenant_name, region, endpoint_type) (changed, id) = create_image(glance, name, path, disk_format, is_public, check_mode) module.exit_json(changed=changed, name=name, id=id) # this is magic, see lib/ansible/module_common.py #<> if __name__ == '__main__': main()