Add support for network, boot_from_volume and volumes
nics is a great flexible parameter, but it's wordy. Shade now supports a simple parameter too, which is just "network" and takes a name or id. Add passthrough support. In addition to supporting booting from a pre-existing volume, nova and shade both support the concept of booting from volume based on an image. Pass the parameters through. Shade supports boot-time attachment of additional volumes for OpenStack instances. Pass through the parameter so that ansible users can also take advantage of this.
This commit is contained in:
parent
3c685d7468
commit
187a4bd505
1 changed files with 90 additions and 7 deletions
|
@ -80,6 +80,13 @@ options:
|
||||||
added. This may be a YAML list or a common separated string.
|
added. This may be a YAML list or a common separated string.
|
||||||
required: false
|
required: false
|
||||||
default: None
|
default: None
|
||||||
|
network:
|
||||||
|
description:
|
||||||
|
- Name or ID of a network to attach this instance to. A simpler
|
||||||
|
version of the nics parameter, only one of network or nics should
|
||||||
|
be supplied.
|
||||||
|
required: false
|
||||||
|
default: None
|
||||||
nics:
|
nics:
|
||||||
description:
|
description:
|
||||||
- A list of networks to which the instance's interface should
|
- A list of networks to which the instance's interface should
|
||||||
|
@ -87,6 +94,7 @@ options:
|
||||||
or port-name.
|
or port-name.
|
||||||
- 'Also this accepts a string containing a list of (net/port)-(id/name)
|
- 'Also this accepts a string containing a list of (net/port)-(id/name)
|
||||||
Eg: nics: "net-id=uuid-1,port-name=myport"'
|
Eg: nics: "net-id=uuid-1,port-name=myport"'
|
||||||
|
Only one of network or nics should be supplied.
|
||||||
required: false
|
required: false
|
||||||
default: None
|
default: None
|
||||||
auto_ip:
|
auto_ip:
|
||||||
|
@ -133,15 +141,32 @@ options:
|
||||||
- Opaque blob of data which is made available to the instance
|
- Opaque blob of data which is made available to the instance
|
||||||
required: false
|
required: false
|
||||||
default: None
|
default: None
|
||||||
root_volume:
|
boot_from_volume:
|
||||||
description:
|
description:
|
||||||
- Boot instance from a volume
|
- Should the instance boot from a persistent volume created based on
|
||||||
|
the image given. Mututally exclusive with boot_volume.
|
||||||
|
required: false
|
||||||
|
default: false
|
||||||
|
volume_size:
|
||||||
|
description:
|
||||||
|
- The size of the volume to create in GB if booting from volume based
|
||||||
|
on an image.
|
||||||
|
boot_volume:
|
||||||
|
description:
|
||||||
|
- Volume name or id to use as the volume to boot from. Implies
|
||||||
|
boot_from_volume. Mutually exclusive with image and boot_from_volume.
|
||||||
required: false
|
required: false
|
||||||
default: None
|
default: None
|
||||||
|
aliases: ['root_volume']
|
||||||
terminate_volume:
|
terminate_volume:
|
||||||
description:
|
description:
|
||||||
- If true, delete volume when deleting instance (if booted from volume)
|
- If true, delete volume when deleting instance (if booted from volume)
|
||||||
default: false
|
default: false
|
||||||
|
volumes:
|
||||||
|
description:
|
||||||
|
- A list of preexisting volumes names or ids to attach to the instance
|
||||||
|
required: false
|
||||||
|
default: []
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
- Should the resource be present or absent.
|
- Should the resource be present or absent.
|
||||||
|
@ -280,6 +305,52 @@ EXAMPLES = '''
|
||||||
- net-id: 34605f38-e52a-25d2-b6ec-754a13ffb723
|
- net-id: 34605f38-e52a-25d2-b6ec-754a13ffb723
|
||||||
- net-name: another_network
|
- net-name: another_network
|
||||||
meta: "hostname=test1,group=uge_master"
|
meta: "hostname=test1,group=uge_master"
|
||||||
|
|
||||||
|
# Creates a new instance and attaches to a specific network
|
||||||
|
- os_server:
|
||||||
|
state: present
|
||||||
|
auth:
|
||||||
|
auth_url: https://region-b.geo-1.identity.hpcloudsvc.com:35357/v2.0/
|
||||||
|
username: admin
|
||||||
|
password: admin
|
||||||
|
project_name: admin
|
||||||
|
name: vm1
|
||||||
|
image: 4f905f38-e52a-43d2-b6ec-754a13ffb529
|
||||||
|
key_name: ansible_key
|
||||||
|
timeout: 200
|
||||||
|
flavor: 4
|
||||||
|
network: another_network
|
||||||
|
|
||||||
|
# Creates a new instance with 4G of RAM on a 75G Ubuntu Trusty volume
|
||||||
|
- name: launch a compute instance
|
||||||
|
hosts: localhost
|
||||||
|
tasks:
|
||||||
|
- name: launch an instance
|
||||||
|
os_server:
|
||||||
|
name: vm1
|
||||||
|
state: present
|
||||||
|
cloud: mordred
|
||||||
|
region_name: ams01
|
||||||
|
image: Ubuntu Server 14.04
|
||||||
|
flavor_ram: 4096
|
||||||
|
boot_from_volume: True
|
||||||
|
volume_size: 75
|
||||||
|
|
||||||
|
# Creates a new instance with 2 volumes attached
|
||||||
|
- name: launch a compute instance
|
||||||
|
hosts: localhost
|
||||||
|
tasks:
|
||||||
|
- name: launch an instance
|
||||||
|
os_server:
|
||||||
|
name: vm1
|
||||||
|
state: present
|
||||||
|
cloud: mordred
|
||||||
|
region_name: ams01
|
||||||
|
image: Ubuntu Server 14.04
|
||||||
|
flavor_ram: 4096
|
||||||
|
volumes:
|
||||||
|
- photos
|
||||||
|
- music
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
@ -339,7 +410,7 @@ def _create_server(module, cloud):
|
||||||
flavor_include = module.params['flavor_include']
|
flavor_include = module.params['flavor_include']
|
||||||
|
|
||||||
image_id = None
|
image_id = None
|
||||||
if not module.params['root_volume']:
|
if not module.params['boot_volume']:
|
||||||
image_id = cloud.get_image_id(
|
image_id = cloud.get_image_id(
|
||||||
module.params['image'], module.params['image_exclude'])
|
module.params['image'], module.params['image_exclude'])
|
||||||
|
|
||||||
|
@ -371,7 +442,9 @@ def _create_server(module, cloud):
|
||||||
userdata=module.params['userdata'],
|
userdata=module.params['userdata'],
|
||||||
config_drive=module.params['config_drive'],
|
config_drive=module.params['config_drive'],
|
||||||
)
|
)
|
||||||
for optional_param in ('region_name', 'key_name', 'availability_zone'):
|
for optional_param in (
|
||||||
|
'region_name', 'key_name', 'availability_zone', 'network',
|
||||||
|
'volume_size', 'volumes'):
|
||||||
if module.params[optional_param]:
|
if module.params[optional_param]:
|
||||||
bootkwargs[optional_param] = module.params[optional_param]
|
bootkwargs[optional_param] = module.params[optional_param]
|
||||||
|
|
||||||
|
@ -379,7 +452,8 @@ def _create_server(module, cloud):
|
||||||
ip_pool=module.params['floating_ip_pools'],
|
ip_pool=module.params['floating_ip_pools'],
|
||||||
ips=module.params['floating_ips'],
|
ips=module.params['floating_ips'],
|
||||||
auto_ip=module.params['auto_ip'],
|
auto_ip=module.params['auto_ip'],
|
||||||
root_volume=module.params['root_volume'],
|
boot_volume=module.params['boot_volume'],
|
||||||
|
boot_from_volume=module.params['boot_from_volume'],
|
||||||
terminate_volume=module.params['terminate_volume'],
|
terminate_volume=module.params['terminate_volume'],
|
||||||
wait=module.params['wait'], timeout=module.params['timeout'],
|
wait=module.params['wait'], timeout=module.params['timeout'],
|
||||||
**bootkwargs
|
**bootkwargs
|
||||||
|
@ -461,6 +535,7 @@ def main():
|
||||||
flavor_include = dict(default=None),
|
flavor_include = dict(default=None),
|
||||||
key_name = dict(default=None),
|
key_name = dict(default=None),
|
||||||
security_groups = dict(default=['default'], type='list'),
|
security_groups = dict(default=['default'], type='list'),
|
||||||
|
network = dict(default=None),
|
||||||
nics = dict(default=[], type='list'),
|
nics = dict(default=[], type='list'),
|
||||||
meta = dict(default=None),
|
meta = dict(default=None),
|
||||||
userdata = dict(default=None),
|
userdata = dict(default=None),
|
||||||
|
@ -468,8 +543,11 @@ def main():
|
||||||
auto_ip = dict(default=True, type='bool', aliases=['auto_floating_ip', 'public_ip']),
|
auto_ip = dict(default=True, type='bool', aliases=['auto_floating_ip', 'public_ip']),
|
||||||
floating_ips = dict(default=None),
|
floating_ips = dict(default=None),
|
||||||
floating_ip_pools = dict(default=None),
|
floating_ip_pools = dict(default=None),
|
||||||
root_volume = dict(default=None),
|
volume_size = dict(default=False, type='int'),
|
||||||
|
boot_from_volume = dict(default=False, type='bool'),
|
||||||
|
boot_volume = dict(default=None, aliases=['root_volume']),
|
||||||
terminate_volume = dict(default=False, type='bool'),
|
terminate_volume = dict(default=False, type='bool'),
|
||||||
|
volumes = dict(default=[], type='list'),
|
||||||
state = dict(default='present', choices=['absent', 'present']),
|
state = dict(default='present', choices=['absent', 'present']),
|
||||||
)
|
)
|
||||||
module_kwargs = openstack_module_kwargs(
|
module_kwargs = openstack_module_kwargs(
|
||||||
|
@ -478,7 +556,12 @@ def main():
|
||||||
['auto_ip', 'floating_ip_pools'],
|
['auto_ip', 'floating_ip_pools'],
|
||||||
['floating_ips', 'floating_ip_pools'],
|
['floating_ips', 'floating_ip_pools'],
|
||||||
['flavor', 'flavor_ram'],
|
['flavor', 'flavor_ram'],
|
||||||
['image', 'root_volume'],
|
['image', 'boot_volume'],
|
||||||
|
['boot_from_volume', 'boot_volume'],
|
||||||
|
['nics', 'network'],
|
||||||
|
],
|
||||||
|
required_if=[
|
||||||
|
('boot_from_volume', True, ['volume_size', 'image']),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
module = AnsibleModule(argument_spec, **module_kwargs)
|
module = AnsibleModule(argument_spec, **module_kwargs)
|
||||||
|
|
Loading…
Reference in a new issue