首页 > linux > 多线程更新线上服务器

多线程更新线上服务器

2012年11月15日 eric 发表评论 阅读评论

好久没有更新过blog了,把自己写的一个多线程更新的脚本共享给大家,如果有什么疑问过着建议欢迎留言,以后我会把写的一个简单的通过页面更新线上服务的程序open 出来。

写这个脚本当然要说一下场景:
1,有一批web服务器,上面跑着相同的应用,目录结构一样。
2,更新时候注定要备份、删除缓存(不备份小心死人,删除缓存必要啊,不然新上的代码会不生效)
3,更新时必然我们要记录日志,是否连接服务器超时、备份时候成功、更新是否成功。

好了,有了结构,有了日志,有了备份,那么就不怕升级失败了。

先说代码为解决的一个问题,因为要开启多线程,所以日志记录的有点混乱,比如 ip 从 192.166.1.2 更新到 192.168.1.254 ,记录的日志可能第一行记录是 1.2 那么第二行可能记录 1.6 ,不过日志肯定每个服务的连接和返回日志都记录了。

脚本代码主要引入了 paramiko 类,有人说你为何不用 fabric,大哥我用了,他非要执行命令,结合 shell 来执行还是不错的,但是哥我测试想用单个脚本文件执行,我也做过测试,设置 env 环境变量后的确可以,但是比较慢,而且相当麻烦。所以哥我选择了 paramiko 用了一段时间,很稳定速度不错。

废话不多说,那么我们来看下代码:

1 #!/usr/bin/python2.6
  2 #-*- coding:utf-8 -*-
  3 import paramiko
  4 import commands
  5 import pexpect
  6 import  MySQLdb
  7 import logging
  8 import threading
  9 import Queue
 10 import csv
 11 import time
 12
 13 logging.basicConfig(level=logging.INFO,
 14                     format='%(asctime)s %(filename)s %(levelname)s %(message)s',
 15                     datefmt='%a,%d %b %Y %H %M:%s',
 16                     filename='paramiko.log',
 17                     filemode='w')
 18
 19 ## 创建 SSH 连接类
 20 class SSHClient(paramiko.SSHClient):
 21         def call(self, command, bufsize=-1):
 22                 chan = self._transport.open_session()
 23                 chan.exec_command(command)
 24                 stdin = chan.makefile('wb', bufsize)
 25                 stdout = chan.makefile('rb', bufsize)
 26                 stderr = chan.makefile_stderr('rb', bufsize)
 27 ## 获取命令放回状态代码
 28                 status = chan.recv_exit_status()
 29                 return stdin, stdout, stderr, status
 30
 31 ## 创建 rsync 连接类
 32 class rsyncThread():
 33    def __init__(self,host,passwd,code):
 34      self.host = host
 35      self.passwd = passwd
 36      self.code = code
 37    def run(self):
 38        ssh = pexpect.spawn("/usr/bin/rsync -a -c -v --delete %s -e '%s' %s:%s" % (self.code,'ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null',self.host,self.code),timeout=600)
 39        log=open('test.log','a')
 40        ssh.logfile=log
 41        i = ssh.expect(['(yes/no)','password:',pexpect.TIMEOUT,pexpect.EOF])
 42        if i == 0:
 43          ssh.sendline('yes')
 44          ssh.expect('password:')
 45          ssh.sendline(self.passwd)
 46        elif i == 1:
 47          ssh.sendline(self.passwd)
 48        elif i == 2:
 49          return False
 50        elif i == 3:
 51          return False
 52        ssh.expect(pexpect.EOF)
 53
 54 class mysqlimport():
 55     def __init__(self,host):
 56       self.host = host
 57     def run(self):
 58       imp = commands.getstatusoutput('mysql -h %s -uuser -p123456 -S /tmp/mysql.sock< /tmp/sqlquery.sql' % self.host)
 59       self.status = imp[0]
 60       self.msg = imp[1]
 61
 62 class sshcommand():
 63      def __init__(self,host,passwd):
 64        self.host = host
 65        self.passwd = passwd
 66      def run(self):
 67        sc = SSHClient()
 68        sc.load_system_host_keys()
 69        sc._policy = paramiko.AutoAddPolicy()
 70        try:
 71           sc.connect(self.host, 22, 'root', self.passwd ,timeout=5000)
 72           stdin, stdout, stderr, status = sc.call('/data/htdoc/tools/backup.sh')
 73
 74           sc.close()
 75           message = stdout.read()
 76           if status == 0:
 77             logging.info('%s  %s' % (self.host,message))
 78           elif status == 1:
 79             logging.info('%s  %s' % (self.host,message))
 80           elif status == 2:
 81             logging.info('%s  %s' % (self.host,message))
 82           elif status == 3:
 83             logging.info('%s  %s' % (self.host,message))
 84           else:
 85             logging.info('%s  %s' % (self.host,message))
 86        except:
 87           logging.info('%s Connection timed out' % self.host)
 88
 89 class worker(threading.Thread):
 90    def __init__(self,queue):
 91       threading.Thread.__init__(self)
 92       self.queue = queue
 93    def run(self):
 94       while True:
 95         line = self.queue.get()
 96         ipadd,passwd,code_path=line[0],line[1],line[2]
 97         #ipadd,passwd=line[0],line[1]
 98         #print ipadd
 99         sc = sshcommand(ipadd,passwd)
