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。第一次写,可能比较简单,将持续改进。