# -*- coding: utf-8 -*- # python3 deploy_keys.py cloud_php # from ops.mmysql import MysqlBase from ops.mansible import AnsibleAPI from ops.mlog import define_logger import logging import datetime import os import pdb import shutil define_logger("/data/logs/ops/deploy_git.log") log = logging.getLogger(__name__) dbargs = dict() dbargs['host'] = '10.10.3.5' dbargs['user'] = 'ops' dbargs['pswd'] = 'deploy2018' dbargs['db'] = 'ywplatform' class DeployGit: def __init__(self, name): self.name = name self.now = datetime.datetime.now().strftime("%Y%m%dH%M%S") def run(self): sql = "select hosts,paths,user,url,pre_script,start_script from ops_deploy_git where name='{name}' and in_used=1;".format( name=self.name) mydb = MysqlBase(**dbargs) data = mydb.query(sql) self.infos = list() if data: for line in data: if line: hosts, paths, user, url, pre_script, start_script = line self.infos.append( (self.name, hosts, paths, user, url, pre_script, start_script)) else: return False self.infos = list(set(self.infos)) if self._build_tag(): self._deploy_remote() else: self.write("build {name} failed!".format(name=self.name)) def _build_tag(self): url = self.infos[0][4] pre_script = self.infos[0][5] self.tag_name = "{name}{now}".format(name=self.name, now=self.now) if os.path.isdir('/data/publish/git/'+self.name): shutil.rmtree('/data/publish/git/'+self.name) build_cmd = "cd /data/publish/git && git clone {url} && cd {name} && sh {pre_script} && cd .. && tar zcvf {tag_name}.tar.gz {name} ".format( name=self.name, url=url, tag_name=self.tag_name, pre_script=pre_script) os.system(build_cmd) self.tag_file = "/data/publish/git/"+self.tag_name+'.tar.gz' if os.path.isfile(self.tag_file): return True else: return False def _deploy_remote(self): for line in self.infos: if line: hosts, paths, user, _, _, start_script = line hosts = hosts.split(',') hostfile = self.write_host(hosts) an = AnsibleAPI(hostfile) data = {'paths': paths, 'desc_path': self.tag_name, 'user': user, 'source': self.tag_file, 'name': self.name, 'start_script': start_script} resule = an.run_playbook( '/data/git/dev_ops/ansible/playbook/publish_git.yml', **data) if not (resule['failed'] or resule['unreachable']): log.info(f"deploy success! resule={resule}") return True else: log.error(f"deploy failed info={resule}") return False def write_host(self, ip_addr): host_file = "%s/host%s" % ('/tmp', datetime.datetime.now().strftime("%Y%m%dH%M%S")) with open(host_file, 'a+') as f: for x in ip_addr: f.writelines(x + '\n') return host_file def main(): d = DeployGit('dev_ops') d.run() if __name__ == '__main__': main()