Advertisement
Guest User

Untitled

a guest
Apr 10th, 2017
529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.99 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # vim: sw=4 ts=4 et
  3.  
  4. import argparse
  5. import atexit
  6. import datetime
  7. import getpass
  8. import iptools
  9. import jinja2
  10. import os
  11. import six
  12. import ssl
  13. import sys
  14. import uuid
  15.  
  16. from collections import defaultdict
  17. from six.moves import configparser
  18. from time import time
  19.  
  20. try:
  21. import json
  22. except ImportError:
  23. import simplejson as json
  24.  
  25. class VMWareAddNode(object):
  26.  
  27. __name__ = 'VMWareAddNode'
  28.  
  29. openshift_vers=None
  30. vcenter_host=None
  31. vcenter_username=None
  32. vcenter_password=None
  33. vcenter_template_name=None
  34. vcenter_folder=None
  35. vcenter_cluster=None
  36. vcenter_datacenter=None
  37. vcenter_resource_pool=None
  38. vm_dns=None
  39. vm_gw=None
  40. vm_netmask=None
  41. rhsm_activation_key=None
  42. rhsm_org_id=None
  43. openshift_sdn=None
  44. byo_lb=None
  45. lb_host=None
  46. byo_nfs=None
  47. nfs_registry_host=None
  48. nfs_registry_mountpoint=None
  49. master_nodes=None
  50. infra_nodes=None
  51. app_nodes=None
  52. vm_ipaddr_start=None
  53. ocp_hostname_prefix=None
  54. auth_type=None
  55. ldap_user=None
  56. ldap_user_password=None
  57. ldap_fqdn=None
  58. deployment_type=None
  59. console_port=8443
  60. rhsm_user=None
  61. rhsm_password=None
  62. rhsm_pool=None
  63. public_hosted_zone=None
  64. app_dns_prefix=None
  65. wildcard_zone=None
  66. inventory_file='add-nodes.json'
  67. support_nodes=None
  68. node_type=None
  69. node_number=None
  70. verbose=0
  71.  
  72. def __init__(self, load=True):
  73.  
  74. if load:
  75. self.parse_cli_args()
  76. self.read_ini_settings()
  77. self.create_inventory_file()
  78. if not self.inventory_file:
  79. self.create_inventory_file()
  80.  
  81.  
  82. #if create_ocp_vars:
  83. # self.create_ocp_vars()
  84. def parse_cli_args(self):
  85.  
  86. ''' Command line argument processing '''
  87.  
  88. parser = argparse.ArgumentParser(description='Add new nodes to an existing OCP deployment')
  89. parser.add_argument('--node_type', action='store', default='app', help='Specify the node label')
  90. parser.add_argument('--node_number', action='store', default='1', help='Specify the number of nodes to add')
  91. parser.add_argument('--create_inventory', action='store_true', help='Helper script to create json inventory file and exit')
  92. parser.add_argument('--create_ocp_vars', action='store_true', help='Helper script to modify OpenShift ansible install variables and exit')
  93. parser.add_argument('--no_confirm', default=None, help='Skip confirmation prompt')
  94. self.args = parser.parse_args()
  95.  
  96.  
  97. def read_ini_settings(self):
  98.  
  99. ''' Read ini file settings '''
  100.  
  101. scriptbasename = "ocp-on-vmware"
  102. defaults = {'vmware': {
  103. 'ini_path': os.path.join(os.path.dirname(__file__), '%s.ini' % scriptbasename),
  104. 'console_port':'8443',
  105. 'deployment_type':'openshift-enterprise',
  106. 'openshift_vers':'v3_4',
  107. 'vcenter_host':'',
  108. 'vcenter_username':'administrator@vsphere.local',
  109. 'vcenter_password':'',
  110. 'vcenter_template_name':'ocp-server-template-2.0.2',
  111. 'vcenter_folder':'ocp',
  112. 'vcenter_cluster':'devel',
  113. 'vcenter_cluster':'',
  114. 'vcenter_resource_pool':'/Resources/OCP3',
  115. 'public_hosted_zone':'',
  116. 'app_dns_prefix':'apps',
  117. 'vm_dns':'',
  118. 'vm_gw':'',
  119. 'vm_netmask':'',
  120. 'vm_network':'VM Network',
  121. 'rhsm_user':'',
  122. 'rhsm_password':'',
  123. 'rhsm_activation_key':'',
  124. 'rhsm_org_id':'',
  125. 'rhsm_pool':'OpenShift Enterprise, Premium',
  126. 'openshift_sdn':'openshift-ovs-subnet',
  127. 'byo_lb':'no',
  128. 'lb_host':'haproxy-',
  129. 'byo_nfs':'no',
  130. 'nfs_registry_host':'nfs-0',
  131. 'nfs_registry_mountpoint':'/exports',
  132. 'master_nodes':'3',
  133. 'infra_nodes':'2',
  134. 'app_nodes':'3',
  135. 'vm_ipaddr_start':'',
  136. 'ocp_hostname_prefix':'',
  137. 'auth_type':'ldap',
  138. 'ldap_user':'openshift',
  139. 'ldap_user_password':'',
  140. 'node_type': self.args.node_type,
  141. 'node_number':self.args.node_number,
  142. 'ldap_fqdn':'' }
  143. }
  144. if six.PY3:
  145. config = configparser.ConfigParser()
  146. else:
  147. config = configparser.SafeConfigParser()
  148.  
  149. # where is the config?
  150. vmware_ini_path = os.environ.get('VMWARE_INI_PATH', defaults['vmware']['ini_path'])
  151. vmware_ini_path = os.path.expanduser(os.path.expandvars(vmware_ini_path))
  152. config.read(vmware_ini_path)
  153.  
  154. # apply defaults
  155. for k,v in defaults['vmware'].iteritems():
  156. if not config.has_option('vmware', k):
  157. config.set('vmware', k, str(v))
  158.  
  159. self.console_port = config.get('vmware', 'console_port')
  160. self.deployment_type = config.get('vmware','deployment_type')
  161. self.openshift_vers = config.get('vmware','openshift_vers')
  162. self.vcenter_host = config.get('vmware', 'vcenter_host')
  163. self.vcenter_username = config.get('vmware', 'vcenter_username')
  164. self.vcenter_password = config.get('vmware', 'vcenter_password')
  165. self.vcenter_template_name = config.get('vmware', 'vcenter_template_name')
  166. self.vcenter_folder = config.get('vmware', 'vcenter_folder')
  167. self.vcenter_cluster = config.get('vmware', 'vcenter_cluster')
  168. self.vcenter_datacenter = config.get('vmware', 'vcenter_datacenter')
  169. self.vcenter_resource_pool = config.get('vmware', 'vcenter_resource_pool')
  170. self.public_hosted_zone= config.get('vmware', 'public_hosted_zone')
  171. self.app_dns_prefix = config.get('vmware', 'app_dns_prefix')
  172. self.vm_dns = config.get('vmware', 'vm_dns')
  173. self.vm_gw = config.get('vmware', 'vm_gw')
  174. self.vm_netmask = config.get('vmware', 'vm_netmask')
  175. self.rhsm_user = config.get('vmware', 'rhsm_user')
  176. self.rhsm_password = config.get('vmware', 'rhsm_password')
  177. self.rhsm_activation_key = config.get('vmware', 'rhsm_activation_key')
  178. self.rhsm_org_id = config.get('vmware', 'rhsm_org_id')
  179. self.rhsm_pool = config.get('vmware', 'rhsm_pool')
  180. self.openshift_sdn = config.get('vmware', 'openshift_sdn')
  181. self.byo_lb = config.get('vmware', 'byo_lb')
  182. self.lb_host = config.get('vmware', 'lb_host')
  183. self.byo_nfs = config.get('vmware', 'byo_nfs')
  184. self.nfs_registry_host = config.get('vmware', 'nfs_registry_host')
  185. self.nfs_registry_mountpoint = config.get('vmware', 'nfs_registry_mountpoint')
  186. self.master_nodes = config.get('vmware', 'master_nodes')
  187. self.infra_nodes = config.get('vmware', 'infra_nodes')
  188. self.app_nodes = config.get('vmware', 'app_nodes')
  189. self.vm_ipaddr_start = config.get('vmware', 'vm_ipaddr_start')
  190. self.ocp_hostname_prefix = config.get('vmware', 'ocp_hostname_prefix')
  191. self.auth_type = config.get('vmware', 'auth_type')
  192. self.ldap_user = config.get('vmware', 'ldap_user')
  193. self.ldap_user_password = config.get('vmware', 'ldap_user_password')
  194. self.ldap_fqdn = config.get('vmware', 'ldap_fqdn')
  195. self.node_type = config.get('vmware', 'node_type')
  196. self.node_number = config.get('vmware', 'node_number')
  197. err_count=0
  198. 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}
  199. for k, v in required_vars.items():
  200. if v == '':
  201. err_count += 1
  202. print "Missing %s " % k
  203. if err_count > 0:
  204. print "Please fill out the missing variables in %s " % vmware_ini_path
  205. exit (1)
  206. self.wildcard_zone="%s.%s" % (self.app_dns_prefix, self.public_hosted_zone)
  207. self.support_nodes=0
  208.  
  209. print 'Configured inventory values:'
  210. for each_section in config.sections():
  211. for (key, val) in config.items(each_section):
  212. print '\t %s: %s' % ( key, val )
  213. if self.byo_nfs == "no":
  214. self.support_nodes=self.support_nodes+1
  215. if self.byo_lb == "no":
  216. self.support_nodes=self.support_nodes+1
  217.  
  218. def create_inventory_file(self):
  219.  
  220. total_nodes=int(self.master_nodes)+int(self.app_nodes)+int(self.infra_nodes)+int(self.support_nodes)+int(self.args.node_number)
  221. nodes_remove=int(self.master_nodes)+int(self.app_nodes)+int(self.infra_nodes)+int(self.support_nodes)
  222.  
  223. ip4addr = []
  224. for i in range(total_nodes):
  225. p = iptools.ipv4.ip2long(self.vm_ipaddr_start) + i
  226. ip4addr.append(iptools.ipv4.long2ip(p))
  227.  
  228. unusedip4addr = []
  229. for i in range(0, int(self.args.node_number)):
  230. unusedip4addr.insert(0, ip4addr.pop())
  231.  
  232. d = {}
  233. d['host_inventory'] = {}
  234. for i in range(0, int(self.args.node_number)):
  235. #determine node_number increment on the number of nodes
  236. if self.args.node_type == 'app':
  237. node_ip = int(self.app_nodes) + i
  238. guest_name = self.args.node_type + '-' + str(node_ip)
  239. if self.args.node_type == 'infra':
  240. node_ip = int(self.infra_nodes) + i
  241. guest_name = self.args.node_type + '-' + str(node_ip)
  242. if self.ocp_hostname_prefix:
  243. guest_name = self.ocp_hostname_prefix + guest_name
  244. d['host_inventory'][guest_name] = {}
  245. d['host_inventory'][guest_name]['guestname'] = guest_name
  246. d['host_inventory'][guest_name]['ip4addr'] = unusedip4addr[0]
  247. d['host_inventory'][guest_name]['tag'] = self.args.node_type
  248. del unusedip4addr[0]
  249. with open(self.inventory_file, 'w') as outfile:
  250. json.dump(d, outfile)
  251.  
  252.  
  253. def create_ocp_vars(self):
  254. print "hello"
  255.  
  256. def launch_refarch_env(region=None,
  257. ami=None,
  258. no_confirm=False,
  259. node_instance_type=None,
  260. keypair=None,
  261. subnet_id=None,
  262. node_sg=None,
  263. infra_sg=None,
  264. public_hosted_zone=None,
  265. app_dns_prefix=None,
  266. shortname=None,
  267. fqdn=None,
  268. deployment_type=None,
  269. console_port=443,
  270. rhsm_user=None,
  271. rhsm_password=None,
  272. rhsm_pool=None,
  273. containerized=None,
  274. node_type=None,
  275. iam_role=None,
  276. infra_elb_name=None,
  277. existing_stack=None,
  278. verbose=0):
  279.  
  280. # Need to prompt for the R53 zone:
  281. if public_hosted_zone is None:
  282. public_hosted_zone = click.prompt('Hosted DNS zone for accessing the environment')
  283.  
  284. if iam_role is None:
  285. iam_role = click.prompt('Specify the name of the existing IAM Instance Profile')
  286.  
  287. if node_sg is None:
  288. node_sg = click.prompt('Node Security group')
  289.  
  290. if node_type in 'infra' and infra_sg is None:
  291. infra_sg = click.prompt('Infra Node Security group')
  292.  
  293. if shortname is None:
  294. shortname = click.prompt('Hostname of newly created system')
  295.  
  296. if existing_stack is None:
  297. existing_stack = click.prompt('Specify the name of the existing CloudFormation stack')
  298.  
  299. # If no keypair is specified fail:
  300. if keypair is None:
  301. keypair = click.prompt('A SSH keypair must be specified or created')
  302.  
  303. # If no subnets are defined prompt:
  304. if subnet_id is None:
  305. subnet_id = click.prompt('Specify a Private subnet within the existing VPC')
  306.  
  307. # If the user already provided values, don't bother asking again
  308. if deployment_type in ['openshift-enterprise'] and rhsm_user is None:
  309. rhsm_user = click.prompt("RHSM username?")
  310.  
  311. if deployment_type in ['openshift-enterprise'] and rhsm_password is None:
  312. rhsm_password = click.prompt("RHSM password?", hide_input=True)
  313.  
  314. if deployment_type in ['openshift-enterprise'] and rhsm_pool is None:
  315. rhsm_pool = click.prompt("RHSM Pool ID or Subscription Name?")
  316.  
  317. # Calculate various DNS values
  318. wildcard_zone="%s.%s" % (app_dns_prefix, public_hosted_zone)
  319.  
  320. # Calculate various DNS values
  321. fqdn="%s.%s" % (shortname, public_hosted_zone)
  322.  
  323. # Ask for ELB if new node is infra
  324. if node_type in 'infra' and infra_elb_name is None:
  325. infra_elb_name = click.prompt("Specify the ELB Name used by the router and registry?")
  326.  
  327. # Hidden facts for infrastructure.yaml
  328. create_key = "no"
  329. create_vpc = "no"
  330. add_node = "yes"
  331.  
  332. # Display information to the user about their choices
  333. click.echo('Configured values:')
  334. click.echo('\tami: %s' % ami)
  335. click.echo('\tregion: %s' % region)
  336. click.echo('\tnode_instance_type: %s' % node_instance_type)
  337. click.echo('\tkeypair: %s' % keypair)
  338. click.echo('\tsubnet_id: %s' % subnet_id)
  339. click.echo('\tnode_sg: %s' % node_sg)
  340. click.echo('\tinfra_sg: %s' % infra_sg)
  341. click.echo('\tconsole port: %s' % console_port)
  342. click.echo('\tdeployment_type: %s' % deployment_type)
  343. click.echo('\tpublic_hosted_zone: %s' % public_hosted_zone)
  344. click.echo('\tapp_dns_prefix: %s' % app_dns_prefix)
  345. click.echo('\tapps_dns: %s' % wildcard_zone)
  346. click.echo('\tshortname: %s' % shortname)
  347. click.echo('\tfqdn: %s' % fqdn)
  348. click.echo('\trhsm_user: %s' % rhsm_user)
  349. click.echo('\trhsm_password: *******')
  350. click.echo('\trhsm_pool: %s' % rhsm_pool)
  351. click.echo('\tcontainerized: %s' % containerized)
  352. click.echo('\tnode_type: %s' % node_type)
  353. click.echo('\tiam_role: %s' % iam_role)
  354. click.echo('\tinfra_elb_name: %s' % infra_elb_name)
  355. click.echo('\texisting_stack: %s' % existing_stack)
  356. click.echo("")
  357.  
  358. if not no_confirm:
  359. click.confirm('Continue using these values?', abort=True)
  360.  
  361. playbooks = ['playbooks/infrastructure.yaml', 'playbooks/add-node.yaml']
  362.  
  363. for playbook in playbooks:
  364.  
  365. # hide cache output unless in verbose mode
  366. devnull='> /dev/null'
  367.  
  368. if verbose > 0:
  369. devnull=''
  370.  
  371. # refresh the inventory cache to prevent stale hosts from
  372. # interferring with re-running
  373. command='inventory/aws/hosts/ec2.py --refresh-cache %s' % (devnull)
  374. os.system(command)
  375.  
  376. # remove any cached facts to prevent stale data during a re-run
  377. command='rm -rf .ansible/cached_facts'
  378. os.system(command)
  379.  
  380. command='ansible-playbook -i inventory/aws/hosts -e \'region=%s \
  381. ami=%s \
  382. keypair=%s \
  383. add_node=yes \
  384. subnet_id=%s \
  385. node_sg=%s \
  386. infra_sg=%s \
  387. node_instance_type=%s \
  388. public_hosted_zone=%s \
  389. wildcard_zone=%s \
  390. shortname=%s \
  391. fqdn=%s \
  392. console_port=%s \
  393. deployment_type=%s \
  394. rhsm_user=%s \
  395. rhsm_password=%s \
  396. rhsm_pool=%s \
  397. containerized=%s \
  398. node_type=%s \
  399. iam_role=%s \
  400. key_path=/dev/null \
  401. infra_elb_name=%s \
  402. create_key=%s \
  403. create_vpc=%s \
  404. stack_name=%s \' %s' % (region,
  405. ami,
  406. keypair,
  407. subnet_id,
  408. node_sg,
  409. infra_sg,
  410. node_instance_type,
  411. public_hosted_zone,
  412. wildcard_zone,
  413. shortname,
  414. fqdn,
  415. console_port,
  416. deployment_type,
  417. rhsm_user,
  418. rhsm_password,
  419. rhsm_pool,
  420. containerized,
  421. node_type,
  422. iam_role,
  423. infra_elb_name,
  424. create_key,
  425. create_vpc,
  426. existing_stack,
  427. playbook)
  428.  
  429. if verbose > 0:
  430. command += " -" + "".join(['v']*verbose)
  431. click.echo('We are running: %s' % command)
  432.  
  433. status = os.system(command)
  434. if os.WIFEXITED(status) and os.WEXITSTATUS(status) != 0:
  435. return os.WEXITSTATUS(status)
  436.  
  437. if __name__ == '__main__':
  438. # check for AWS access info
  439. VMWareAddNode()
  440. #VMWareAddNode().launch_refarch_env(auto_envvar_prefix='OSE_REFArch')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement