#-*- coding:utf-8 -*-

'''

python一键启动服务器--所有部署的项目

'''

import paramiko

import configparser

import time

import ast

import threadpool

##设置日志打印级别

#logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',level=logging.DEBUG)

#配置文件读取

cf = configparser.ConfigParser()

cf.read(".\config.ini") # 读取配置文件,如果写文件的绝对路径,就可以不用os模块

missHosts=["data4","name2","name4"]#todo 排除host

pool = threadpool.ThreadPool(4)

'''

执行操作

'''

def operation():

secs = cf.sections() # 获取文件中所有的section(一个配置文件中可以有多个配置,如数据库相关的配置,邮箱相关的配置,每个section由[]包裹,即[section]),并以列表的形式返回

secs=[sec for sec in secs if sec not in missHosts]

print("{}==>开始初始化所有数据库服务。。。。。。。。".format(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())))

db_success = {}

#先初始化数据库操作

for sec in secs:

host = cf.get(sec, "host")

port = cf.get(sec, "port")

user = cf.get(sec, "user")

pwd = cf.get(sec, "pwd")

ssh = getConnection(host,port,user,pwd)

if ssh:

db_status = initDatabse(sec,ssh)

db_success.setdefault(sec,db_status)

else:

print("【error】{}主机连接失败!".format(sec))

closeConnection(ssh)

#如果数据库都初始化成功,则开始执行启动指令

if False not in db_success.values():

print("{}==>所有数据库服务初始化完成!!!".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))

for sec in secs:

host = cf.get(sec, "host")

port = cf.get(sec, "port")

user = cf.get(sec, "user")

pwd = cf.get(sec, "pwd")

ssh = getConnection(host, port, user, pwd)

if ssh:

startProject(sec,ssh)

else:

print("【error】{}主机连接失败!".format(sec))

closeConnection(ssh)

else:

print("{}==>数据库没有初始化成功,请检查后在尝试!",format("|".join([k for k,v in db_success.items() if v==False])))

#启动项目

def startProject(secname,ssh):

flag = {}

if assertKey(secname,"command"):

print("启动项目操作:【{}】".format(secname))

dbs = ast.literal_eval(cf.get(secname,"command"))

for k,v in dbs.items():

success = assertServiceStatus(ssh,k)

if success:

print("=====[{}]项目服务已经启动,指令=[{}]".format(secname,k))

flag.setdefault(k,True)

else:

print("=====[{}]项目服务正在启动,指令=[{}]".format(secname, v))

executeService(ssh,v)

#再次验证是否都已启动

time.sleep(1)

for k,v in dbs.items():

success = assertServiceStatus(ssh,k)

if success:

flag.setdefault(k,True)

else:

print("=====[{}]主机中[{}]启动失败!".format(secname, v))

#尝试重启一次,返回True 或False ,并会打印执行信息

flag.setdefault(k,restartProject(ssh,k,v))

if False not in flag.values():

print("=====[{}]所有项目完成!".format(secname))

return True

else:

print("【error】=====[{}]项目启动失败!".format(secname))

return False

#初始化所有数据库

def initDatabse(secname,ssh):

flag = {}

if assertKey(secname,"database"):

print("数据库操作:【{}】:".format(secname))

dbs = ast.literal_eval(cf.get(secname,"database"))

for k,v in dbs.items():

success = assertServiceStatus(ssh,k)

if success:

print("=====[{}]数据库服务已经启动,指令=[{}]".format(secname,k))

flag.setdefault(k,True)

else:

print("=====[{}]数据库服务正在启动,指令=[{}]".format(secname, v))

executeService(ssh,v)

#再次验证程序是否都已启动

time.sleep(2)

for k,v in dbs.items():

success = assertServiceStatus(ssh,k)

if success:

flag.setdefault(k,True)

else:

print("=====[{}]主机中[{}]数据库服务初始化失败!".format(secname, v))

flag.setdefault(k,False)

if False not in flag.values():

print("=====[{}]初始化数据库完成!".format(secname))

return True

else:

print("【error】=====[{}]初始化数据库失败!".format(secname))

return False

#针对启动失败的程序,tomcat启动失败,但是ps查询还是会有进程

def restartProject(ssh,k,v):

pids=[]

stdin, stdout, stderr = ssh.exec_command(k,get_pty=True)#查询进程

lines = stdout.readlines()

for line in lines:

pid = line[9:14]

pids.append(pid)

print("进程=[{}],info=【{}】".format(pid,line))

if pids:

ssh.exec_command("kill -9 {}".format(" ".join(pids)))

#杀完进程后尝试重新启动

stdin, stdout, stderr = ssh.exec_command(v,get_pty=True)

for out in stdout:

print("执行返回信息:【{}】".format(out))

for err in stderr:

print("执行错误信息:【{}】".format(err))

time.sleep(3)

success = assertServiceStatus(ssh,k)

return success

#判断服务是否启动

def assertServiceStatus(ssh,command):

stdin, stdout, stderr = ssh.exec_command(command,get_pty=True)

res = [line for line in stdout]

if len(res) > 0:

return True

else:

return False

#判断服务是否启动

def executeService(ssh,command):

try:

ssh.exec_command("{}".format(command),timeout=2)#不等待执行结果

except:

print("{}==>执行完毕!")

