python启动文件_Python启动文件配置
#-*- 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启动文件配置相关推荐
- python 启动参数_python启动参数
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 开发准备cas 的 python sdk 包含了用于访问和操作 cas 的所有 ...
- python调用接口获取文件_python接口文件使用说明
首先, python 接口文件在安装好的 darknet 目录下的 python 文件夹,打开就 可以看到 这里的 darknet.py 文件就是 python 接口 用编辑器打开查看最后部分代码: ...
- python以读写方式打开文件_python读写文件操作详细介绍【传智播客】
Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...
- python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法
这里讨论使用Python解压如下五种压缩文件: .gz .tar .tgz .zip .rar 简介gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: li ...
- python excelwriter保存路径_python管理文件神器 os.walk
点击上方"机器学习与生成对抗网络",关注"星标" 获取有趣.好玩的前沿干货! 来源:诡途 https://blog.csdn.net/qq_35866846/a ...
- python新建文件格式_python之文件操作
@ 打开\创建文件 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,默认在当前程序所在文件夹下创建新文件. 格式:open(文件名,访问模式),例如 f = open ...
- python编程头文件_python头文件怎么写
本文主要以python2为例.首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法.这两个部分就是Python中头文件的组成模块. 编程风格#!/usr/bin/e ...
- python def return 文件_python基础-文件处理与函数
1. 文件处理 1.1 文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 1.2 文件读取模式r r文本模式的读,在文件不存在,不会创建新文件 f = ...
- python检测文件夹中新增文件_python检测文件夹变化,并拷贝有更新的文件到对应目录的方法...
检测文件夹,拷贝有更新的文件到对应目录 2016.5.19 亲测可用,若有借鉴请修改下文件路径: 学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~ newcopy.py: ...
- python如何使用文件_Python的文件操作
文件的操作,归根结底就只有两种:打开文件.操作文件 一.打开文件:文件句柄= open('文件路径','模式') python中打开文件有两种方式,即:open(...) 和 file(...),本 ...
最新文章
- 推荐 | 统计学权威盘点过去50年最重要的统计学思想,因果推理、bootstrap等上榜,Judea Pearl点赞...
- iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)...
- 未来教育python视频百度云-2019年计算机二级Python语言程序设计考试大纲
- python的函数的对象属性_Python帮助函数调试函数 用于获取对象的属性及属性值...
- 7个HTML5移动开发框架,初学HTML5必看
- PCM设备在雷达通信系统应用
- java软件工程_java复习
- Linux下Mail命令收集
- 隐形Euler方法的java程序_常微分方程的解法 (二): 欧拉(Euler)方法
- linux怎么退出telnet端口,CentOS下怎么退出telnet
- 【编程】辨异 —— proxy 与 delegate
- java 对象equals_浅谈Java对象的equals方法
- 断篇-金融大数据最佳实践总结篇
- 生活杂谈-简单电器维修知识-3
- 深海迷航坐标传送代码_深海迷航全资源坐标一览 美丽水世界坐标位置介绍
- table表格表头添加斜线
- 2020入侵防御系统(IPS)TOP10
- 无光驱安装原版 windows server2008,win7 的方法,64位的
- 范数(简单的理解)、范数的用途、什么是范数
- urllib中urlparse使用技巧以及iter_content图片边下边存到硬盘使用
热门文章
- matlab para for,matlab并行之parafor
- python400集视频教程-微软官方出品的400集Python精品视频教程,这正是我们急需的!...
- python界面-(八)Python 图形化界面设计
- python编程例子-几个Python小案例,爱上Python编程!
- 廖雪峰python教程-Python 2.7教程
- 搜狗推出庭审语音识别系统 人工智能下的全新应用
- vs code 开发企业级python_入股不亏!VS Code中最好用的Python扩展插件
- win10一直正在检查更新_win10一直存在的烦人问题,终于被彻底解决!你会选择更新么?...
- 计算机网络可以分为点对点网络,计算机网络第1章习题答案
- 【java笔记】StringBuilder类