平台运维日记

阅读文档系统说明文档,发现精读效果太差,建立的系统的信息基点不足。快速阅读,先看目录,然后看每篇文章的头和尾,主要关注概念与定义,不关注实现与功能细节。阅读完,在大脑中生成两张图,一张是文档结构图,一张是系统架构图


实践操作。操作过程主要包括:

1、把原目录A下的文件AAA,远程传输到主机S1和S2的目录B下,并备份目录B下的原文件。

2、继续传输,连续传输6个文件,使用File Zilla工具。

总耗时2个小时。主要工作是:

1、检查原目录下的文件是否存在

2、ssh到远端检查远程目录是否存在,远程目录文件是否存在,备份远程目录文件。6次检查,每次两台主机,总共检查12次

3、使用ftp工具上传文件,上传时设定本机目录,设定远端目录,点击上传。完全手工操作,容易出错。

4、文件上传之后,ssh到远程检查文件是否是最新。相当于重复步骤2

5、ssh远程主机,在各个目录下分别执行kill和start命令,kill前检查进程是否存在,start后检查是否启动完成,又是12次操作。


自动化分析:

功能操作分解:本机检查文件存在以及最新,远程检查目录是否存在,远程备份文件,上传文件,确认远端文件正确上传,确认进程是否存在,停止进程,启动进程


编码功能:

由于python丰富的运维库,采用python语言来实现。采用paramiko实现

文件格式:

caltest.war,d:\pkg\version,/app/bjmbill/user,username,password,192.168.1.1

代码如下:

import paramiko

import os

import time

import logging

date = time.strftime("%Y%m%d")

file_name ="oper_log_%s.log"%date

print(file_name)

logging.basicConfig(filename=file_name,

level=logging.DEBUG,filemode='w' ,

datefmt='%Y-%m-%d %H:%M:%S',

format  ='%(asctime)s  %(filename)s : %(levelname)s  %(message)s',

)

logger = logging.getLogger(__name__)

# 从文件中读取文件名,本地目录,远程目录,用户名

# caltest.war , d:\pkg\version\ , /home/emer/toma/, emer

def get_file_info(file_name):

result = {}

with open(file_name) as f:

for (num, value) in enumerate(f):

#            value = value.strip()

            if not len(value):

continue

            result[num] = {'file_name': value.split(',')[0],'local_dir': value.split(',')[1],

'remote_dir': value.split(',')[2],'user_name': value.split(',')[3],

'password': value.split(',')[4],'ip': value.split(',')[5]

}

f.close()

    logger.info("打印文件内容%s"%result)

    return result

# 远程操作类,在远程主机上的动作

class RemoteOper(object):

# 根据协议选择不同的连接方式,返回连接本身

# def 登录远端(协议方法,用户名,密码,端口号,密钥串)

    def loginRomote(self, protocol_method, host_info):

ip,user_name,password,port,remote_file = host_info[0], host_info[1], host_info[2], host_info[3], host_info[

4]

if protocol_method =="SSH":

paramiko.util.log_to_file('sysLogin.txt')

            ssh = paramiko.SSHClient()

            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

            ssh.connect(hostname="IP",username="user_name",password="password",key_filename="key_filename")

            return ssh

if protocol_method =="FTP":

t = paramiko.Transport("IP")

            t.connect(user_name="",password="")

            sftp = paramiko.SFTPClient.from_transport(t)

            return sftp

# def 执行命令,exec_command(command),由于本机与远程执行方法一样,不单独列出

# def 检查文件是否存在(文件名),返回最新日期和属性

    def checkFile(self, loginRomote, file_name):

file_info = loginRomote.exec_command("ls -l %s"%file_name)

        logger.info(file_info)

    # def 备份文件,返回备份后的文件属性

    def backFile(self, host_info, file_name):

ip, user_name, password, port, remote_file = host_info[0], host_info[1], host_info[2], host_info[3], host_info[

4]

logger.info('待备份文件%s'%file_name)

        try:

ssh = paramiko.SSHClient()

            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

            ssh.connect(hostname=ip,username=user_name,password=password)

            time_bak = time.strftime("%m%d")

            command1 ="cp -p -r %s %s" %(file_name, file_name +'_' + time_bak)

            logger.info("准备开始执行命令%s" % command1)

            stdin, stdout, stderr = ssh.exec_command(command1)

            logger.info(stdout.read())

            command2 ="ls -l %s" %(file_name +'*')

            logger.info("准备开始执行命令%s" % command2)

            stdin, stdout, stderr = ssh.exec_command(command2)

            logger.info(stdout.read())

            ssh.close()

            return 0

        except Exception as e:

