Python自动化运维和部署项目工具Fabric使用实例
Fabric是使用Python开发的一个自动化运维和部署项目的一个好工具,可以通过SSH的方式与远程服务器进行自动化交互,例如将本地文件传到服务器,在服务器上执行shell命令。
下面给出一个自动化部署Django项目的例子
#-*-coding:utf-8-*-
#文件名要保存为fabfile.py
from__future__importunicode_literals
fromfabric.apiimport*
#登录用户和主机名:
env.user='root'
#如果没有设置,在需要登录的时候,fabric会提示输入
env.password='youpassword'
#如果有多个主机,fabric会自动依次部署
env.hosts=['www.example.com']
TAR_FILE_NAME='deploy.tar.gz'
defpack():
"""
定义一个pack任务,打一个tar包
:return:
"""
tar_files=['*.py','static/*','templates/*','vue_app/','*/*.py','requirements.txt']
exclude_files=['fabfile.py','deploy/*','*.tar.gz','.DS_Store','*/.DS_Store',
'*/.*.py','__pycache__/*']
exclude_files=['--exclude=\'%s\''%tfortinexclude_files]
local('rm-f%s'%TAR_FILE_NAME)
local('tar-czvf%s%s%s'%(TAR_FILE_NAME,''.join(exclude_files),''.join(tar_files)))
print('在当前目录创建一个打包文件:%s'%TAR_FILE_NAME)
defdeploy():
"""
定义一个部署任务
:return:
"""
#先进行打包
pack()
#远程服务器的临时文件
remote_tmp_tar='/tmp/%s'%TAR_FILE_NAME
run('rm-f%s'%remote_tmp_tar)
#上传tar文件至远程服务器,local_path,remote_path
put(TAR_FILE_NAME,remote_tmp_tar)
#解压
remote_dist_base_dir='/home/python/django_app'
#如果不存在,则创建文件夹
run('mkdir-p%s'%remote_dist_dir)
#cd命令将远程主机的工作目录切换到指定目录
withcd(remote_dist_dir):
print('解压文件到到目录:%s'%remote_dist_dir)
run('tar-xzvf%s'%remote_tmp_tar)
print('安装requirements.txt中的依赖包')
#我使用的是python3来开发
run('pip3install-rrequirements.txt')
remote_settings_file='%s/django_app/settings.py'%remote_dist_dir
settings_file='deploy/settings.py'%name
print('上传settings.py文件%s'%settings_file)
put(settings_file,remote_settings_file)
nginx_file='deploy/django_app.conf'
remote_nginx_file='/etc/nginx/conf.d/django_app.conf'
print('上传nginx配置文件%s'%nginx_file)
put(nginx_file,remote_nginx_file)
#在当前目录的子目录deploy中的supervisor配置文件上传至服务器
supervisor_file='deploy/django_app.ini'
remote_supervisor_file='/etc/supervisord.d/django_app.ini'
print('上传supervisor配置文件%s'%supervisor_file)
put(supervisor_file,remote_supervisor_file)
#重新加载nginx的配置文件
run('nginx-sreload')
run('nginx-t')
#删除本地的打包文件
local('rm-f%s'%TAR_FILE_NAME)
#载入最新的配置文件,停止原有进程并按新的配置启动所有进程
run('supervisorctlreload')
#执行restartall,start或者stopfabric都会提示错误,然后中止运行
#但是服务器上查看日志,supervisor有重启
#run('supervisorctlrestartall')
执行pack任务
fabpack
执行deploy任务
fabdeploy
再给大家分享一个使用Fabric进行代码的自动化部署
#coding=utf-8
fromfabric.apiimportlocal,abort,settings,env,cd,run
fromfabric.colorsimport*
fromfabric.contrib.consoleimportconfirm
env.hosts=["root@115.28.×××××"]
env.password="×××××"
defget_git_status():
git_status_result=local("gitstatus",capture=True)
if"无文件要提交,干净的工作区"notingit_status_result:
printred("****当前分支还有文件没有提交")
printgit_status_result
abort("****已经终止")
deflocal_unit_test():
withsettings(warn_only=True):
test_result=local("pythonmanage.pytest")
iftest_result.failed:
printtest_result
ifnotconfirm(red("****单元测试失败,是否继续?")):
abort("****已经终止")
defserver_unit_test():
withsettings(warn_only=True):
test_result=run("pythonmanage.pytest")
iftest_result.failed:
printtest_result
ifnotconfirm(red("****单元测试失败,是否继续?")):
abort("****已经终止")
defupload_code():
local("gitpushorigindev")
printgreen("****代码上传成功")
defdeploy_at_server():
printgreen("****ssh到服务器进行下列操作")
withcd("/var/www/××××××"):
#printrun("pwd")
printgreen("****将在远程仓库下载代码")
run("gitcheckoutdev")
get_git_status()
run("gitpullorigindev")
printgreen("****将在服务器上运行单元测试")
server_unit_test()
run("serviceapache2restart",pty=False)
printgreen("****重启apache2成功")
printgreen("********代码部署成功********")
defdeploy():
get_git_status()
local("gitcheckoutdev",capture=False)
printgreen("****切换到dev分支")
get_git_status()
printgreen("****将开始运行单元测试")
local_unit_test()
printgreen("****单元测试完成,开始上传代码")
upload_code()
deploy_at_server()
fabric可以将自动化部署或者多机操作的命令固化到一个脚本里,从而减少手动的操作。上面是今天第一次接触这东西后写的,确实很实用。运行fabdeploy就行了。
主要逻辑就是将本地的dev分支跑单元测试,然后提交到服务器,ssh登陆到服务器,然后pull下来,再跑单元测试,然后重启apache2。第一次写,可能比较简单,将持续改进。