自动化运维工具Fabric之fabfile 和 shell编程

补上之前fabfile的使用和shell脚本

Posted by dzt on January 8, 2019

前言

我的好几个项目都是使用fabfile文件一键打包上传至nginx服务器的,所以这个东西很方便,减少了很多工作量。

fabfile

windows下的命令

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

from datetime import datetime
from fabric.api import *
from fabvenv import virtualenv

# 登录用户和主机名:
env.user = '用户名'
env.password = '密码'
env.hosts = [ 'ip地址']
pack_name = 'deploypack.tar.gz'

def pack():
    ' 定义一个pack任务 '
    # 打一个tar包:
    local('del  %s' % pack_name)
    local('md  ..\pack_tmp')
    local('xcopy /e /s .\* ..\pack_tmp')
    #--exclude 'media/userhead/* --exclude media/watchhead/*
    with lcd('..\pack_tmp'):
        local('tar -czvf ../mysite/%s --exclude *.tar.gz --exclude fabfile.py  ./*' % pack_name)
    local('rd /s /q  ..\pack_tmp')


def deploy():
    ' 定义一个部署任务 '
    # 远程服务器的临时文件:
    tag = datetime.now().strftime('%y.%m.%d_%H.%M.%S')
    print(env.host)
    hosttag = ''
    remote_work_dir = ''
    if env.host=='服务器地址':
        remote_work_dir = '/home/ubuntu/www/mysite/'
        hosttag = '自定义标签'
    elif env.host=='服务器地址':
        remote_work_dir = '/home/ubuntu/www/mysite/'
        hosttag = '自定义标签'
    else:
        exit(1)

    remote_tmp_tar = '/tmp/%s' % pack_name
    run('rm -f %s' % remote_tmp_tar)
    # 上传tar文件至远程服务器:
    put(pack_name, remote_tmp_tar)
    # 备份远程服务器工程
    # back_tar_name = '/home/ubuntu/www/backup/mysite_backup_%s.tar.gz' % tag
    # run('tar -czvf %s /home/ubuntu/www/mysite/*' % back_tar_name)
    # 删除原有工程
    #run('rm -rf /home/ubuntu/www/mysite/*')
    # 解压:
    run('tar -xzvf %s -C %s' % (remote_tmp_tar, remote_work_dir))
    run('mv %sother/settings_%s.py %s/mysite/settings.py' % (remote_work_dir, hosttag, remote_work_dir))
    run('mv %sother/mysite_nginx_%s.conf %s/mysite_nginx.conf' % (remote_work_dir, hosttag, remote_work_dir))
    run('mv %sother/mysite_uwsgi_%s.ini %s/mysite_uwsgi.ini' % (remote_work_dir, hosttag, remote_work_dir))
    run('mv %sother/uwsgi_params_%s %s/uwsgi_params' % (remote_work_dir, hosttag, remote_work_dir))
    run('rm -rf %sother' % remote_work_dir)
    with cd(remote_work_dir):
        if env.host=='服务器地址':
            with virtualenv('/home/ubuntu/www/mysite/kkwork'):
                run('python manage.py makemigrations')
                run('python manage.py migrate')
                run('chmod a+x ./restart.sh')
                run('sh ./restart.sh', pty=False)
                run('sudo service nginx restart')
                #run('uwsgi --ini mysite_uwsgi.ini &')
                run('sleep 5')
        else:
            run('python manage.py makemigrations')
            run('python manage.py migrate')
            run('chmod a+x ./restart.sh')
            run('sh ./restart.sh', pty=False)
            # run('sudo service nginx restart')
            run('sudo /etc/init.d/nginx restart')
            #run('uwsgi --ini mysite_uwsgi.ini &')
            run('sleep 5')


终端使用命令

# 在本地打包项目
fab pack    

# 上传至服务器解压,并替换settings,uwsgi.ini, uwsgi_params, nginx.conf,并启动
fab deploy

需要按格式新建一个other文件夹

文件夹内含有

settings_自定义标签.py

name_nginx_自定义标签.conf

name_uwsgi_自定义标签.ini

uwsgi_params_自定义标签

Shell脚本

我个人理解就是编写一个脚本,一键在终端输入命令,减少输入常用或重复的死板命令,提高效率等

特别注意:.sh文件为LF格式

先编写一个简单的脚本test.sh:

#! /bin/shcd ..
ls

Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。如果把这个脚本文件加上可执行权限然后执行:

chmod a+x test.sh
sh ./test.sh

就相当于在终端输入 ls 命令。

如过.sh文件中 需要使用虚拟环境,如 start_celery.sh :

start_celery.sh

cd /home/ubuntu/www/cmxcelery/
source kkwork/bin/activate
celery worker -A test_celery -l info

使用

sh ./start_celery.sh

就无法运行,会出现错误的情况,跟使用source有关

这时候就需要使用

bash ./start_celery.sh

附上项目sh文件

restart.sh

#!/bin/sh
NAME="walkerfree"
if [ ! -n "$NAME" ];then
    echo "no arguments"
    exit;
fi

echo $NAME
ID=`ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $2}'`
echo $ID
echo "################################################"
for id in $ID
do
kill -9 $id
echo "kill $id"
done
echo  "################################################"
nohup uwsgi --ini mxonline_uwsgi.ini &

start_system.sh

#!/bin/sh

./restart.sh
sudo service nginx restart
uwsgi --ini mxonline_uwsgi.ini &

touchforlogrotate.sh

#!/bin/bash

DIR=`echo $(cd "$(dirname "$0")"; pwd)`
LOGDIR="${DIR}/logs"

sourcelogpath="${DIR}/mxonline_uwsgi.log"
touchfile="${DIR}/.touchforlogrotate"


DATE=`date +"%Y%m%d_%H%M%S"`
echo $DATE
destlogpath="${LOGDIR}/mxonline_uwsgi_${DATE}.log"

mv $sourcelogpath $destlogpath
touch $touchfile

我这个不算是教程贴,只是写下给自己需要使用的时候的注释