ssh.close()

            logger.info("文件备份失败失败username=%s,password=%s,ip=%s,port=%s,file_name=%s,remote_dir=%s",

user_name, password, ip, port, file_name, remote_dir)

            return -1

    # def 检查进程存在(进程名,数量)

    def checkProcess(self, loginRemote, process_name, num):

pro_num = loginRemote.exec_command("ps -ef|grep %s |wc -l"%process_name)

        if pro_num == num:

logger.info("进程%s数量正常,为%s"%(process_name, pro_num))

        else:

logger.info("进程%s数量异常,应为%s,为%s"%(process_name, num, pro_num))

# 本地操作类,主要是检查本地文件,与上传

class LocalOper(object):

def listAllFile(self, dir_name):

def processDir(self, dir_name, file_names):

logger.info('Director', dir_name)

            for file_namein file_names:

logger.info("FIle", file_name)

        os.walk(dir_name, processDir,None)

    # def 检查本地文件(文件名)

    def isFile(self, file_name):

if os.path.isfile(file_name):

logger.info("%s文件存在"%file_name)

        else:

logger.info("%s文件不存在"%file_name)

        # def 文件上传

    def upFile(self, host_info, file_name):

ip,user_name,password,port,remote_file = host_info[0],host_info[1],host_info[2],host_info[3],host_info[4]

try:

t = paramiko.Transport(ip,port)

            t.connect(username=user_name,password=password)

            sftp = paramiko.SFTPClient.from_transport(t)

            sftp.put(file_name,remote_file)

            logger.info("文件上传成功username=%s,password=%s,ip=%s,port=%s,file_name=%s,remote_dir=%s",

user_name, password, ip, port, file_name, remote_dir)

            logger.info(sftp.stat(remote_file))

            t.close()

            return 0

        except Exception as e:

t.close()

            logger.info("文件上传失败username=%s,password=%s,ip=%s,port=%s,file_name=%s,remote_dir=%s",

user_name, password, ip, port, file_name, remote_dir)

            return -1

    # 返回最新日期和属性

if __name__ =='__main__':

#生成日志文件

    date = time.strftime("%Y%M%D")

    log_file_name ="oper_log_%s.log"%date

logging.basicConfig(filename=log_file_name,level=logging.DEBUG)

    fileInfo = get_file_info("testdeploy.txt")

    #文件格式内容:caltest.war , d:\pkg\version\ , /home/emer/toma/, emer,192.168.1.1

# file_name local_dir remote_dir user_name  ip

#单文件调试

#文件上传

    localOper = LocalOper();

key =0

    local_file_name = os.path.join(fileInfo[key]['local_dir'], fileInfo[key]['file_name']).strip(' ')

    file_name = fileInfo[key]['file_name']

local_dir = fileInfo[key]['local_dir']

remote_dir = fileInfo[key]['remote_dir']

user_name = fileInfo[key]['user_name']

password = fileInfo[key]['password']

ip = fileInfo[key]['ip'].strip()

    remote_file_name = remote_dir +'/' + file_name

logger.debug("列出当前目录下本地文件%s" %(fileInfo[key]['local_dir']))

    localOper.listAllFile(local_dir)

    logger.debug("检查本地文件%s" % local_file_name)

    localOper.isFile(local_file_name)

    #ip, user_name, password, port, remote_dir,用户名和密码信息从文件中读取

    host_info =[ip,user_name,password,22,remote_file_name]

#备份文件

    remoteOper = RemoteOper()

    if remoteOper.backFile(host_info,remote_file_name) !=0:

logger.error("文件备份失败")

    #上传文件

    if localOper.upFile(host_info, local_file_name) !=0:

logger.error("文件上传失败")

    # 读取文件,文件名,本地目录,上传目录,上传用户名(考虑自动获取啊)

# for 循环

#  检查本地文件

#  登录远端

#  检查远端文件

#  备份文件

#  上传文件

#  比对文件

#

# 读取文件,获取进程名

# 检查进程,停进程,启动进程,检查进程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,016评论 2 34
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 部分内容转载自搜狗百科 cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows...
    青冥之上阅读 2,351评论 0 24
  • win7 cmd管理员权限设置 net localgroup administrators 用户名 /add 把“...
    f675b1a02698阅读 4,980评论 0 11
  • 品牌顾客分类: 一、没有用过本品牌 ①没有用过没有听说过,路过了解一下 ②没有用过听说过,慕名而来 ③没有用过听说...
    暖熙1988阅读 212评论 0 0