100         sc.run()
101         ry = rsyncThread(ipadd,passwd,code_path)
102         ry.run()
103#         myimport =  mysqlimport(ipadd)
104 #        myimport.run()
105 #        print myimport.status
106 #        status = sc.status
107 #        if status == 0:
108 #          logging.warning(message)
109         self.queue.task_done()
110
111
112 if __name__ == '__main__':
113 # 读取主机列表
114    reader = csv.reader(file('host.txt'))
115 #启用队列函数
116    queue = Queue.Queue()
117    out_queue = Queue.Queue()
118 #开启 5 个线程
119    for i in range(5):
120      t = worker(queue)
121      t.setDaemon(True)
122      t.start()
123 # 把主机列表放入队列
124    for line in reader:
125      queue.put(line)
126    queue.join()
127 #     print "Elapsed Time: %s" % (time.time() - start)
128

host.txt 内容为
# ip passwd web htdoc
192.168.1.2,password,/data/htdoc/

转载请注明:文章转载自:Eric's linux and nginx! (http://www.nginxs.com)
本文地址:http://www.nginxs.com/linux/497.html

分类: linux 标签: , ,
  1. 2017年11月11日05:19 | #1

    Thanks to my father who stated to me concerning this web site, this webpage is
    truly amazing.

  2. 2017年11月11日13:38 | #2

    Great article, just what I wanted to find.

  3. 2017年11月11日19:52 | #3

    Hi there great website! Does running a blog similar to this require a large amount of work?

    I have no expertise in computer programming but I was hoping to start my own blog in the near future.
    Anyways, should you have any recommendations or techniques for new blog owners please share.

    I understand this is off subject nevertheless I simply had to ask.
    Cheers!

  4. 2017年11月12日14:14 | #4

    Hello my family member! I want to say that this post is awesome, great written and include approximately all important infos.
    I would like to peer extra posts like this .

  5. 2017年11月12日16:39 | #5

    Are you experiencing slipping patio home at your residence?

  6. 2017年11月13日10:15 | #6

    Hi there just wanted to give you a quick heads up and let you know a few
    of the images aren’t loading properly. I’m not sure why but I think its a linking issue.
    I’ve tried it in two different browsers and both show the same outcome.

  7. 2017年11月13日13:29 | #7

    Hmm it seems like your website ate my first comment (it was extremely long) so I
    guess I’ll just sum it up what I wrote and say, I’m thoroughly enjoying your blog.
    I too am an aspiring blog writer but I’m still new to the whole thing.
    Do you have any helpful hints for novice blog writers?
    I’d really appreciate it.

  8. 2017年11月13日22:38 | #8

    Valuable info. Lucky me I discovered your website unintentionally,
    and I’m stunned why this coincidence didn’t happened earlier!
    I bookmarked it.

  9. 2017年11月15日08:07 | #9

    Do you think you’re than needed and you and your family?

  10. 2017年11月15日13:29 | #10

    Great article.

  11. 2017年11月16日03:24 | #11

    Hey guys!!!
    designs and builds specialty lines of lead oxide production equipment, material handling systems, battery related process machinery, parts, and accessories for the battery, pigment, glass, and chemical industries. http://techbasys.com offers technical application and engineering services to help the customer acheive maximum benefit from their equipment and manufacturing processes.

  12. 2017年11月17日13:54 | #12

    This message is posted here using XRumer + XEvil 4.0
    XEvil 4.0 is a revolutionary application that can bypass almost any anti-botnet protection.
    Captcha Recognition Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com and over 8.4 million other types!
    You read this – it means it works! ;)
    Details on the official website of XEvil.Net, there is a free demo version.

  13. 2017年11月17日15:22 | #13

    What’s up, for all time i used to check weblog posts here early in the daylight,
    for the reason that i enjoy to gain knowledge of
    more and more.

  14. 2017年11月23日12:02 | #14

    Today, I went to the beach with my kids.
    I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She
    put the shell to her ear and screamed. There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is totally off topic but I had to tell someone!

  15. 2017年11月26日01:33 | #15

    buy tablets in uk http://www.fireflyrestaurant.com/graphics/pharmacy/prefest.html best price for generic.

  16. 2017年11月28日14:25 | #16

    Howdy! I could have sworn I’ve been to your blog before but after browsing through many of the posts I realized
    it’s new to me. Regardless, I’m certainly pleased I found it and I’ll be bookmarking it and checking back regularly!

  17. 2017年12月1日16:06 | #17

    Good web site you have got here.. It’s difficult to find good quality writing like yours
    these days. I truly appreciate people like you! Take care!!

  18. 2017年12月1日20:32 | #18

    Необходимость повышения квалификации фармацевтическими специалистами.

    Всем известно, что здоровье каждого человека зависит не только от грамотности врачей и мед. персонал. Фармацевтические специалисты, как и все работники медицинской отрасли, несут большую ответственность при рекомендациях и продаваемых лекарственных препаратов.

    Все специалисты аптек, обязаны знать и разбираться во всех особенностях работы с медикаментами, понимать назначение каждого лекарственного средства, порядок приема и необходимую дозировку. Именно поэтому фармацевты и провизоры должны иметь глубокие знания по своим специальностям, серьезную практику работы в аптеках.

    Кроме того, в соответствии с регламентом и действующими нормативами они должны каждые пять лет проходить курсы повышения квалификации для обучения новейшим стандартам, а также подтверждать уровень, полученных ранее знаний в учебных заведениях. Значит сертификат провизора важно своевременно и качественно.

    Курсы повышения квалификации фармацевтов и провизоров состоят из лекций и обязательной сдачи экзаменов, насчитывающих в общей сложности более 140 часов. При успешном обучении и проверки педагогами, усвоенных знаний, обучаемым выдается сертификат, который позволяет работать в фармацевтической отрасли – аптеках и аптечных пунктах последующие 5 лет, до очередного прохождения курсов и подтверждения квалификации.

  19. 2017年12月1日23:15 | #19

    Необходимость повышения квалификации фармацевтическими специалистами.

    Всем известно, что здоровье каждого человека зависит не только от грамотности врачей и мед. персонал. Фармацевтические специалисты, как и все работники медицинской отрасли, несут большую ответственность при рекомендациях и продаваемых лекарственных препаратов.

    Все специалисты аптек, обязаны знать и разбираться во всех особенностях работы с медикаментами, понимать назначение каждого лекарственного средства, порядок приема и необходимую дозировку. Именно поэтому фармацевты и провизоры должны иметь глубокие знания по своим специальностям, серьезную практику работы в аптеках.

    Кроме того, в соответствии с регламентом и действующими нормативами они должны каждые пять лет проходить курсы повышения квалификации для обучения новейшим стандартам, а также подтверждать уровень, полученных ранее знаний в учебных заведениях. Значит тесты квалификации фармацевтов важно своевременно и качественно.

    Курсы повышения квалификации фармацевтов и провизоров состоят из лекций и обязательной сдачи экзаменов, насчитывающих в общей сложности более 140 часов. При успешном обучении и проверки педагогами, усвоенных знаний, обучаемым выдается сертификат, который позволяет работать в фармацевтической отрасли – аптеках и аптечных пунктах последующие 5 лет, до очередного прохождения курсов и подтверждения квалификации.

  20. 2017年12月2日21:47 | #20

    Вам нужны услуги автосервиса, но не можете найти хорошую и захотели обратиться в нашу Автомастерскую?

    Правильное решение! Доверять свою машину можно только проверенным мастерам! Автомобильное СТО пользуется спросом не первый день и оказывает ремонт по разным направлениям. Если вы нуждаетесь в покраске или замене каких-то оригинальных запчастей, то обратившись в сервис bsmadi.ru вам всегда помогут.

    Перейдя на наш сайт вы можете найти контакты.
    СТО Мади пользуется спросом во многих городах РФ. Предположим, оказать квалифицированную помощь можно в Химках, Зеленограде и Солнечногорске.

    Отдельно следует отметить, что ценовой диапазон очень приятный. Автомобильное СТО не завышает стоимость и этим самым завлекает аудиторию. Благодаря порталу автосервиса кузовной ремонт солнечногорск отзывы вы сможете найти и другие услуги, которые предлагаются.

    Автосервис оказывает услуги по разным направлениям, среди которых: ремонт кузова, слесарные работы, ремонт пластика. Все работы производятся быстро и качественно. Перед ремонтными работами всегда проводится диагностика и сообщается предварительная стоимость.

    В основном, механики работают с оригинальными деталями, но, если вы найдёте детали, которые по VIN номеру совпадают с вашим автомобилем дешевле, и они подойдут, то мастера смогут их поставить в кратчайшие сроки!

  21. 2017年12月2日22:56 | #21
  22. 2017年12月2日23:12 | #22

    Comprar argentina http://www.ex-in.com/wp-content/uploads/2015/11/farmacia/profertil.html como comprar en farmacia en España.

  23. 2017年12月2日23:14 | #23

    Pastillas precio en panama http://www.ex-in.com/wp-content/uploads/2015/11/farmacia/mobic.html comprar contrareembolso Madrid.

  24. 2017年12月2日23:28 | #24

    Вы нуждаетесь в услугах автосервиса, но не можете найти хорошую и решили обратиться к нам Автомастерскую?

    Правильное решение! Доверять свою машину можно только проверенным специалистам! Автомастерская пользуется спросом не первый год и оказывает ремонт по разным направлениям. Если вам нужна покраска или замене каких-то оригинальных запчастей, то обратившись в сервис bsmadi.ru вам всегда помогут.

    Перейдя на наш сайт вы можете найти всю контактную информацию.
    СТО Мади пользуется спросом во многих городах РФ. Предположим, оказать квалифицированные услуги можно в Химках, Зеленограде и Солнечногорске.

    Отдельно следует сказать, что ценовой диапазон очень приятный. Автомобильное СТО не ломит стоимость и этим самым привлекает клиентов. Благодаря порталу компании автосервис форд в солнечногорске вы сможете найти и другие услуги, которые они предлагают.

    Автомастерская оказывает техническую помощь по разным направлениям, среди которых: ремонт кузова, слесарные работы, ремонт пластика. Все работы производятся надёжно и качественно. Перед ремонтными работами всегда проводится диагностика и сообщается примерная стоимость.

    В основном, механики работают с оригинальными деталями, но, если вы найдёте детали, которые по VIN номеру совпадают с вашим автомобилем бюджетнее, и их можно будет поставить, то эксперты смогут их поставить очень быстро!

  25. 2017年12月10日16:13 | #25

    Great article! That is the kind of info that should
    be shared around the net. Shame on the search engines for not positioning this publish higher!
    Come on over and discuss with my site . Thanks =)

评论分页
1 ... 5 6 7 497
订阅评论
2+6= (必填)