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

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

前提条件:

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

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

一、先说批量部署上线

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

# -*- coding:utf-8 -*-
from fabric.colors import *
from fabric.api import *
from contextlib import contextmanager as _contextmanager # 自动载入
env.user='data_monitor'
env.hosts=['10.93.21.21', '10.93.18.34', '10.93.18.35']
env.password='datamonitor@123'
# 手动加入
env.activate = 'source /home/data_monitor/.bash_profile'
env.directory = '/home/data_monitor/dmonitor/dmonitor' @_contextmanager
def virtualenv():
with cd(env.directory):
with prefix(env.activate):
yield @task
def update():
with virtualenv():
run("git pull origin master") @task
def start():
with virtualenv():
run("$(nohup gunicorn --worker-class=gevent dmonitor.wsgi:application -b 0.0.0.0:8009 -w 4 &> /dev/null &) && sleep 1", warn_only=True)
run("$(nohup python manage.py celery worker -Q high -c 30 &> /dev/null &) && sleep 1 ", warn_only=True)
run("$(nohup python manage.py celery worker -Q mid -c 30 &> /dev/null &) && sleep 1 ", warn_only=True)
run("$(nohup python manage.py celery worker -Q low -c 30 &> /dev/null &) && sleep 1", warn_only=True) @task
def stop():
with virtualenv():
run("ps -ef | grep gunicorn | grep -v grep | awk '{print $2}'| xargs kill -9", warn_only=True)
run("ps -ef | grep celery | grep worker | grep -v grep | awk '{print $2}' | xargs kill -9", warn_only=True) @task
def deploy():
update()
stop()
start()

2、线上环境监控

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

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

先上代码

这个文件是各种task

import logging

from fabric.api import *
from fabric.context_managers import *
from fabric.colors import red, yellow, green
from common.redis import Redis
from common.config import redis as redis_config logger = logging.getLogger(__name__)
redis = Redis(redis_config.get('ip'), redis_config.get('port')) # hard_disk_monitor, item_name=hard_disk
@task
def hard_disk_monitor(item_group, item_name, threshold):
with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True, warn_only=True):
host = run('hostname -i')
hard_disk = run("df -hl | grep /dev/vda3 | awk -F ' ' '{print $5}'")
print green(host + ':' + hard_disk)
if int(hard_disk.strip('%')) > threshold:
redis("lpush %s %s" % (':'.join(['machine', item_group, item_name]), host)) # memory_monitor, item_name=memory
@task
def memory_monitor(item_group, item_name, threshold):
with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True, warn_only=True):
host = run('hostname -i')
memory = run("cat /proc/meminfo | grep MemFree | awk -F ' ' '{print $2}'")
print yellow(host + ':' + memory)
if int(memory.strip()) < threshold:
redis("lpush %s %s" % (':'.join(['machine', item_group, item_name]), host)) # base_services_monitor, item_name != hard_disk or item_name != memory
@task
def base_services_monitor(item_group, item_name, threshold):
with settings(hide('warnings','running','stdout','stderr'),parallel=True,warn_only=True):
host = run('hostname -i')
count = run("ps -ef | grep %s | grep -v grep | wc -l" % item_name)
print red(host + ':' + count)
if int(count.strip()) != threshold:
redis("hset %s %s %s" % (':'.join(['machine', item_group, item_name]), host, count))
redis('incr %s' % ':'.join(['machine', item_group, item_name, host]))
redis('expire %s 1800' % ':'.join(['machine', item_group, item_name, host])) # restart_services_monitor, item_name = tomcat-7.0.57-mis or item_name = tomcat-httpapi
@task
def restart_services_monitor(item_start):
with settings(hide('warnings', 'running', 'stdout', 'stderr'), parallel=True,warn_only=True):
host = run('hostname -i')
run(item_start)
print green(host + ':' + item_start)

这个文件是执行task

# -*- coding:utf-8 -*-

from fabric.api import *
from fabric.context_managers import *
execute(monitors.hard_disk_monitor, item_group, item_name, item_threshold,
hosts=json.loads(item_param.get('item_hosts')))
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. jQuery高级Ajax

    .load();加载远程的HTML文件代码,并插入到指定的DOM节点中.可以只传入一个参数,表示加载一个静态的HTML代码片段. $("#div1").load("loa ...

  2. 关于Linux中cd的一些快捷用法

    cd 命令使用的一些小技巧 cd 进入主目录 cd ~ 同样进入主目录 cd - 返回当前目录之前所在的目录 cd .. 返回上级目录 cd ../.. 返回上级的上级目录 cd !$ 把上个命令的参 ...

  3. KVM虚拟化主机安装

    KVM虚拟化主机安装 最小化安装CentOS6.X或者CentOS7.X,RHEL6.X以上系列建议建议选择安装最小虚拟化主机 如果要安装桌面可以先选择最小化虚拟主机,再选择Gnome桌面包 安装过程 ...

  4. 个人作业3——个人总结(Alpha阶段)

    Deadline: 2017-5-15 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目个人总结内容 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次 ...

  5. 团队作业8----第二次项目冲刺(beta阶段)5.21

    1. 开会 会议内容:1.总结昨天的任务工作 2. 由潘益靖同学对当天的代码修改及功能的改善做个简单的阐述 3.每个人对项目的发表一些意见及建议 4.组长分配任务 每日讨论图片(拍摄者小组成员 武健男 ...

  6. 201521123073 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码: ...

  7. 201521123100 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1.接口不是类,不能使用new进行实例化 2.使用instanceof运算符,可 ...

  8. 201521123065《Java程序设计》第2周学习总结

    1.本周学习总结 字符串创建后是不可变的,可以使用加号进行字符串之间的拼接. 使用for循环对字符串进行修正会不断产生新的字符串,应使用StringBuilder. 字符串内容的比较要用equal. ...

  9. 201521123005 《Java程序设计》第1周学习总结

    1. 本章学习总结 了解JDK/JRE/JVM,学会了如何安装JDK 学会使用控制台和eclipse上运行java代码 了解PTA提交的常见套路 http://www.cnblogs.com/zhrb ...

  10. Markdow使用的简单介绍

    一个例子: 例子开始 1. 本章学习总结 (字体较大,用法:#你要放大的标题) 今天主要学习了三个知识点 封装 继承 多态 用法: - 封装 - 继承 - 多态 2. 书面作业 Q1. java He ...