Advertisement
Guest User

Untitled

a guest
Apr 10th, 2017
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.01 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # vim: sw=4 ts=4 et
  3.  
  4. import argparse, atexit, click, datetime, getpass, iptools, jinja2, os, six, ssl, sys, uuid
  5.  
  6. from collections import defaultdict
  7. from six.moves import configparser
  8. from time import time
  9.  
  10. try:
  11. import json
  12. except ImportError:
  13. import simplejson as json
  14.  
  15. class VMWareAddNode(object):
  16.  
  17. __name__ = 'VMWareAddNode'
  18.  
  19. openshift_vers=None
  20. vcenter_host=None
  21. vcenter_username=None
  22. vcenter_password=None
  23. vcenter_template_name=None
  24. vcenter_folder=None
  25. vcenter_cluster=None
  26. vcenter_datacenter=None
  27. vcenter_resource_pool=None
  28. vm_dns=None
  29. vm_gw=None
  30. vm_netmask=None
  31. rhsm_activation_key=None
  32. rhsm_org_id=None
  33. openshift_sdn=None
  34. byo_lb=None
  35. lb_host=None
  36. byo_nfs=None
  37. nfs_registry_host=None
  38. nfs_registry_mountpoint=None
  39. master_nodes=None
  40. infra_nodes=None
  41. app_nodes=None
  42. vm_ipaddr_start=None
  43. ocp_hostname_prefix=None
  44. auth_type=None
  45. ldap_user=None
  46. ldap_user_password=None
  47. ldap_fqdn=None
  48. deployment_type=None
  49. console_port=8443
  50. rhsm_user=None
  51. rhsm_password=None
  52. rhsm_pool=None
  53. public_hosted_zone=None
  54. app_dns_prefix=None
  55. wildcard_zone=None
  56. inventory_file='add-nodes.json'
  57. support_nodes=None
  58. node_type=None
  59. node_number=None
  60. verbose=0
  61.  
  62. def __init__(self, load=True):
  63.  
  64. if load:
  65. self.parse_cli_args()
  66. self.read_ini_settings()
  67. if not os.path.exists(self.inventory_file) or self.args.create_inventory:
  68. self.create_inventory_file()
  69. if os.path.exists(self.inventory_file):
  70. self.launch_refarch_env()
  71.  
  72. def parse_cli_args(self):
  73.  
  74. ''' Command line argument processing '''
  75.  
  76. parser = argparse.ArgumentParser(description='Add new nodes to an existing OCP deployment')
  77. parser.add_argument('--node_type', action='store', default='app', help='Specify the node label')
  78. parser.add_argument('--node_number', action='store', default='1', help='Specify the number of nodes to add')
  79. parser.add_argument('--create_inventory', action='store_true', help='Helper script to create json inventory file and exit')
  80. parser.add_argument('--no_confirm', default=None, help='Skip confirmation prompt')
  81. self.args = parser.parse_args()
  82.  
  83.  
  84. def read_ini_settings(self):
  85.  
  86. ''' Read ini file settings '''
  87.  
  88. scriptbasename = "ocp-on-vmware"
  89. defaults = {'vmware': {
  90. 'ini_path': os.path.join(os.path.dirname(__file__), '%s.ini' % scriptbasename),
  91. 'console_port':'8443',
  92. 'deployment_type':'openshift-enterprise',
  93. 'openshift_vers':'v3_4',
  94. 'vcenter_host':'',
  95. 'vcenter_username':'administrator@vsphere.local',
  96. 'vcenter_password':'',
  97. 'vcenter_template_name':'ocp-server-template-2.0.2',
  98. 'vcenter_folder':'ocp',
  99. 'vcenter_cluster':'devel',
  100. 'vcenter_cluster':'',
  101. 'vcenter_resource_pool':'/Resources/OCP3',
  102. 'public_hosted_zone':'',
  103. 'app_dns_prefix':'apps',
  104. 'vm_dns':'',
  105. 'vm_gw':'',
  106. 'vm_netmask':'',
  107. 'vm_network':'VM Network',
  108. 'rhsm_user':'',
  109. 'rhsm_password':'',
  110. 'rhsm_activation_key':'',
  111. 'rhsm_org_id':'',
  112. 'rhsm_pool':'OpenShift Enterprise, Premium',
  113. 'openshift_sdn':'openshift-ovs-subnet',
  114. 'byo_lb':'no',
  115. 'lb_host':'haproxy-',
  116. 'byo_nfs':'no',
  117. 'nfs_registry_host':'nfs-0',
  118. 'nfs_registry_mountpoint':'/exports',
  119. 'master_nodes':'3',
  120. 'infra_nodes':'2',
  121. 'app_nodes':'3',
  122. 'vm_ipaddr_start':'',
  123. 'ocp_hostname_prefix':'',
  124. 'auth_type':'ldap',
  125. 'ldap_user':'openshift',
  126. 'ldap_user_password':'',
  127. 'node_type': self.args.node_type,
  128. 'node_number':self.args.node_number,
  129. 'ldap_fqdn':'' }
  130. }
  131. if six.PY3:
  132. config = configparser.ConfigParser()
  133. else:
  134. config = configparser.SafeConfigParser()
  135.  
  136. # where is the config?
  137. vmware_ini_path = os.environ.get('VMWARE_INI_PATH', defaults['vmware']['ini_path'])
  138. vmware_ini_path = os.path.expanduser(os.path.expandvars(vmware_ini_path))
  139. config.read(vmware_ini_path)
  140.  
  141. # apply defaults
  142. for k,v in defaults['vmware'].iteritems():
  143. if not config.has_option('vmware', k):
  144. config.set('vmware', k, str(v))
  145.  
  146. self.console_port = config.get('vmware', 'console_port')
  147. self.deployment_type = config.get('vmware','deployment_type')
  148. self.openshift_vers = config.get('vmware','openshift_vers')
  149. self.vcenter_host = config.get('vmware', 'vcenter_host')
  150. self.vcenter_username = config.get('vmware', 'vcenter_username')
  151. self.vcenter_password = config.get('vmware', 'vcenter_password')
  152. self.vcenter_template_name = config.get('vmware', 'vcenter_template_name')
  153. self.vcenter_folder = config.get('vmware', 'vcenter_folder')
  154. self.vcenter_cluster = config.get('vmware', 'vcenter_cluster')
  155. self.vcenter_datacenter = config.get('vmware', 'vcenter_datacenter')
  156. self.vcenter_resource_pool = config.get('vmware', 'vcenter_resource_pool')
  157. self.public_hosted_zone= config.get('vmware', 'public_hosted_zone')
  158. self.app_dns_prefix = config.get('vmware', 'app_dns_prefix')
  159. self.vm_dns = config.get('vmware', 'vm_dns')
  160. self.vm_gw = config.get('vmware', 'vm_gw')
  161. self.vm_netmask = config.get('vmware', 'vm_netmask')
  162. self.rhsm_user = config.get('vmware', 'rhsm_user')
  163. self.rhsm_password = config.get('vmware', 'rhsm_password')
  164. self.rhsm_activation_key = config.get('vmware', 'rhsm_activation_key')
  165. self.rhsm_org_id = config.get('vmware', 'rhsm_org_id')
  166. self.rhsm_pool = config.get('vmware', 'rhsm_pool')
  167. self.openshift_sdn = config.get('vmware', 'openshift_sdn')
  168. self.byo_lb = config.get('vmware', 'byo_lb')
  169. self.lb_host = config.get('vmware', 'lb_host')
  170. self.byo_nfs = config.get('vmware', 'byo_nfs')
  171. self.nfs_registry_host = config.get('vmware', 'nfs_registry_host')
  172. self.nfs_registry_mountpoint = config.get('vmware', 'nfs_registry_mountpoint')
  173. self.master_nodes = config.get('vmware', 'master_nodes')
  174. self.infra_nodes = config.get('vmware', 'infra_nodes')
  175. self.app_nodes = config.get('vmware', 'app_nodes')
  176. self.vm_ipaddr_start = config.get('vmware', 'vm_ipaddr_start')
  177. self.ocp_hostname_prefix = config.get('vmware', 'ocp_hostname_prefix')
  178. self.auth_type = config.get('vmware', 'auth_type')
  179. self.ldap_user = config.get('vmware', 'ldap_user')
  180. self.ldap_user_password = config.get('vmware', 'ldap_user_password')
  181. self.ldap_fqdn = config.get('vmware', 'ldap_fqdn')
  182. self.node_type = config.get('vmware', 'node_type')
  183. self.node_number = config.get('vmware', 'node_number')
  184. err_count=0
  185.  
  186. required_vars = {'public_hosted_zone':self.public_hosted_zone, 'vcenter_host':self.vcenter_host, 'vcenter_password':self.vcenter_password, 'vm_ipaddr_start':self.vm_ipaddr_start, 'ldap_fqdn':self.ldap_fqdn, 'ldap_user_password':self.ldap_user_password, 'vm_dns':self.vm_dns, 'vm_gw':self.vm_gw, 'vm_netmask':self.vm_netmask, 'vcenter_datacenter':self.vcenter_datacenter}
  187. for k, v in required_vars.items():
  188. if v == '':
  189. err_count += 1
  190. print "Missing %s " % k
  191. if err_count > 0:
  192. print "Please fill out the missing variables in %s " % vmware_ini_path
  193. exit (1)
  194. self.wildcard_zone="%s.%s" % (self.app_dns_prefix, self.public_hosted_zone)
  195. self.support_nodes=0
  196.  
  197. print 'Configured inventory values:'
  198. for each_section in config.sections():
  199. for (key, val) in config.items(each_section):
  200. print '\t %s: %s' % ( key, val )
  201. if not self.args.no_confirm:
  202. click.confirm('Continue using these values?', abort=True)
  203. if self.byo_nfs == "no":
  204. self.support_nodes=self.support_nodes+1
  205. if self.byo_lb == "no":
  206. self.support_nodes=self.support_nodes+1
  207.  
  208. def create_inventory_file(self):
  209.  
  210. total_nodes=int(self.master_nodes)+int(self.app_nodes)+int(self.infra_nodes)+int(self.support_nodes)+int(self.node_number)
  211. nodes_remove=int(self.master_nodes)+int(self.app_nodes)+int(self.infra_nodes)+int(self.support_nodes)
  212.  
  213. ip4addr = []
  214. for i in range(total_nodes):
  215. p = iptools.ipv4.ip2long(self.vm_ipaddr_start) + i
  216. ip4addr.append(iptools.ipv4.long2ip(p))
  217.  
  218. unusedip4addr = []
  219. for i in range(0, int(self.node_number)):
  220. unusedip4addr.insert(0, ip4addr.pop())
  221.  
  222. d = {}
  223. d['host_inventory'] = {}
  224. for i in range(0, int(self.node_number)):
  225. #determine node_number increment on the number of nodes
  226. if self.node_type == 'app':
  227. node_ip = int(self.app_nodes) + i
  228. guest_name = self.node_type + '-' + str(node_ip)
  229. if self.node_type == 'infra':
  230. node_ip = int(self.infra_nodes) + i
  231. guest_name = self.node_type + '-' + str(node_ip)
  232. if self.ocp_hostname_prefix:
  233. guest_name = self.ocp_hostname_prefix + guest_name
  234. d['host_inventory'][guest_name] = {}
  235. d['host_inventory'][guest_name]['guestname'] = guest_name
  236. d['host_inventory'][guest_name]['ip4addr'] = unusedip4addr[0]
  237. d['host_inventory'][guest_name]['tag'] = self.node_type
  238. del unusedip4addr[0]
  239. with open(self.inventory_file, 'w') as outfile:
  240. json.dump(d, outfile)
  241.  
  242. def launch_refarch_env(self):
  243.  
  244. if not self.args.no_confirm:
  245. click.confirm('Continue using these values?', abort=True)
  246.  
  247. playbooks = ['playbooks/add-node.yaml']
  248.  
  249. for playbook in playbooks:
  250.  
  251. devnull='> /dev/null'
  252.  
  253. if verbose > 0:
  254. devnull=''
  255.  
  256. # refresh the inventory cache to prevent stale hosts from
  257. # interferring with re-running
  258. command='inventory/vsphere/vms/vmware_inventory.py'
  259. os.system(command)
  260.  
  261. # remove any cached facts to prevent stale data during a re-run
  262. command='rm -rf .ansible/cached_facts'
  263. os.system(command)
  264.  
  265. command='ansible-playbook'
  266. command=command + ' --extra-vars "@./add-nodes.json" add_node=yes -e \'vcenter_host=%s \
  267. vcenter_username=%s \
  268. vcenter_password=%s \
  269. vcenter_template_name=%s \
  270. vcenter_folder=%s \
  271. vcenter_cluster=%s \
  272. vcenter_datacenter=%s \
  273. vcenter_resource_pool=%s \
  274. public_hosted_zone=%s \
  275. app_dns_prefix=%s \
  276. vm_dns=%s \
  277. vm_gw=%s \
  278. vm_netmask=%s \
  279. vm_network=%s \
  280. wildcard_zone=%s \
  281. console_port=%s \
  282. deployment_type=%s \
  283. openshift_vers=%s \
  284. rhsm_user=%s \
  285. rhsm_password=%s \
  286. rhsm_activation_key=%s \
  287. rhsm_org_id=%s \
  288. rhsm_pool="%s" \
  289. openshift_sdn=%s \
  290. lb_host=%s \
  291. nfs_registry_host=%s \
  292. nfs_registry_mountpoint=%s \' %s' % ( self.vcenter_host,
  293. self.vcenter_username,
  294. self.vcenter_password,
  295. self.vcenter_template_name,
  296. self.vcenter_folder,
  297. self.vcenter_cluster,
  298. self.vcenter_datacenter,
  299. self.vcenter_resource_pool,
  300. self.public_hosted_zone,
  301. self.app_dns_prefix,
  302. self.vm_dns,
  303. self.vm_gw,
  304. self.vm_netmask,
  305. self.vm_network,
  306. self.wildcard_zone,
  307. self.console_port,
  308. self.deployment_type,
  309. self.openshift_vers,
  310. self.rhsm_user,
  311. self.rhsm_password,
  312. self.rhsm_activation_key,
  313. self.rhsm_org_id,
  314. self.rhsm_pool,
  315. self.openshift_sdn,
  316. self.lb_host,
  317. self.nfs_registry_host,
  318. self.nfs_registry_mountpoint,
  319. playbook)
  320.  
  321. if verbose > 0:
  322. command += " -" + "".join(['v']*verbose)
  323. click.echo('We are running: %s' % command)
  324.  
  325. status = os.system(command)
  326. if os.WIFEXITED(status) and os.WEXITSTATUS(status) != 0:
  327. return os.WEXITSTATUS(status)
  328.  
  329. if __name__ == '__main__':
  330.  
  331. VMWareAddNode()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement