@ -74,6 +74,7 @@ import sys
import re
import re
import os
import os
import argparse
import argparse
import collections
try :
try :
import json
import json
@ -86,69 +87,123 @@ except ImportError:
print ( ' pyrax required for this module ' )
print ( ' pyrax required for this module ' )
sys . exit ( 1 )
sys . exit ( 1 )
# Setup the parser
parser = argparse . ArgumentParser ( description = ' List active instances ' ,
epilog = ' List by itself will list all the active \
instances . Listing a specific instance will show \
all the details about the instance . ' )
parser . add_argument ( ' --list ' , action = ' store_true ' , default = True ,
def host ( hostname ) :
help = ' List active servers ' )
hostvars = { }
parser . add_argument ( ' --host ' ,
help = ' List details about the specific host (IP address) ' )
args = parser . parse_args ( )
for region in pyrax . regions :
# Connect to the region
cs = pyrax . connect_to_cloudservers ( region = region )
for server in cs . servers . list ( ) :
if server . name == hostname :
keys = [ key for key in vars ( server ) if key not in ( ' manager ' , ' _info ' ) ]
for key in keys :
# Extract value
value = getattr ( server , key )
# setup the auth
# Generate sanitized key
try :
key = ' rax_ ' + ( re . sub ( " [^A-Za-z0-9 \ -] " , " _ " , key )
creds_file = os . environ [ ' RAX_CREDS_FILE ' ]
. lower ( )
region = os . environ [ ' RAX_REGION ' ]
. lstrip ( " _ " ) )
except KeyError , e :
hostvars [ key ] = value
sys . stderr . write ( ' Unable to load %s \n ' % e . message )
sys . exit ( 1 )
pyrax . set_setting ( ' identity_type ' , ' rackspace ' )
# And finally, add an IP address
hostvars [ ' ansible_ssh_host ' ] = server . accessIPv4
print ( json . dumps ( hostvars , sort_keys = True , indent = 4 ) )
try :
pyrax . set_setting ( " identity_type " , " rackspace " )
pyrax . set_credential_file ( os . path . expanduser ( creds_file ) ,
region = region )
except Exception , e :
sys . stderr . write ( " %s : %s \n " % ( e , e . message ) )
sys . exit ( 1 )
# Execute the right stuff
def _list ( region ) :
if not args . host :
groups = collections . defaultdict ( list )
groups = { }
hostvars = collections . defaultdict ( dict )
if region and region . upper ( ) in pyrax . regions :
pyrax . regions = ( region , )
# Go through all the regions looking for servers
for region in pyrax . regions :
# Connect to the region
cs = pyrax . connect_to_cloudservers ( region = region )
for server in cs . servers . list ( ) :
# Create a group on region
groups [ region ] . append ( server . name )
# Cycle on servers
# Anything we can discern from the hostname?
for server in pyrax . cloudservers . list ( ) :
try :
# Define group (or set to empty string)
subdom = server . name . split ( ' . ' ) [ 0 ]
except IndexError :
pass
else :
for name in ( ' web ' , ' db ' , ' sql ' , ' lb ' , ' app ' ) :
if name in subdom :
groups [ name ] . append ( server . name )
# Check if group metadata key in servers' metadata
try :
try :
group = server . metadata [ ' group ' ]
group = server . metadata [ ' group ' ]
except KeyError :
except KeyError :
group = ' undefined '
pass
else :
# Create group if not exist and add the server
# Create group if not exist and add the server
groups . setdefault ( group , [ ] ) . append ( server . accessIPv4 )
groups [ group ] . append ( server . name )
# Return server list
# Add host metadata
print ( json . dumps ( groups ) )
keys = [ key for key in vars ( server ) if key not in ( ' manager ' , ' _info ' ) ]
sys . exit ( 0 )
for key in keys :
# Get the deets for the instance asked for
results = { }
# This should be only one, but loop anyway
for server in pyrax . cloudservers . list ( ) :
if server . accessIPv4 == args . host :
for key in [ key for key in vars ( server ) if
key not in ( ' manager ' , ' _info ' ) ] :
# Extract value
# Extract value
value = getattr ( server , key )
value = getattr ( server , key )
# Generate sanitized key
# Generate sanitized key
key = ' rax_ ' + re . sub ( " [^A-Za-z0-9 \ -] " , " _ " , key ) . lower ( )
key = ' rax_ ' + ( re . sub ( " [^A-Za-z0-9 \ -] " , " _ " , key )
results [ key ] = value
. lower ( )
. lstrip ( ' _ ' ) )
hostvars [ server . name ] [ key ] = value
# And finally, add an IP address
hostvars [ server . name ] [ ' ansible_ssh_host ' ] = server . accessIPv4
if hostvars :
groups [ ' _meta ' ] = { ' hostvars ' : hostvars }
print ( json . dumps ( groups , sort_keys = True , indent = 4 ) )
def parse_args ( ) :
parser = argparse . ArgumentParser ( description = ' Ansible Rackspace Cloud '
' inventory module ' )
group = parser . add_mutually_exclusive_group ( required = True )
group . add_argument ( ' --list ' , action = ' store_true ' ,
help = ' List active servers ' )
group . add_argument ( ' --host ' , help = ' List details about the specific host ' )
return parser . parse_args ( )
def setup ( ) :
try :
creds_file = os . environ [ ' RAX_CREDS_FILE ' ]
region = os . getenv ( ' RAX_REGION ' )
except KeyError , e :
sys . stderr . write ( ' Unable to load environment '
' variable %s \n ' % e . message )
sys . exit ( 1 )
pyrax . set_setting ( ' identity_type ' , ' rackspace ' )
try :
pyrax . set_credential_file ( os . path . expanduser ( creds_file ) )
except Exception , e :
sys . stderr . write ( " %s : %s \n " % ( e , e . message ) )
sys . exit ( 1 )
return region
def main ( ) :
args = parse_args ( )
region = setup ( )
if args . list :
_list ( region )
elif args . host :
host ( args . host )
sys . exit ( 0 )
print ( json . dumps ( results ) )
if __name__ == ' __main__ ' :
sys . exit ( 0 )
main ( )