def _get_stack_id(stack_name): url = str.format('http://{}/v2-beta/projects/{}/stacks', conf().RANCHER_ADDRESS, conf().PROJECT_ID) res = json_util.un_marshal(request_util.get(url)) services = res.get('data') for service in services: if service.get('name') == stack_name: return service.get('id')
def _distribute_file(ip, source_dir, target_dir): logger.info('开始分发配置文件: ' + ip) # 发送文件 send_cmd = str.format('scp {} -r {} {}@{}:{}', conf().IDENTITY, source_dir, conf().USER_NAME, ip, target_dir) send_del = shell_util.exec_cmd(send_cmd) logger.info('发送: ' + str(send_del))
def delete_service(service_name): url = str.format('http://{}/v2-beta/projects/{}/services', conf().RANCHER_ADDRESS, conf().PROJECT_ID) service_id = _get_service_id(service_name) url = str.format(url + '/{}', service_id) res = request_util.delete(url) logger.info("节点删除中: " + res)
def _delete_file(ip, target_dir): logger.info('开始删除目录: ' + ip) del_str = 'ls' if target_dir and '/home/centos/' in target_dir: del_str = 'rm -rf ' + target_dir # 删除文件 del_cmd = str.format('ssh {} {}@{} sudo {}', conf().IDENTITY, conf().USER_NAME, ip, del_str) res_del = shell_util.exec_cmd(del_cmd) logger.info('删除: ' + str(res_del))
def create_service(service_name, neighbors): url = str.format('http://{}/v2-beta/projects/{}/services', conf().RANCHER_ADDRESS, conf().PROJECT_ID) # 读取配置文件 args_str = file_util.read(conf().RANCHER_TEMPLATE_PATH) # 设置参数 args = _set_docker_config(args_str, service_name, neighbors) logger.info(url) res = request_util.post(url, args) logger.info('节点创建成功: ' + res)
def _set_docker_config(args_str, service_name, neighbors): args = json_util.un_marshal(args_str) peer_dir = os.path.join(conf().NODE_DIR, service_name) args['stackId'] = _get_stack_id(conf().STACK_NAME) args['name'] = service_name args['launchConfig']['hostname'] = service_name args['launchConfig']['dataVolumes'] = [str.format('/root/NFS500/test/{}/config:/tendermint/config', service_name)] args['launchConfig']['imageUuid'] = conf().IMAGE_ID p2p_str = '' if neighbors: p2p_str = '--p2p.persistent_peers=' + neighbors entry_point = ['sh', '-c', str.format('tendermint node {} --proxy_app=persistent_kvstore', p2p_str)] args['launchConfig']['entryPoint'] = entry_point print(args) return args
def _update_genesis(old_name, new_name, genesis): # 节点目录为 数据根目录 加上 节点名称, bak后缀为副本 old_dir = os.path.join(conf().NODE_DIR, old_name + '-bak') new_dir = os.path.join(conf().NODE_DIR, new_name) genesis_path = os.path.join(old_dir, 'config/genesis.json') # 更新genesis.json文件 if isinstance(genesis, str): genesis = json_util.un_marshal(genesis) file_util.write_json(genesis, genesis_path) # 移动本地目录到新目录 file_util.move_dir(old_dir, new_dir) # 分发节点目录 for ip in conf().MACHINE_IPS: _distribute_file(ip, new_dir, new_dir)
def do_delete(service_name): # 删除rancher服务 rancher_service.delete_service(service_name) # 节点目录为 数据根目录 加上 节点名称 peer_dir = os.path.join(conf().NODE_DIR, service_name) data_dir = os.path.join(peer_dir, 'data') # 删除data文件 file_util.remove(data_dir) # 创建data目录并放入 配置文件 file_util.make_dir(data_dir) file_util.copy(conf().VALIDATOR_STATE_PATH, data_dir) # bak后缀为副本 file_util.move_dir(peer_dir, peer_dir + '-bak') # 删除其余所有节点的该目录 for ip in conf().MACHINE_IPS: _delete_file(ip, peer_dir)
'max_age': '100000' }, 'validator': { 'pub_key_types': ['ed25519'] } }, 'validators': [{ 'address': '287CFEDC36CCF61AAA8A6A537BA173F0DF6878E3', 'pub_key': { 'type': 'tendermint/PubKeyEd25519', 'value': '+RWAVtjj5uBSPjbp55nulXAcgxQXInxw9lu7CjrbM7U=' }, 'power': '1000', 'name': 'tm_node1' }], 'app_hash': '' } genesis_str = json_util.marshal(genesis_dict) print(genesis_dict) # do_move(name, p2p_str, genesis_str) peer_source_dir = os.path.join(conf().NODE_DIR, name) # _distribute_file('10.77.70.135', peer_source_dir, '/home/centos/zyj/TTANode1') do_delete('TTANode3') # do_create('TTANode1', 'TTANode2', genesis_dict, p2p_str) # 分发免密凭证 # for count in range(139, 143): # ip = '10.77.70.' + str(count) # _distribute_file(ip, '~/.ssh/id_rsa_768', '/home/centos/.ssh/')
# 创建flask用用实例 def create_app(): app = Flask(__name__) # 注册蓝本 app.register_blueprint(tendermint, url_prefix='/api/tendermint') app.register_blueprint(system, url_prefix='/api/system') app.register_blueprint(rancher, url_prefix='/api/v2/tendermint') return app # 加载环境 def load_env(args): env = 'dev' if len(args) > 1: arg = args[1].split('=') if len(arg) > 1 and arg[0] == '--active' and arg[1] == 'prod': env = arg[1] logger.info('当前环境为: ' + env) config.load_config(env) if __name__ == '__main__': # 加载配置 load_env(sys.argv) # 启动服务 service = create_app() service.run(host=config.conf().HOST, port=config.conf().PORT, threaded=True, debug=config.conf().DEBUG)
def delete_service(service_name): # 删除副本操作 delete_str = "kubectl patch deployment "+service_name+" -p '{\"spec\":{\"replicas\":0}}' -n "+conf().DEPLOYMENT # url = str.format('http://{}/v2-beta/projects/{}/services', conf().RANCHER_ADDRESS, conf().PROJECT_ID) os.system(delete_str) # service_id = _get_service_id(service_name) # url = str.format(url + '/{}', service_id) # res = request_util.delete(url) logger.info("节点删除中 ")
def create_service(service_name, neighbors): create_str = "kubectl patch deployment " + service_name + " -p '{\"spec\":{\"replicas\":1}}' -n " + conf().DEPLOYMENT os.system(create_str) # url = str.format('http://{}/v2-beta/projects/{}/services', conf().RANCHER_ADDRESS, conf().PROJECT_ID) # # 读取配置文件 # args_str = file_util.read(conf().RANCHER_TEMPLATE_PATH) # # # 设置参数 # args = _set_docker_config(args_str, service_name, neighbors) # # logger.info(url) # # res = request_util.post(url, args) logger.info('节点创建成功')