# -*- coding: utf-8 -*- # python3 deploy_keys.py cloud_php # python3 deploy_keys.py loginserver_php from ops.mmysql import MysqlBase from ops.mansible import AnsibleAPI from ops.mlog import define_logger from ops.common import run_cmd import logging import datetime import os import tarfile import svn import shutil import pdb define_logger("/data/logs/ops/deploy_keys.log") log = logging.getLogger(__name__) dbargs = dict() dbargs['host'] = '10.10.3.5' dbargs['user'] = 'ops' dbargs['pswd'] = 'deploy2018' dbargs['db'] = 'ywplatform' class DeployKeys: def __init__(self, project): self.env='prod' self.project = project self.svn_base = f"/data/publish/svn/{self.env}" self.svn_paths = f"{self.svn_base}/{self.project}" def run(self): if not os.path.isdir(self.svn_paths): self.svn_paths = f"/data/publish/svn/{self.env}/global/{self.project}" svn_path, ipadr = self.get_config() if ipadr: args = dict() tar_file = self.build_svn_tar() if tar_file: hostfile = self.build_hostfile(ipadr) args['hostfile'] = hostfile args['tar_file'] = tar_file[0] self.ansible_deploy(args) else: log.error(f"tar file no found with {self.project}") else: raise Exception(f"{self.project} config not found in manager table!") def get_config(self): sql = f"""SELECT config_address, run_server FROM `deploy_projectmanage` WHERE project_name="{self.project}" and env='{self.env}'""" mydb = MysqlBase(**dbargs) 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): try: log.info("svn export config start") cmd = f"cd {self.svn_paths} && svn up && tar zcvf keys.tar.gz keys " status, output = run_cmd(cmd) if status: log.info("svn export config success") else: raise Exception("update svn failed!") except Exception: log.error(f"get remote {self.project} svn failed", exc_info=True) # project_paths = os.path.join(self.svn_paths, self.project) # tar = tarfile.open(self.svn_paths + '.tar.gz', 'w:gz') # os.chdir(self.svn_paths) # key_dirs = os.path.join(self.svn_paths, "keys") # for f in os.listdir(key_dirs): # tar.add(f) # tar.close() # 判断是否有生成tar包 list_dir = os.listdir(self.svn_paths) tar_files = list() for i in list_dir: if i.split('.')[-1] == "gz" and os.path.isfile(os.path.join(self.svn_paths, i)): tar_files.append(os.path.join(self.svn_paths, 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']) tar_files = args['tar_file'].split('/')[-1] data = {'dest_filename': tar_files, 'source': args['tar_file'], 'project': self.project} resule = an.run_playbook('deploy_keys.yml', **data) if not (resule['failed'] or resule['unreachable']): log.info(f"deploy keys with {self.project} success!") else: log.error(f"{self.project} deploy keys failed,{resule}", exc_info=True) def main(): import sys project = sys.argv[1] if not project: raise Exception("PLS input project like loginserver_php!") dk = DeployKeys(project) dk.run() if __name__ == "__main__": main()