一、使用介紹
reboot-p是一款基於Python開發的自動化伺服器重啟工具。通過使用reboot-p,你能夠輕鬆實現定時或者手動重啟伺服器,從而提升伺服器的性能和穩定性。
使用reboot-p的好處在於,它能夠幫你省去手動登錄伺服器執行重啟操作的麻煩,而且能夠輕鬆實現配置管理和計劃管理,提高效率。
下面是使用reboot-p的步驟說明:
1.安裝reboot-p
pip install reboot-p
2.配置伺服器信息
reboot-p config -s SERVER_IP -u USERNAME -p PASSWORD
3.檢查伺服器列表
reboot-p list # 查看已經配置好的伺服器列表
4.添加計劃任務
reboot-p add -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR
5.執行任務
reboot-p run -t TASK_NAME
6.查看任務日誌
reboot-p logs -t TASK_NAME
通過以上6個步驟,即可輕鬆使用reboot-p實現伺服器重啟。
二、定時任務管理
reboot-p提供了計劃任務管理的功能,使得用戶可以通過簡單配置實現自動化的重啟操作。下面是計劃任務管理的幾個方面的詳細闡述:
1.添加計劃任務
添加計劃任務需要設置伺服器、任務名稱、間隔時間、時區、重啟時間段等,在執行時,reboot-p會按照設定的時間自動執行重啟操作,從而實現高效管理。
reboot-p add -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR
2.查看任務列表
reboot-p提供了list命令可以幫助你查看已經配置好的計劃任務列表,方便你進行任務的管理和維護。使用方法如下:
reboot-p list
3.編輯計劃任務
在實際場景中,你可能需要對已經配置好的任務進行調整,reboot-p提供了edit命令幫助你進行任務編輯,具體使用方法如下:
reboot-p edit -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR
4.刪除計劃任務
如果不需要某個計劃任務,你可以使用delete命令來刪除對應的任務。使用方法如下:
reboot-p delete -t TASK_NAME
三、手動重啟管理
除了定時任務重啟,reboot-p還提供了手動重啟的功能。通過手動重啟,你可以靈活地根據需求執行重啟操作。下面是手動重啟的幾個方面的詳細說明:
1.手動重啟
手動重啟非常簡單,只需要在命令行中執行下面的命令即可:
reboot-p reboot -s SERVER_NAME
2.查看伺服器狀態
reboot-p提供了status命令可以幫助你查看伺服器當前的狀態,具體使用方法如下:
reboot-p status -s SERVER_NAME
3.手動關機
在某些特殊的情況下,你可能需要手動關機,reboot-p也提供了shutdown命令幫助你實現伺服器的關機。使用方法如下:
reboot-p shutdown -s SERVER_NAME
四、代碼示例
下面是reboot-p的核心代碼,你可以參考它進行二次開發和靈活擴展:
import paramiko
import argparse
import yaml
import time
import logging
import logging.handlers
logging.basicConfig()
logger = logging.getLogger('reboot-p')
logger.setLevel(logging.INFO)
handler = logging.handlers.RotatingFileHandler('reboot-p.log', maxBytes=20 * 1024 * 1024, backupCount=5)
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
logger.addHandler(handler)
class RebootClient:
def __init__(self, server_config):
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(server_config['ip'], username=server_config['username'], password=server_config['password'])
def reboot(self):
try:
logger.info('開始重啟伺服器...')
self.ssh.exec_command('sudo reboot')
logger.info('重啟命令已發送,請稍等...')
time.sleep(60)
logger.info('重啟成功!')
except Exception as e:
logger.error('重啟失敗:{}'.format(str(e)))
finally:
self.ssh.close()
def shutdown(self):
try:
logger.info('開始關機操作...')
self.ssh.exec_command('sudo shutdown -h now')
logger.info('關機命令已發送,請稍等...')
time.sleep(5)
logger.info('關機成功!')
except Exception as e:
logger.error('關機失敗:{}'.format(str(e)))
finally:
self.ssh.close()
def check_status(self):
try:
stdin, stdout, stderr = self.ssh.exec_command('uptime')
lines = stdout.readlines()
logger.info('伺服器{}當前狀態:{}'.format(self.name, lines[0].strip()))
except Exception as e:
logger.error('狀態查詢失敗:{}'.format(str(e)))
finally:
self.ssh.close()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='reboot-p: a simple tool for rebooting remote server')
parser.add_argument('command', help='command to run: config, add, delete, edit, list, run, logs, reboot, shutdown, status')
parser.add_argument('-s', '--server-name', help='server name', dest='name')
parser.add_argument('-i', '--interval', help='reboot interval in minutes', type=int)
parser.add_argument('-t', '--timezone', help='time zone for task', default='Asia/Shanghai')
parser.add_argument('--start-hour', help='start hour for reboot in 24 format', type=int)
parser.add_argument('--end-hour', help='end hour for reboot in 24 format', type=int)
parser.add_argument('-u', '--username', help='server username', dest='username')
parser.add_argument('-p', '--password', help='server password', dest='password')
parser.add_argument('--task-name', help='task name')
args = parser.parse_args()
if args.command == 'config':
with open('config.yml', 'w') as f:
yaml.dump({'servers': []}, f, default_flow_style=False)
print('配置文件已創建,請編輯config.yml文件,並重新運行reboot-p')
with open('config.yml', 'r') as f:
config = yaml.load(f, Loader=yaml.FullLoader)
if args.command == 'add':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
tasks = []
if 'tasks' in server_config:
tasks = server_config['tasks']
task = {
'name': args.task_name,
'interval': args.interval,
'timezone': args.timezone,
'start_hour': args.start_hour,
'end_hour': args.end_hour
}
tasks.append(task)
server_config['tasks'] = tasks
with open('config.yml', 'w') as f:
yaml.dump(config, f, default_flow_style=False)
print('伺服器 {} 添加任務成功!'.format(args.name))
elif args.command == 'delete':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
tasks = []
if 'tasks' in server_config:
tasks = server_config['tasks']
tasks = [t for t in tasks if t['name'] != args.task_name]
server_config['tasks'] = tasks
with open('config.yml', 'w') as f:
yaml.dump(config, f, default_flow_style=False)
print('伺服器 {} 刪除任務成功!'.format(args.name))
elif args.command == 'edit':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
tasks = []
if 'tasks' in server_config:
tasks = server_config['tasks']
task = [t for t in tasks if t['name'] == args.task_name][0]
task['interval'] = args.interval
task['timezone'] = args.timezone
task['start_hour'] = args.start_hour
task['end_hour'] = args.end_hour
with open('config.yml', 'w') as f:
yaml.dump(config, f, default_flow_style=False)
print('伺服器 {} 編輯任務成功!'.format(args.name))
elif args.command == 'list':
for server in config['servers']:
print('伺服器:{}'.format(server['name']))
tasks = []
if 'tasks' in server:
tasks = server['tasks']
for task in tasks:
print(' 任務:{}'.format(task['name']))
print(' 間隔時間:{}分鐘'.format(task['interval']))
print(' 時區:{}'.format(task['timezone']))
print(' 重啟時間:{}點到{}點'.format(task['start_hour'], task['end_hour']))
elif args.command == 'run':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
tasks = []
if 'tasks' in server_config:
tasks = server_config['tasks']
task = [t for t in tasks if t['name'] == args.task_name][0]
client = RebootClient(server_config)
client.reboot()
elif args.command == 'logs':
logger.setLevel(logging.DEBUG)
logger.handlers.clear()
handler = logging.handlers.RotatingFileHandler('reboot-p.log', maxBytes=20 * 1024 * 1024, backupCount=5)
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
logger.addHandler(handler)
elif args.command == 'reboot':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
client = RebootClient(server_config)
client.reboot()
elif args.command == 'shutdown':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
client = RebootClient(server_config)
client.shutdown()
elif args.command == 'status':
server_config = [s for s in config['servers'] if s['name'] == args.name][0]
if not server_config:
print('未找到伺服器 {}'.format(args.name))
exit(1)
client = RebootClient(server_config)
client.check_status()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187946.html