mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 03:12:30 +00:00 
			
		
		
		
	and not available in python 2.6... switched to using docopt for command line interface argument parsing. This python library is pulled in by the SoftLayer python bindings so it's not an extra step.
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| """
 | |
| Usage: getslnodes.py [-h] [-v] [<hostname-match>]
 | |
| 
 | |
| Description:
 | |
| Query your SoftLayer account and get attributes for each bare metal server.
 | |
| The attributes can be piped to 'mkdef -z' to define the nodes into the xCAT 
 | |
| Database so that xCAT can manage them.  
 | |
| 
 | |
| getslnodes requires a the .softlayer configuration file defined which can
 | |
| be set by running "sl config setup" on the command line. 
 | |
| 
 | |
| positional arguments:
 | |
|   hostname-match  Select servers that include this partial hostname.
 | |
| 
 | |
| Optional:
 | |
|   -h, --help      show this help message and exit
 | |
|   -v, --verbose   display verbose output
 | |
| """
 | |
| 
 | |
| import sys
 | |
| 
 | |
| try:
 | |
|     import docopt
 | |
|     import pprint
 | |
|     import SoftLayer
 | |
| except ImportError as e:
 | |
|     print 'Error: install missing python module before running this command: ' + str(e)
 | |
|     sys.exit(2)
 | |
| 
 | |
| def get_sl_servers(): 
 | |
| 
 | |
|     # username, api_key, endpoint_url come from the .softlayer file
 | |
|     client = SoftLayer.Client()
 | |
| 
 | |
|     mask = "hostname, fullyQualifiedDomainName, manufacturerSerialNumber, \
 | |
|             operatingSystem.id, operatingSystem.passwords.username, operatingSystem.passwords.password, \
 | |
|             remoteManagementAccounts.username, remoteManagementAccounts.password, remoteManagementComponent.ipmiIpAddress, \
 | |
|             primaryBackendNetworkComponent.primaryIpAddress, primaryBackendNetworkComponent.macAddress"
 | |
|     #
 | |
|     # If they specified hnmatch, it would be faster to have softlayer filter the response with something like:
 | |
|     # filter={'hardware': {'hostname': {'operation': '*= '+hostname}, 'domain': {'operation': '*= '+domain}}}
 | |
|     # But those 2 operations are ANDed together, so it will not work.  And currently, filtering does not work on fullyQualifiedDomainName.
 | |
|     #
 | |
|     servers = client['Account'].getHardware(mask=mask)
 | |
|     return servers 
 | |
|    
 | |
| def print_xcat_node_stanza(servers, hnmatch): 
 | |
| 
 | |
|     for server in servers:
 | |
|         if hnmatch and server['fullyQualifiedDomainName'].find(hnmatch) == -1:
 | |
|             continue
 | |
| 
 | |
|         print "\n"+server['hostname']+":"
 | |
|         print "\tobjtype=node"
 | |
|         print "\tgroups=slnode,ipmi,all"
 | |
|         print "\tmgt=ipmi"
 | |
|         print "\tbmc="+server['remoteManagementComponent']['ipmiIpAddress']
 | |
| 
 | |
|         # I have seen svrs with no remoteManagementAccounts entries
 | |
|         if len(server['remoteManagementAccounts']):
 | |
|             print "\tbmcusername="+server['remoteManagementAccounts'][0]['username']
 | |
|             print "\tbmcpassword="+server['remoteManagementAccounts'][0]['password']
 | |
| 
 | |
|         print "\tip="+server['primaryBackendNetworkComponent']['primaryIpAddress']
 | |
|         print "\tmac="+server['primaryBackendNetworkComponent']['macAddress']
 | |
|         print "\tserial="+server['manufacturerSerialNumber']
 | |
|         print "\tnetboot=xnba"
 | |
|         print "\tarch=x86_64"
 | |
| 
 | |
|         # Find the root or Administrator username and pw
 | |
|         username = None
 | |
|         password = None
 | |
|         for entry in server['operatingSystem']['passwords']:
 | |
|             if entry['username'] == 'root' or entry['username'] == 'Administrator':
 | |
|                 # found it
 | |
|                 username = entry['username']
 | |
|                 password = entry['password']
 | |
|                 break
 | |
|             elif not username:
 | |
|                 # save the 1st entry, in case we never find root or Administrator
 | |
|                 username = entry['username']
 | |
|                 password = entry['password']
 | |
| 
 | |
|         if username and password:
 | |
|             userStr = ", user:"+username+", pw:"+password
 | |
| 
 | |
|         print "\tusercomment=hostname:"+server['fullyQualifiedDomainName']+userStr
 | |
| 
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     try:
 | |
|         arguments = (docopt.docopt(__doc__, version="1.0")) 
 | |
|         # print arguments
 | |
| 
 | |
|         servers = get_sl_servers()
 | |
|         if arguments['--verbose']: 
 | |
|             pprint.pprint(servers)
 | |
| 
 | |
|         print_xcat_node_stanza(servers, arguments['<hostname-match>'])
 | |
| 
 | |
|     except docopt.DocoptExit as e:
 | |
|         print e
 | |
|     except SoftLayer.exceptions.SoftLayerAPIError as e:
 | |
|         print e
 | |
| 
 | |
|     sys.exit(1) 
 | |
| 
 | |
| 
 |