本文讲述如何使用fabric进行批量部署上线的功能

这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码。

前提条件:

1、运行fabric脚本的机器和其他机器tcp_port=22端口通

2、ssh可以登录,你有账号密码

一、先说批量部署上线

先上代码,再仔细讲解,脚本如下

  1. # -*- coding:utf-8 -*-
  2. from fabric.colors import *
  3. from fabric.api import *
  4. from contextlib import contextmanager as _contextmanager
  5.  
  6. # 自动载入
  7. env.user='data_monitor'
  8. env.hosts=['10.93.21.21', '10.93.18.34', '10.93.18.35']
  9. env.password='datamonitor@123'
  10. # 手动加入
  11. env.activate = 'source /home/data_monitor/.bash_profile'
  12. env.directory = '/home/data_monitor/dmonitor/dmonitor'
  13.  
  14. @_contextmanager
  15. def virtualenv():
  16. with cd(env.directory):
  17. with prefix(env.activate):
  18. yield
  19.  
  20. @task
  21. def update():
  22. with virtualenv():
  23. run("git pull origin master")
  24.  
  25. @task
  26. def start():
  27. with virtualenv():
  28. run("$(nohup gunicorn --worker-class=gevent dmonitor.wsgi:application -b 0.0.0.0:8009 -w 4 &> /dev/null &) && sleep 1", warn_only=True)
  29. run("$(nohup python manage.py celery worker -Q high -c 30 &> /dev/null &) && sleep 1 ", warn_only=True)
  30. run("$(nohup python manage.py celery worker -Q mid -c 30 &> /dev/null &) && sleep 1 ", warn_only=True)
  31. run("$(nohup python manage.py celery worker -Q low -c 30 &> /dev/null &) && sleep 1", warn_only=True)
  32.  
  33. @task
  34. def stop():
  35. with virtualenv():
  36. run("ps -ef | grep gunicorn | grep -v grep | awk '{print $2}'| xargs kill -9", warn_only=True)
  37. run("ps -ef | grep celery | grep worker | grep -v grep | awk '{print $2}' | xargs kill -9", warn_only=True)
  38.  
  39. @task
  40. def deploy():
  41. update()
  42. stop()
  43. start()

2、线上环境监控

当然一般线上环境没有用fabric监控的,但是开发环境和测试环境的话,一般都是虚拟机,没有人管你。

所以自己开发一个小型监控程序,监控一下硬盘cpu内存,或者是一些进程(redis/mysql...),还是挺有用的。

先上代码

这个文件是各种task

  1. import logging
  2.  
  3. from fabric.api import *
  4. from fabric.context_managers import *
  5. from fabric.colors import red, yellow, green
  6. from common.redis import Redis
  7. from common.config import redis as redis_config
  8.  
  9. logger = logging.getLogger(__name__)
  10. redis = Redis(redis_config.get('ip'), redis_config.get('port'))
  11.  
  12. # hard_disk_monitor, item_name=hard_disk
  13. @task
  14. def hard_disk_monitor(item_group, item_name, threshold):
  15. with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True, warn_only=True):
  16. host = run('hostname -i')
  17. hard_disk = run("df -hl | grep /dev/vda3 | awk -F ' ' '{print $5}'")
  18. print green(host + ':' + hard_disk)
  19. if int(hard_disk.strip('%')) > threshold:
  20. redis("lpush %s %s" % (':'.join(['machine', item_group, item_name]), host))
  21.  
  22. # memory_monitor, item_name=memory
  23. @task
  24. def memory_monitor(item_group, item_name, threshold):
  25. with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True, warn_only=True):
  26. host = run('hostname -i')
  27. memory = run("cat /proc/meminfo | grep MemFree | awk -F ' ' '{print $2}'")
  28. print yellow(host + ':' + memory)
  29. if int(memory.strip()) < threshold:
  30. redis("lpush %s %s" % (':'.join(['machine', item_group, item_name]), host))
  31.  
  32. # base_services_monitor, item_name != hard_disk or item_name != memory
  33. @task
  34. def base_services_monitor(item_group, item_name, threshold):
  35. with settings(hide('warnings','running','stdout','stderr'),parallel=True,warn_only=True):
  36. host = run('hostname -i')
  37. count = run("ps -ef | grep %s | grep -v grep | wc -l" % item_name)
  38. print red(host + ':' + count)
  39. if int(count.strip()) != threshold:
  40. redis("hset %s %s %s" % (':'.join(['machine', item_group, item_name]), host, count))
  41. redis('incr %s' % ':'.join(['machine', item_group, item_name, host]))
  42. redis('expire %s 1800' % ':'.join(['machine', item_group, item_name, host]))
  43.  
  44. # restart_services_monitor, item_name = tomcat-7.0.57-mis or item_name = tomcat-httpapi
  45. @task
  46. def restart_services_monitor(item_start):
  47. with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True,warn_only=True):
  48. host = run('hostname -i')
  49. run(item_start)
  50. print green(host + ':' + item_start)