def assertKey(secname,key):

has =cf.has_option(secname,key)

return has

def getConnection(host,port,user,pwd):

'''

重新获取链接

:param host:

:param port:

:param user:

:param pwd:

:return:

'''

ssh = paramiko.SSHClient() # 创建SSH对象

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机

try:

ssh.connect(hostname=host, port=port, username=user, password=pwd,timeout=5) # 连接服务器

return ssh

except:

print("【error】{}连接失败".format(host))

return None

def closeConnection(ssh):

'''

关闭链接

:param ssh:

:return:

'''

try:

ssh.close()

except:

print("【error】{}:链接关闭异常".format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))

if __name__ == '__main__':

start = time.time()

operation()

end = time.time()

print("所有项目启动完成,共耗时{}秒".format((end-start)))

# sec="data2"

# host = cf.get(sec, "host")

# port = cf.get(sec, "port")

# user = cf.get(sec, "user")

# pwd = cf.get(sec, "pwd")

# ssh = getConnection(host, port, user, pwd)

# k = "service mysqld status"

# v = "cd /var/neo4j-community-3.5.1/bin;./neo4j start"

# #restartProject(ssh,k,v)

# stdin, stdout, stderr = ssh.exec_command(k, get_pty=True) # 查询进程

#

# if str(stdout.readlines()[-1]).__contains__("Started MySQL Server."):

# print("服务已经启动!")

python启动文件_Python启动文件配置相关推荐

  1. python 启动参数_python启动参数

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 开发准备cas 的 python sdk 包含了用于访问和操作 cas 的所有 ...

  2. python调用接口获取文件_python接口文件使用说明

    首先, python 接口文件在安装好的 darknet 目录下的 python 文件夹,打开就 可以看到 这里的 darknet.py 文件就是 python 接口 用编辑器打开查看最后部分代码: ...

  3. python以读写方式打开文件_python读写文件操作详细介绍【传智播客】

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  4. python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法

    这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: li ...

  5. python excelwriter保存路径_python管理文件神器 os.walk

    点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 来源:诡途 https://blog.csdn.net/qq_35866846/a ...

  6. python新建文件格式_python之文件操作

    @ 打开\创建文件 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,默认在当前程序所在文件夹下创建新文件. 格式:open(文件名,访问模式),例如 f = open ...

  7. python编程头文件_python头文件怎么写

    本文主要以python2为例.首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法.这两个部分就是Python中头文件的组成模块. 编程风格#!/usr/bin/e ...

  8. python def return 文件_python基础-文件处理与函数

    1. 文件处理 1.1 文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 1.2 文件读取模式r r文本模式的读,在文件不存在,不会创建新文件 f = ...

  9. python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录的方法...

    检测文件夹,拷贝有更新的文件到对应目录 2016.5.19 亲测可用,若有借鉴请修改下文件路径: 学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~ newcopy.py: ...

  10. python如何使用文件_Python的文件操作

    文件的操作,归根结底就只有两种:打开文件.操作文件 一.打开文件:文件句柄= open('文件路径','模式') python中打开文件有两种方式,即:open(...) 和  file(...),本 ...

最新文章

  1. 推荐 | 统计学权威盘点过去50年最重要的统计学思想,因果推理、bootstrap等上榜,Judea Pearl点赞...
  2. iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)...
  3. 未来教育python视频百度云-2019年计算机二级Python语言程序设计考试大纲
  4. python的函数的对象属性_Python帮助函数调试函数 用于获取对象的属性及属性值...
  5. 7个HTML5移动开发框架,初学HTML5必看
  6. PCM设备在雷达通信系统应用
  7. java软件工程_java复习
  8. Linux下Mail命令收集
  9. 隐形Euler方法的java程序_常微分方程的解法 (二): 欧拉(Euler)方法
  10. linux怎么退出telnet端口,CentOS下怎么退出telnet
  11. 【编程】辨异 —— proxy 与 delegate
  12. java 对象equals_浅谈Java对象的equals方法
  13. 断篇-金融大数据最佳实践总结篇
  14. 生活杂谈-简单电器维修知识-3
  15. 深海迷航坐标传送代码_深海迷航全资源坐标一览 美丽水世界坐标位置介绍
  16. table表格表头添加斜线
  17. 2020入侵防御系统(IPS)TOP10
  18. 无光驱安装原版 windows server2008,win7 的方法,64位的
  19. 范数(简单的理解)、范数的用途、什么是范数
  20. urllib中urlparse使用技巧以及iter_content图片边下边存到硬盘使用

热门文章

  1. matlab para for,matlab并行之parafor
  2. python400集视频教程-微软官方出品的400集Python精品视频教程,这正是我们急需的!...
  3. python界面-(八)Python 图形化界面设计
  4. python编程例子-几个Python小案例,爱上Python编程!
  5. 廖雪峰python教程-Python 2.7教程
  6. 搜狗推出庭审语音识别系统 人工智能下的全新应用
  7. vs code 开发企业级python_入股不亏!VS Code中最好用的Python扩展插件
  8. win10一直正在检查更新_win10一直存在的烦人问题,终于被彻底解决!你会选择更新么?...
  9. 计算机网络可以分为点对点网络,计算机网络第1章习题答案
  10. 【java笔记】StringBuilder类