查看: 1146|回复: 1

[小脚本] 面包VMware批量开通虚拟机脚本

[复制链接]

440

主题

642

帖子

5080

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5080
发表于 2016-9-7 16:23:26 | 显示全部楼层 |阅读模式
  1. # -*- coding=utf-8 -*-
  2. '''
  3. @Created on 2016年4月6日

  4. @author: MianBao

  5. @author_web: Mianbao.cn.com

  6. @此脚本主要用于批量开通vmware虚拟机
  7. @参数说明
  8. @name:虚拟机名称前缀
  9. @template:虚拟机模板名字 @请确保其唯一性
  10. @node:节点名称
  11. @num:虚拟机开通数量
  12. @network:虚拟机开通之后网卡连接哪个虚拟交换机
  13. '''
  14. import os
  15. import ssl
  16. import sys
  17. import getpass
  18. import readline
  19. import time
  20. import platform
  21. from pysphere import VIServer
  22. from pysphere import MORTypes, VIServer, VITask, VIProperty, VIMor, VIException
  23. from pysphere.resources import VimService_services as VI
  24. from __main__ import time



  25. os.system('clear')

  26. def IS_Windows():
  27.     '''
  28.     @判断运行此脚本的环境是windows还是Linux
  29.     '''
  30.     return True if "Windows" in platform.system() else False
  31.    
  32. def Path(file = None):
  33.     '''
  34.     @获取脚本运行的目录
  35.     '''
  36.     root_path = os.path.abspath(os.path.dirname(__file__))
  37.     return os.path.join(root_path, file) if file else root_path

  38. def Connect(Host,User,Pwd):
  39.     '''
  40.     @用于和VC建立连接
  41.     @Host:VCenter地址
  42.     @User:vCenter用户名
  43.     @Pwd:密码
  44.     '''
  45.     if IS_Windows():
  46.         ssl._create_default_https_context = ssl._create_unverified_context
  47.         
  48.     Server = VIServer()
  49.     try:
  50.         Server.connect(Host, User, Pwd)
  51.     except Exception,e:
  52.         print str(e).split(':')[1]
  53.         return 1
  54.     return Server if Server.is_connected() else  1

  55. def Check_Cluster(Server):
  56.     Cluster = Server.get_clusters()
  57.     return True if len(Cluster) > 0 else False
  58.    
  59. def Find_VM_Node(Server,node):
  60.     '''
  61.     @查找用于开通虚拟机的节点资源ID
  62.     '''
  63.     node_resource_id = None
  64.     print ' |--开始查找节点:%s......' % node
  65.     if Check_Cluster(Server):
  66.         for dc_mor, dc_name in Server.get_datacenters().items():
  67.             print ' |--正在 %s 数据中心中查找 .....' % dc_name
  68.             Cluster_id_dict = dict()
  69.             for c_mor, c_name in Server.get_clusters(from_mor=dc_mor).items():
  70.                 print ' |--正在 %s 数据中心下的 %s 集群中搜索..... ' % (dc_name,c_name)
  71.                 Cluster_id_dict[c_name] = c_mor
  72.                 for h_mor, h_name in Server.get_hosts(from_mor=c_mor).items():
  73.                     if h_name == node:
  74.                         resource = Server.get_resource_pools(c_mor)
  75.                         node_resource_id = resource.keys()[0]
  76.                         print ' |--已搜索到此节点,返回其资源池ID为:%s' % node_resource_id
  77.                         print ' |--正在获取此节点磁盘情况......'
  78.                         host_id = h_mor
  79.                         node_data_id = Get_Node_Disk_Id_List(Server,h_mor,h_name)
  80.         if node_resource_id is None:
  81.             node_resource_id,node_data_id,host_id = Single_Node_search(Server,node)
  82.     else:
  83.         node_resource_id,node_data_id,host_id = Single_Node_search(Server,node)
  84.     return node_resource_id,node_data_id,host_id

  85. def Single_Node_search(Server,ip):
  86.     '''
  87.     @遍历无群集时单节点信息
  88.     '''
  89.     print ' |--检测到数据中心无群集!.....'
  90.     nodes = Server._get_managed_objects("ComputeResource")
  91.     for x,y in nodes.items():   
  92.         if y == ip:
  93.             resource_id = x
  94.     resource_id = Server.get_resource_pools(resource_id).keys()[0]
  95.    
  96.     for m,n in Server.get_hosts().items():
  97.         if n == ip:
  98.             node_data_id = Get_Node_Disk_Id_List(Server,m,n)
  99.             host_id = m
  100.     return resource_id,node_data_id,host_id
  101.         
  102. def Get_Node_Disk_Id_List(server,d_mor,d_name):
  103.     '''
  104.     @获取当前主机的磁盘id
  105.     '''
  106.     p = VIProperty(server, d_mor)
  107.     node_disk_id = list()
  108.     print '\033[0;31m 请选择您要放置虚拟机的磁盘:\033[0m'
  109.     for ds in p.datastore:
  110.         node_disk_id.append(ds._obj)
  111.     i = 1
  112.     dict_id=dict()
  113.     for node_id in node_disk_id:
  114.         Get_Node_Disk_Info(server,node_id,i)
  115.         dict_id['%s' % i] = node_id
  116.         i+=1
  117.     return dict_id

  118. def Get_Node_Disk_Info(server,id,i):
  119.     '''
  120.     @获取节点的硬盘空间
  121.     '''
  122.     for ds_mor, name in server.get_datastores().items():
  123.         props = VIProperty(server, ds_mor)
  124.         if ds_mor == id:
  125.             print '\033[1;32;40m |--%s %s : 总:%s  余:%s \033[0m' % (i,name, unit_convert_start_kb(props.summary.capacity),unit_convert_start_kb(props.summary.freeSpace))
  126.             
  127. def Generate_name(name,vm_num):
  128.     '''
  129.     @生成虚拟机名字
  130.     '''
  131.     name_list = list()
  132.     [ name_list.append(str(name)+str(y)) for y in range(1,int(vm_num)+1) ]
  133.     return name_list
  134.    
  135. def VM_Clone(Server,template_name,name_list,new_vm,network,rs,ip
  136.             ,submit,gw,dns1,dns2):
  137.     '''
  138.     @克隆虚拟机
  139.     '''
  140.     vm = Server.get_vm_by_name(template_name)
  141.     index = 1
  142.     print '\033[1;31;40m'
  143.     for y in name_list:
  144.         new_vm['name'] = y
  145.         print '正在开通第 %s 台,名称为:%s ' % (index,y)
  146.         try:
  147.             print new_vm
  148.             vm.clone(**new_vm)
  149.         except Exception,e:
  150.             print str(e).split(':')[1]
  151.         print '  \--正在配置网络连接.....'
  152.         network_change(Server,y,network)
  153.         if rs:
  154.             
  155.             if index == 1:
  156.                 ip = ip
  157.             else:
  158.                 ip_list = ip.split('.')
  159.                 ip_add = str(int(ip_list[3]) + 1)
  160.                 ip_list.pop(3)
  161.                 ip = '.'.join(ip_list) + '.' + ip_add
  162.                 print '  \---正在配置IP信息:%s .....' % ip
  163.             time.sleep(30)
  164.             customize_vm(Server,y,ip,submit,gw,dns1,dns2)
  165.         index += 1
  166.     print '\033[0m'
  167.    
  168. def unit_convert_start_kb(v1):
  169.     '''
  170.     @主要用于硬盘单位换算
  171.     '''
  172.     v1 = int(v1)
  173.     li = ['bytes','Kb','M','G','T','P']
  174.     a = 0
  175.     while v1 > 1024:
  176.         v1 = v1/1024
  177.         a += 1
  178.     return str(round(v1,2))+str(li[a])

  179. def ListTemplateVm(server):
  180.     '''
  181.     @列出平台上的虚拟机模板
  182.     '''
  183.     try:
  184.         props = server._retrieve_properties_traversal(property_names=['name', 'config.template'],
  185.                                          from_node=None, obj_type=MORTypes.VirtualMachine)
  186.     except Exception,e:
  187.         print e
  188.         sys.exit()
  189.     index = 1
  190.     TemplateList = [0,]
  191.     for p in props:
  192.         name = ""
  193.         is_template = False
  194.         for item in p.PropSet:
  195.             if item.Name == "name":
  196.                 name = item.Val
  197.             elif item.Name == "config.template":
  198.                 is_template = item.Val
  199.         if is_template:
  200.             print "\033[0;36m |--%s. %s \033[0m" % (index, name)
  201.             index+=1
  202.             TemplateList.append(name)
  203.     return TemplateList

  204. def network_type_list():
  205.     net_list = ["VirtualE1000", "VirtualE1000e", "VirtualPCNet32", "VirtualVmxnet", "VirtualVmxnet3"]
  206.     return net_list
  207.    
  208. def network_change(server,vmname,label):
  209.     vm_obj = server.get_vm_by_name(vmname)
  210.     if not vm_obj:
  211.         raise Exception("VM %s not found" % vmname)
  212.     net_device = None
  213.     for dev in vm_obj.properties.config.hardware.device:
  214.         if dev._type in network_type_list():
  215.             net_device = dev._obj
  216.             break
  217.     if not net_device:
  218.         raise Exception("The vm seems to lack a Virtual Nic")
  219.     net_device.Backing.set_element_deviceName(label)
  220.     net_device.get_element_connectable().set_element_connected(True)
  221.     request = VI.ReconfigVM_TaskRequestMsg()
  222.     _this = request.new__this(vm_obj._mor)
  223.     _this.set_attribute_type(vm_obj._mor.get_attribute_type())
  224.     request.set_element__this(_this)
  225.     spec = request.new_spec()
  226.     dev_change = spec.new_deviceChange()
  227.     dev_change.set_element_device(net_device)
  228.     dev_change.set_element_operation("edit")
  229.     spec.set_element_deviceChange([dev_change])
  230.     request.set_element_spec(spec)
  231.     ret = server._proxy.ReconfigVM_Task(request)._returnval
  232.     task = VITask(ret, server)
  233.     status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
  234.     if status == task.STATE_SUCCESS:
  235.         return 0
  236.     elif status == task.STATE_ERROR:
  237.         print "Error reconfiguring vm: %s" % vmname, task.get_error_message()
  238.         return 1

  239. def customize_vm(Server,name,ip,mask,gateway,dns1,dns2):
  240.     vm = Server.get_vm_by_name(name)
  241.     vm.login_in_guest('root', 'howbuy1!')
  242.     BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  243.     print '  \----正在上传自定义文件.....'
  244.     send = vm.send_file(BASE_DIR + '/sc.tar.gz', r'/root/sc.tar.gz', True)
  245.     vm.start_process(r'/bin/tar',['xf','/root/sc.tar.gz'])
  246.     vm.start_process(r'/bin/bash' ,args=["/root/network.sh",ip,mask,gateway,dns1,dns2])
  247.     vm.start_process(r'/bin/bash', ['/root/hostname.sh',name])
  248.     vm.delete_file(r'/root/sc.tar.gz')

  249. def Mains():
  250.     '''
  251.     @主函数,主要用于流程控制
  252.     '''
  253.     new_vm=dict()
  254.    
  255.     print '\033[1;31;40m' + '*='*60
  256.     print '欢迎大家使用面包(Mianbao.cn.com)虚拟机批量开通脚本!'.rjust( 50 )
  257.     print '*='*60+'\033[0m'
  258.    
  259.     VCenter_ip = raw_input('\033[1;32;40m 请输入VCenter地址:\033[0m')
  260.     vCenter_user = raw_input('\033[1;32;40m 请输入vCenter用户名:\033[0m')
  261.     vCenter_pwd = getpass.getpass('\033[1;32;40m 请输入vCenter的密码:\033[0m')
  262.    
  263.     print ' |--开始连接vCenter..... '
  264.     Server = Connect(VCenter_ip,vCenter_user,vCenter_pwd)
  265.     while Server == 1:
  266.         vCenter_pwd = getpass.getpass('\033[1;32;40m 请输入vCenter的密码:\033[0m')
  267.         Server = Connect(VCenter_ip,vCenter_user,vCenter_pwd)
  268.         
  269.     print ' |--已成功连接vCenter.....'
  270.    
  271.     node = raw_input('\033[1;32;40m 要把虚拟机开在哪个服务器上:\033[0m')
  272.    
  273.     new_vm['resourcepool'],node_data_id,new_vm['host'] = Find_VM_Node(Server,node)
  274.    
  275.     node_disk_id = raw_input('\033[1;32;40m 请输入硬盘位置的编号:\033[0m')
  276.     new_vm['datastore'] = node_data_id.get(node_disk_id)
  277.    
  278.     new_vm['sync_run'] = True
  279.    
  280.     name_add = raw_input('\033[1;32;40m 输入虚拟机名称前缀:\033[0m')
  281.     num = raw_input('\033[1;32;40m 请输入要开通的虚拟机数量:\033[0m')
  282.     name_list = Generate_name(name_add,num)
  283.    
  284.     print '\033[0;31m 请选择要使用的模板:\033[0m'
  285.     TemplateList = ListTemplateVm(Server)
  286.     template_num = raw_input('\033[1;32;40m 请输入模板的编号:\033[0m')
  287.    
  288.     network = raw_input('\033[1;32;40m 请输入要连接的虚拟交换机:\033[0m')
  289.    
  290.     rs = raw_input('\033[1;32;40m 是否要进行IP配置及主机名称修改(暂只支持Linux):\033[0m')
  291.     if 'y' in rs or 'Y' in rs:
  292.         
  293.         rs = True        
  294.         ip = raw_input('\033[1;32;40m 请输入起始IP地址:\033[0m')
  295.         
  296.         submit = raw_input('\033[1;32;40m 请输入IP地址的掩码:\033[0m')
  297.         
  298.         gw = raw_input('\033[1;32;40m 请输入网关:\033[0m')
  299.         
  300.         dns1 = raw_input('\033[1;32;40m 请输入DNS1:\033[0m')
  301.         
  302.         dns2 = raw_input('\033[1;32;40m 请输入DNS2:\033[0m')
  303.         
  304.     else:
  305.         rs = False
  306.    
  307.     print new_vm
  308.     VM_Clone(Server,TemplateList[int(template_num)],name_list,new_vm,network,rs,ip
  309.             ,submit,gw,dns1,dns2)
  310.    
  311.     print '\033[0;31m 感谢使用面包(Mianbao.cn.com)VMware虚拟机批量开通脚本!\033[0m'

  312. if __name__ == "__main__":
  313.     Mains()
  314.    
复制代码


选一人白头,择一城终老
回复

使用道具 举报

440

主题

642

帖子

5080

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5080
 楼主| 发表于 2016-9-7 16:24:49 | 显示全部楼层
效果图如下:
2016-09-07_162653.png
选一人白头,择一城终老
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_sctz! !jz_fhlb!
快速回复 返回顶部 返回列表