这个文件是执行task

  1. # -*- coding:utf-8 -*-
  2.  
  3. from fabric.api import *
  4. from fabric.context_managers import *
  5. execute(monitors.hard_disk_monitor, item_group, item_name, item_threshold,
  6. hosts=json.loads(item_param.get('item_hosts')))
  7. hosts = self.redis('lrange %s 0 -1' % ':'.join(['machine', item_group, item_name]))

使用Fabric一键批量部署上线/线上环境监控的更多相关文章

  1. Docker + node(koa) + nginx + mysql 线上环境部署

    在上一篇 Docker + node(koa) + nginx + mysql 开发环境搭建,我们进行了本地开发环境搭建 现在我们就来开始线上环境部署 如果本地环境搭建没有什么问题,那么线上部署的配置 ...

  2. (转) 线上环境部署MongoDB的官方建议

    本文主要内容来自MongoDB官方文档http://docs.mongodb.org/manual/administration/production-notes/.并结合了实际工作情况进行分享. 1 ...

  3. express框架开发接口部署线上环境PM2

    1.PM2介绍 PM2是一个线上环境下,用于启动nodejs进程守护的工具,用来保证服务的稳定及分摊服务器进程和压力. 2.下载安装 npm install pm2 -g  => pm2 --v ...

  4. 批量部署Hadoop集群环境(1)

    批量部署Hadoop集群环境(1) 1. 项目简介: 前言:云火的一塌糊涂,加上自大二就跟随一位教授做大数据项目,所以很早就产生了兴趣,随着知识的积累,虚拟机已经不能满足了,这次在服务器上以生产环境来 ...

  5. 使用percona-xtrabackup实现对线上zabbix监控系统数据库mariadb5.5.47的主从同步

    使用percona-xtrabackup实现对线上zabbix监控系统数据库的主从同步 业务背景: zabbix3.0.4是业务的主要监控,部署在一台单机中,为避免数据丢失先对其做数据主从同步,因主数 ...

  6. vue本地和线上环境(域名)配置

    vue本身为运行脚手架项目自家搭载了一个nodejs后台环境,本地可通过proxyTable来处理跨域问题,但是上线(或生产环境)之后改域名真是一件麻烦的事情,所以进行一些配置. config/ind ...

  7. Vue 2.x 3.x 配置项目开发环境跟线上环境

    先找到package.json  (这是nuxt版的vue 可能会跟一般vue不一样  当然总体上差不多的) "scripts": { "dev": " ...

  8. 记一次线上环境 ES 主分片为分配故障

    故障前提 ElasticSearch 版本:5.2 集群节点数:5 索引主分片数:5 索引分片副本数:1 线上环境ES存储的数据量很大,当天由于存储故障,导致一时间 5个节点的 ES 集群,同时有两个 ...

  9. 使用Playbook批量部署多台LAMP环境

    1. 安装ansible yum install epel-release -y yum install ansible -y Playbook是一个不同于使用ansible命令行执行方式的模式,功能 ...

随机推荐

  1. 遇到的面试题-sql

    sql面试题(学生表_课程表_成绩表_教师表) 原帖链接:http://bbs.csdn.net/topics/280002741 表架构 Student(S#,Sname,Sage,Ssex) 学生 ...

  2. GUI(自定义背景图片)

    如果组件中没有setIcon(...);这个方法,这是有需要给组件设置背景图片,这时就可以自定义绘制背景图片 /** * */ package com.niit.javagui; import jav ...

  3. java继承中的初始化顺序

    初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类 ...

  4. Swing-选项卡面板JTabbedPane-入门

    注:非原创,内容源自<Swing 的选项卡面板>,笔者做了少量修改. 选项卡面板是一个很常用的Swing组件,在window下,右击我的电脑,查看属性,就是一个典型的选修卡面板.当然还有最 ...

  5. 201521123075 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 进行删除操作的时候最好从末尾开始删除.如果从开头开始删除,会使每个元素的对应位置发生 ...

  6. java第七次作业

    1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Ob ...

  7. Python IDLE快捷键一览

    编辑状态时:Ctrl + [ .Ctrl + ] 缩进代码Alt+3 Alt+4 注释.取消注释代码行Alt+5 Alt+6 切换缩进方式 空格<=>TabAlt+/ 单词完成,只要文中出 ...

  8. 201521123039 《java程序设计》第十周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 总结:需要 ...

  9. Django实现内容缓存

    1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...

  10. SDP开发

    1.1 前言 在企业间的商业竞争越来越激烈的今天,如何快速实现客户需求,如果快速方开发.修改.更新系统功能,如何降低软件研发的成本等等,在此目标基础上研发了软件快速开发(SDP)工具.通过平台设计器快 ...