# Feature request: rebuild in rax module

**URL:** <https://forum.ansible.com/t/feature-request-rebuild-in-rax-module/17140>\
**Category:** Ansible Developer\
**Created:** [December 24, 2014, 10:54am UTC](https://forum.ansible.com/t/feature-request-rebuild-in-rax-module/17140 "2014-12-24T10:54:02Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Miguel\_David](https://avatars.discourse-cdn.com/v4/letter/m/ce73a5/32.png) [@Miguel\_David](https://forum.ansible.com/u/Miguel_David)\
**Post date:** [December 24, 2014, 10:54am UTC](https://forum.ansible.com/t/feature-request-rebuild-in-rax-module/17140/1 "2014-12-24T10:54:02Z")

</div>

Hi,

Could we possibly add a rebuild function to the rax module (usually at /usr/share/ansible/cloud/rax)?  
In Rackspace if a cloud server is deleted and a new one is created the IP is “lost” (i.e. re-assigned to another random cloud server that will need it), so a rebuild function would be useful.

I believe that pyrax already does this: [Rebuilding an arbitrary server with an SSH Key. · GitHub](https://gist.github.com/rgbkrk/6994544) (found online).

I began drafting the function (untested), but have never developed anything for ansible so I’d like your help/opinion.

—snip—  
def rebuild(module, instance\_ids=, image=None, wait=True, wait\_timeout=300, kept=, rebuild=True):  
cs = pyrax.cloudservers

changed = False  
instances = {}  
servers =

for instance\_id in instance\_ids:  
servers.append(cs.servers.get(instance\_id))

for server in servers:  
try:  
server.rebuild(image=image)  
except Exception, e:  
module.fail\_json(msg=e.message)  
else:  
changed = True

instance = rax\_to\_dict(server, ‘server’)  
instances[instance[‘id’]] = instance

# If requested, wait for server rebuild

if wait:  
end\_time = time.time() + wait\_timeout  
infinite = wait\_timeout == 0  
while infinite or time.time() \< end\_time:  
for server in servers:  
instance\_id = server.id  
try:  
server.get()  
except:  
server.status == ‘ERROR’

if not filter(lambda s: s.status not in (‘’, ‘ERROR’), servers):  
break  
time.sleep(5)

timeout = filter(lambda s: s[‘status’] not in (‘’, ‘ERROR’),  
instances.values())  
error = filter(lambda s: s[‘status’] in (‘ERROR’),  
instances.values())  
success = filter(lambda s: s[‘status’] in (‘’, ‘ACTIVE’),  
instances.values())

instances = [rax\_to\_dict(s, ‘server’) for s in kept]

results = {  
‘changed’: changed,  
‘action’: ‘rebuild’,  
‘instances’: instances,  
‘success’: success,  
‘error’: error,  
‘timeout’: timeout,  
‘instance\_ids’: {  
‘instances’: [i[‘id’] for i in instances],  
‘success’: [i[‘id’] for i in success],  
‘error’: [i[‘id’] for i in error],  
‘timeout’: [i[‘id’] for i in timeout]  
}  
}

if timeout:  
results[‘msg’] = ‘Timeout waiting for all servers to rebuild’  
elif error:  
results[‘msg’] = ‘Failed to rebuild all servers’

if ‘msg’ in results:  
module.fail\_json(\*\*results)  
else:  
module.exit\_json(\*\*results)  
—snip—

Thanks  
Miguel
