diff --git a/deploy/__init__.py b/deploy/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/deploy/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/deploy/deploy_keys.py b/deploy/deploy_keys.py new file mode 100644 index 0000000..d3e8337 --- /dev/null +++ b/deploy/deploy_keys.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from myops.mmysql import MysqlBase +from myops.mansible import AnsibleAPI +from myops.mylog import define_logger +import logging +import datetime +from config.config import args +import os +import tarfile +import svn + +define_logger("/data/logs/ops/deploy_keys.log") +log = logging.getLogger(__name__) + + +class DeployKeys: + def __init__(self, project): + self.project = project + self.svn_base = "/data/publish/svn" + self.svn_paths = f"{self.svn_base}/{self.project}" + + + def run(self): + svn_path, ipadr = self.get_config() + if svn_path: + key_path = f"{svn_path}/keys" + args = dict() + tar_file = self.build_svn_tar(key_path) + hostfile = self.build_hostfile() + args['hostfile'] = hostfile + args['tar_file'] = tar_file + self.ansible_deploy(args) + + + def get_config(self): + sql = f"""SELECT + config_address, + run_server + FROM + `deploy_projectmanage` + WHERE + project_name="{self.project}" + and env='prod'""" + + mydb = MysqlBase(**args) + data = mydb.query(sql) + ip_addr = list() + if data: + for line in data: + try: + svn_path = line[0] + ip_addr.append(line[1]) + except Exception: + log.error(f"split {self.project} config failed", exc_info=True) + svn_path = None + + return (svn_path, ip_addr) + + + def build_svn_tar(self, svn_path): + try: + log.info("svn export config start") + s = svn.remote.RemoteClient(svn_path) + s.export(self.svn_paths, force=True) + log.info("svn export config success") + except Exception: + log.error(f"get remote {self.project} svn failed", exc_info=True) + else: + log.info("tarfile {0} config to tar.gz start".format(self.project)) + tar = tarfile.open(self.svn_paths + '.tar.gz', 'w:gz') + os.chdir(self.svn_paths) + for f in os.listdir(self.svn_paths): + tar.add(f) + tar.close() + + # 判断是否有生成tar包 + list_dir = os.listdir(self.svn_base) + tar_files = list() + for i in list_dir: + if i == "{0}.tar.gz".format(self.project) and os.path.isfile(os.path.join(self.basedir, i)): + tar_files.append(os.path.join(self.basedir, i)) + if len(tar_files) == 1: + log.info("tarfile {0} config to tar.gz success".format(self.project)) + return tar_files + else: + return None + + + def build_hostfile(self, ip_addr): + now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + host_files = f"/tmp/host_{now}" + with open(host_files, 'w') as f: + for line in ip_addr: + f.writelines(line + '\n') + return host_files + + def ansible_deploy(self, args): + an = AnsibleAPI(args['hostfile']) + data = {'tga': 'x', 'source': 'x', 'project': 'x'} + resule = an.run_playbook('deploy_keys.yml', **args) + if not (resule['failed'] or resule['unreachable']): + log.info(f"deploy keys with {self.p} success!") + else: + log.error(f"{self.p} deploy keys failed,{resule}", exc_info=True) + + +def main(): + dk = DeployKeys() + dk.run() + + +if __name__ == "__main__": + main() diff --git a/deploy/deploy_keys.yml b/deploy/deploy_keys.yml new file mode 100644 index 0000000..081aa22 --- /dev/null +++ b/deploy/deploy_keys.yml @@ -0,0 +1,8 @@ +- hosts: all + tasks: + + - name: rsync deploy file + copy: src={{ source }} dest=/data/apps/{{ dest_filename }} + + - name: decomp file + shell: "cd /data/backups_app/ && mkdir -p {{ tag }} && tar zxvf {{ dest_filename }} -C {{ tag }} && chown -R kingsome. {{ tag }}" \ No newline at end of file diff --git a/web.py b/web.py index eca53dc..54a4635 100644 --- a/web.py +++ b/web.py @@ -13,7 +13,7 @@ from config.config import * import pdb from data_channel.gamelog_external import Build_Gamelog_Config from data_channel.mp2shushu import Mp2shushu - +from deploy.deploy_keys import DeployKeys define_logger("/data/logs/myops/ops_interface.log") log = logging.getLogger(__name__) tornado.options.define("port", default=interface_port, type=int, help="run server on the given port.") @@ -27,13 +27,24 @@ class DispatchHandler(tornado.web.RequestHandler): self._selfgamelogexternal() elif self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'mp2ss': yield self._selfmp2ss() + elif self.get_query_argument('c') == 'Deploy' and self.get_query_argument('a') == 'keys': + yield self._selfdeploykeys() else: self.write("pls check args!") - @gen.coroutine - def post(self): - if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording': - self._selfupJumpRecording() + # @gen.coroutine + # def post(self): + # if self.get_query_argument('c') == 'Ops' and self.get_query_argument('a') == 'upJumpRecording': + # self._selfupJumpRecording() + + def _selfdeploykeys(self): + try: + project = self.get_query_argument('project') + dk = DeployKeys(project) + dk.run() + except Exception: + log.error(f"deploy keys with {project} failed", exc_info=True) + def _selfgamelogexternal(self): try: