def single(install_list): """ 单台机器安装. """ idc = install_list["idc"] sn = install_list["sn"] _type = install_list["type"] version = install_list["version"] usage = install_list["usage"] product = install_list["product"] cabinet = install_list["cabinet"] user_data = install_list["user_data"] message = "start to install %s." % sn logger.info(message) # 安装系统进入 redis. client.hset(sn, "idc", idc) client.hset(sn, "usage", usage) client.hset(sn, "hostname", "") client.hset(sn, "ip", "") message = "set %s's idc, usage, hostname, ip to redis success" % sn logger.info(message) # 设置 user_data, 装机之后机器会获取并执行 user_data 中的内容. if user_data is None: client_user_data.exists(sn) and client_user_data.delete(sn) else: client_user_data.set(sn, user_data) # 循环等待安装完成. timeout = 2700 interval = 30 timetotal = 0 installed = False inasset = False while timetotal < timeout: if not installed: hostname = client.hget(sn, "hostname") ip = client.hget(sn, "ip") if "" in [hostname, ip]: time.sleep(interval) timetotal += interval else: installed = True elif installed and not inasset: try: ret = server.get("sn", sn) if not isinstance(ret, dict): time.sleep(interval) timetotal += interval elif "hostname" not in ret: time.sleep(interval) timetotal += interval elif ret["hostname"] != hostname: time.sleep(interval) timetotal += interval else: inasset = True except Exception, e: message = traceback.format_exc() logger.error(message) time.sleep(interval) timetotal += interval else: break
def single(install_list): """ 单台机器安装. """ idc = install_list["idc"] sn = install_list["sn"] _type = install_list["type"] version = install_list["version"] usage = install_list["usage"] device = install_list["device"] product = install_list["product"] cabinet = install_list["cabinet"] user_data = install_list["user_data"] message = "start to install %s." % sn logger.info(message) # 查询控制卡 ip. ip = ilo_info.ip(idc, sn) if not ip or not utils.is_valid_ip(ip): result = "failed" message = "get ilo ip failed" install_list["result"] = result install_list["message"] = message return install_list message = "get %s ilo ip: %s" % (sn, ip) logger.info(message) # 拿到密码. passwd = ilo_info.passwd(idc, ip, sn) if not passwd: result = "failed" message = "get ilo passwd failed" install_list["result"] = result install_list["message"] = message return install_list passwd = passwd.strip() message = "get %s ilo passwd: %s" % (sn, passwd) logger.info(message) # 获取 ilo 对象. oj = ilo_oper.generate(idc, ip, passwd) message = "get %s ilo object" % (sn) logger.info(message) # 检查 SN 是否一致. curr_sn = oj.get_sn() if sn != curr_sn: result = "failed" message = "check sn failed" install_list["result"] = result install_list["message"] = message return install_list message = "check %s sn consistency success" % (sn) logger.info(message) # 查询网卡名称. nic = oj.get_nic_name(device) if not nic: logger.error("cann't get nic name") result = "failed" message = "cann't get nic name" install_list["result"] = result install_list["message"] = message return install_list message = "get %s nic name: %s" % (sn, nic) logger.info(message) # 设置网卡支持 PXE 启动. if not oj.get_nic_pxeboot(nic): if not oj.setup_nic_pxeboot(nic): result = "failed" message = "setup network device to support pxe boot failed" install_list["result"] = result install_list["message"] = message return install_list message = "set %s nic pxe boot success" % sn logger.info(message) # 设置启动顺序. nic_seq = oj.get_boot_order(nic) if not oj.check_boot_order(nic_seq): if not oj.setup_boot_order(nic_seq): result = "failed" message = "can't setup right bootseq - %s" % nic_seq install_list["result"] = result install_list["message"] = message return install_list message = "set %s nic support pxe boot success" % sn logger.info(message) # 设置机器从 PXE 启动一次. if not oj.setup_pxeboot_once(): result = "failed" message = "setup pxe once boot failed" install_list["result"] = result install_list["message"] = message return install_list message = "set %s nic pxe boot once success" % sn logger.info(message) # 拷贝 pxelinux 配置文件. mac = oj.get_mac(nic) if not oj.constract_tftp(_type, version, mac): result = "failed" message = "copy pxelinux cfg failed" install_list["result"] = result install_list["message"] = message return install_list message = "copy %s pxelinux cfg success" % sn logger.info(message) # 重启. if not oj.reboot(): result = "failed" message = "restart server failed" install_list["result"] = result install_list["message"] = message return install_list message = "reboot %s success" % sn logger.info(message) # 安装信息进 redis. client.hset(sn, "idc", idc) client.hset(sn, "usage", usage) client.hset(sn, "hostname", "") client.hset(sn, "ip", "") message = "set %s's idc, usage, hostname, ip to redis success" % sn logger.info(message) # 设置 user_data, 装机之后机器会获取并执行 user_data 中的内容. if user_data is None: client_user_data.exists(sn) and client_user_data.delete(sn) else: client_user_data.set(sn, user_data) # 循环等待安装完成. timeout = 2700 interval = 30 timetotal = 0 installed = False inasset = False while timetotal < timeout: if not installed: hostname = client.hget(sn, "hostname") ip = client.hget(sn, "ip") if "" in [hostname, ip]: time.sleep(interval) timetotal += interval else: installed = True elif installed and not inasset: try: ret = server.get("sn", sn) if not isinstance(ret, dict): time.sleep(interval) timetotal += interval elif "hostname" not in ret: time.sleep(interval) timetotal += interval elif ret["hostname"] != hostname: time.sleep(interval) timetotal += interval else: inasset = True except Exception, e: message = traceback.format_exc() logger.error(message) time.sleep(interval) timetotal += interval else: break
def post(self): """ 安装物理机. 步骤包括: 1). 根据 SN 获取到 ILO IP. 2). 获取到 ILO 的密码. 3). 设置第二块网卡支持 PXE 启动. 4). 设置系统启动顺序. 5). 设置系统 PXE 启动一次. 6). 拷贝 pxelinux 配置文件. 7). 重启. 8). 等待安装完成. 9). 删除 pxelinux 配置文件. 10). 在资产系统里设置 product 和 cabinet 等. type 表示支持安装的物理机类型, 目前支持三种, 分别是: raw, kvm, docker; version 表示支持的操作系统版本, 目前有: centos6, centos7 """ idc = _get_argument_json(self, "idc", False, loads=True) _type = _get_argument_json(self, "type", False, loads=True) version = _get_argument_json(self, "version", True, "centos6", loads=True) usage = _get_argument_json(self, "usage", False, loads=True) product = _get_argument_json(self, "product", False, loads=True) device = _get_argument_json(self, "device", False, loads=True) force = _get_argument_json(self, "force", True, False, loads=True) sns = _get_argument_json(self, "sns", False, loads=True) user_data = _get_argument_json(self, "user_data", True, None, loads=True) email = _get_argument_json(self, "email", True, None, loads=True) install_lists = list() for i in sns: item = { "idc": idc, "type": _type, "version": version, "usage": usage, "product": product, "device": device, "sn": i["sn"], "cabinet": i["cabinet"], "user_data": user_data } install_lists.append(item) # 是否强制安装. inasset_lists = list() if force != True: for item in install_lists: sn = item["sn"] if server.get("sn", sn, "hostname"): inasset_lists.append(sn) if inasset_lists != []: message = "servers have in asset, can't install:{0}".format( inasset_lists) ret = { "status": "failed", "message": message } self.write(json.dumps(ret)) self.finish() # 生成创建任务 id. task_key = "physical:create" task_id = "%s:%s" % (task_key, global_id.get()) queue_dict = { "install_lists": install_lists, "task_id": task_id, "email": email } redis_client_pm.lpush("queue:create", queue_dict) _url = "%s/%s" % (PM_TASK_BASE_URL, task_id) ret = { "status": "creating", "message": _url } self.write(json.dumps(ret))