如何通过python的fabric包完成代码上传部署
Python  /  管理员 发布于 7年前   214
首先是安装fabric包
pip install fabric
fabric常用参数
-l : 显示定义好的任务函数名
-f : 指定fab入口文件,默认入口文件名为fabfile.py
-H : 指定目标主机,多台主机用","号分割
fabric常用API
local : 执行本地命令,如:local('uname -s')
lcd : 切换本地目录,如:lcd('/home')
cd : 切换远程目录,如:cd('/etc')
run : 执行远程命令,如:run('free -m')
sudo : sudo方式执行远程命令,如:sudo('touch /abc')
put : 上传本地文件到远程主机,如:put('/hello', '/home/baagee/hello')
get : 从远程主机下载文件到本地,如:get('/home/python/world', '/home/baagee/world')
reboot : 重启远程主机,如:reboot()
@task : 函数装饰器,标识的函数为fab可调用的,非标记的对fab不可见,纯业务逻辑
@runs_once : 函数装饰器,标识的函数只会执行一次,不受多台主机影响
fabric全局属性设定
env.hosts : 定义目标主机,如:env.hosts=['192.168.117.192', '192.168.117.193']
env.user : 定义用户名,如:env.user="root"
env.port : 定义目标主机端口,默认为22,如:env.port="22"
env.password : 定义密码,如:env.password="lijin"
env.passwords : 不同的主机不同的密码,如:env.passwords={'[email protected]:22':'lovelijin', '[email protected]:22':'lovebaagee'}
简单入门示例
from fabric.api import rundef host_type(): run('uname -s')
执行的话就不能用python fabfile.py执行了要使用:fab -f fabfile.py host_type -H [email protected]
意思就是-f指定文件,后面跟要执行的函数,-H指明登录用户名和host,
[root@localhost pythontest]# fab -f fabfile.py host_type -H [email protected][[email protected]] Executing task 'host_type'[[email protected]] run: uname -s[[email protected]] Login password for 'baagee':[[email protected]] out: Linux[[email protected]] out:Done.Disconnecting from [email protected]... done.[root@localhost pythontest]
示例1:动态获取远程目录列表
首先写个小例子熟悉一下这东西到底要怎么用:
from fabric.api import *env.hosts=['192.168.117.136']env.user='baagee'env.password = 'ubuntu@2017'@runs_oncedef input_raw(): return prompt("please input directory name:", default="/home")def workask(dirname): run('ls -l ' + dirname)@taskdef go(): print('start ...') getdirname = input_raw() workask(getdirname) print('end ...')
go函数是入口函数,首先获取用户输入的路径,然后ls它,显示里面的文件就是这么简单。
执行结果显示:
[root@localhost pythontest]# fab -f test3.py go[192.168.117.136] Executing task 'go'start ...please input directory name: [/home] /home/baagee/baagee-blog[192.168.117.136] run: ls -l /home/baagee/baagee-blog[192.168.117.136] out: 总用量 24[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee 0 8月 22 15:05 abcd[192.168.117.136] out: drwxrwxr-x 6 baagee baagee 4096 8月 3 10:37 Application[192.168.117.136] out: drwxrwxr-x 2 baagee baagee 4096 8月 3 10:37 DB_back[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee 1009 8月 3 10:37 index.php[192.168.117.136] out: drwxrwxr-x 3 baagee baagee 4096 8月 3 10:37 Public[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee 97 8月 3 10:37 README.md[192.168.117.136] out: drwxrwxr-x 8 baagee baagee 4096 8月 3 10:37 ThinkPHP[192.168.117.136] out:end ...Done.Disconnecting from 192.168.117.136... done.
熟悉了之后接下来就是写一个小程序将本地某个文件夹的代码上传到执行服务器,然后执行它;
示例2:上传文件并执行
首先写个小代码:(demo.py)
#coding:utf-8def add(a,b): print('开始计算a+b') print(a+b)add(9,1)
将本机centos7上的demo.py上传到ubuntu上并执行:
#coding:utf-8from fabric.api import *env.user = 'baagee'env.hosts = ['192.168.117.136']env.password = 'ubuntu@2017'@task@runs_oncedef tar_task(): #进入本地目录 with lcd('/home/vagrant/windowshare/pythontest'): #打包 local('tar zcvf demo.tar.gz demo.py')@taskdef put_task(): #创建远程服务器文件夹 run('mkdir -p /home/baagee/testdemo') with cd('/home/baagee/testdemo'): #上传文件 put('/home/vagrant/windowshare/pythontest/demo.tar.gz', '/home/baagee/testdemo/demo.tar.gz')@taskdef check_task(): #md5验证文件 lmd5 = local('md5sum /home/vagrant/windowshare/pythontest/demo.tar.gz', capture=True).split(' ')[0] rmd5 = run('md5sum /home/baagee/testdemo/demo.tar.gz').split(' ')[0] if lmd5 == rmd5: print('md5 OK ...') else: print('md5 ERROR ...')@taskdef run_task(): with cd('/home/baagee/testdemo'): run('tar zxvf demo.tar.gz') run('python demo.py')@taskdef go(): tar_task() put_task() check_task() run_task()
步骤就是
1,找到demo.py打包,。2,上传,。3,验证文件md5。4,然后就是解压执行。
也很简单,当然你也可以一次性填写多个host,将他们同时上传到多台服务器上。
最后程序在我centos上执行的效果是:
[root@localhost pythontest]# fab -f upload1.py go[192.168.117.136] Executing task 'go'[localhost] local: tar zcvf demo.tar.gz demo.pydemo.py[192.168.117.136] run: mkdir -p /home/baagee/testdemo[192.168.117.136] put: /home/vagrant/windowshare/pythontest/demo.tar.gz -> /home/baagee/testdemo/demo.tar.gz[localhost] local: md5sum /home/vagrant/windowshare/pythontest/demo.tar.gz[192.168.117.136] run: md5sum /home/baagee/testdemo/demo.tar.gz[192.168.117.136] out: 12b4bed255ad7afb6a53cc84bd7a25e7 /home/baagee/testdemo/demo.tar.gz[192.168.117.136] out:md5 OK ...[192.168.117.136] run: tar zxvf demo.tar.gz[192.168.117.136] out: demo.py[192.168.117.136] out:[192.168.117.136] run: python demo.py[192.168.117.136] out: 开始计算a+b[192.168.117.136] out: 10[192.168.117.136] out:Done.Disconnecting from 192.168.117.136... done.
最后结合git完成代码部署:
需要服务器和本地都需要安装git
#coding:utf-8from fabric.api import *#这两台服务器用户名和密码都一样,所以就不用env.passwords了env.user = 'baagee'env.hosts = ['192.168.117.192', '192.168.117.193']env.password = 'pythontestpass'@runs_once@taskdef local_update():#本地代码上传到git with lcd("/home/baagee/tmp/baageehello"): local("git add -A") local("git commit -m 'update'") local("git pull origin master") local("git push origin master")@taskdef remote_update():#服务器将git上的代码拉下来 with cd("/home/baagee/tmp/baageehello"): run("git checkout master") run("git pull origin master")@taskdef deploy():#本地上传 local_update() #服务器下拉 remote_update()
over。。。。。。。。。。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号