如何通过python的fabric包完成代码上传部署
首先是安装fabric包
pipinstallfabric
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={'baagee@192.168.117.192:22':'lovelijin','lijin@192.168.117.193:22':'lovebaagee'}
简单入门示例
fromfabric.apiimportrun defhost_type(): run('uname-s')
执行的话就不能用pythonfabfile.py执行了要使用:fab-ffabfile.pyhost_type-Hbaagee@192.168.117.136
意思就是-f指定文件,后面跟要执行的函数,-H指明登录用户名和host,
[root@localhostpythontest]#fab-ffabfile.pyhost_type-Hbaagee@192.168.117.136 [baagee@192.168.117.136]Executingtask'host_type' [baagee@192.168.117.136]run:uname-s [baagee@192.168.117.136]Loginpasswordfor'baagee': [baagee@192.168.117.136]out:Linux [baagee@192.168.117.136]out: Done. Disconnectingfrombaagee@192.168.117.136...done. [root@localhostpythontest]
示例1:动态获取远程目录列表
首先写个小例子熟悉一下这东西到底要怎么用:
fromfabric.apiimport* env.hosts=['192.168.117.136'] env.user='baagee' env.password='ubuntu@2017' @runs_once definput_raw(): returnprompt("pleaseinputdirectoryname:",default="/home") defworkask(dirname): run('ls-l'+dirname) @task defgo(): print('start...') getdirname=input_raw() workask(getdirname) print('end...')
go函数是入口函数,首先获取用户输入的路径,然后ls它,显示里面的文件就是这么简单。
执行结果显示:
[root@localhostpythontest]#fab-ftest3.pygo [192.168.117.136]Executingtask'go' start... pleaseinputdirectoryname:[/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--1baageebaagee08月2215:05abcd [192.168.117.136]out:drwxrwxr-x6baageebaagee40968月310:37Application [192.168.117.136]out:drwxrwxr-x2baageebaagee40968月310:37DB_back [192.168.117.136]out:-rw-rw-r--1baageebaagee10098月310:37index.php [192.168.117.136]out:drwxrwxr-x3baageebaagee40968月310:37Public [192.168.117.136]out:-rw-rw-r--1baageebaagee978月310:37README.md [192.168.117.136]out:drwxrwxr-x8baageebaagee40968月310:37ThinkPHP [192.168.117.136]out: end... Done. Disconnectingfrom192.168.117.136...done.
熟悉了之后接下来就是写一个小程序将本地某个文件夹的代码上传到执行服务器,然后执行它;
示例2:上传文件并执行
首先写个小代码:(demo.py)
#coding:utf-8 defadd(a,b): print('开始计算a+b') print(a+b) add(9,1)
将本机centos7上的demo.py上传到ubuntu上并执行:
#coding:utf-8 fromfabric.apiimport* env.user='baagee' env.hosts=['192.168.117.136'] env.password='ubuntu@2017' @task @runs_once deftar_task(): #进入本地目录 withlcd('/home/vagrant/windowshare/pythontest'): #打包 local('tarzcvfdemo.tar.gzdemo.py') @task defput_task(): #创建远程服务器文件夹 run('mkdir-p/home/baagee/testdemo') withcd('/home/baagee/testdemo'): #上传文件 put('/home/vagrant/windowshare/pythontest/demo.tar.gz','/home/baagee/testdemo/demo.tar.gz') @task defcheck_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] iflmd5==rmd5: print('md5OK...') else: print('md5ERROR...') @task defrun_task(): withcd('/home/baagee/testdemo'): run('tarzxvfdemo.tar.gz') run('pythondemo.py') @task defgo(): tar_task() put_task() check_task() run_task()
步骤就是
1,找到demo.py打包,。2,上传,。3,验证文件md5。4,然后就是解压执行。
也很简单,当然你也可以一次性填写多个host,将他们同时上传到多台服务器上。
最后程序在我centos上执行的效果是:
[root@localhostpythontest]#fab-fupload1.pygo [192.168.117.136]Executingtask'go' [localhost]local:tarzcvfdemo.tar.gzdemo.py demo.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: md5OK... [192.168.117.136]run:tarzxvfdemo.tar.gz [192.168.117.136]out:demo.py [192.168.117.136]out: [192.168.117.136]run:pythondemo.py [192.168.117.136]out:开始计算a+b [192.168.117.136]out:10 [192.168.117.136]out: Done. Disconnectingfrom192.168.117.136...done.
最后结合git完成代码部署:
需要服务器和本地都需要安装git
#coding:utf-8 fromfabric.apiimport* #这两台服务器用户名和密码都一样,所以就不用env.passwords了 env.user='baagee' env.hosts=['192.168.117.192','192.168.117.193'] env.password='pythontestpass' @runs_once @task deflocal_update(): #本地代码上传到git withlcd("/home/baagee/tmp/baageehello"): local("gitadd-A") local("gitcommit-m'update'") local("gitpulloriginmaster") local("gitpushoriginmaster") @task defremote_update(): #服务器将git上的代码拉下来 withcd("/home/baagee/tmp/baageehello"): run("gitcheckoutmaster") run("gitpulloriginmaster") @task defdeploy(): #本地上传 local_update() #服务器下拉 remote_update()
over。。。。。。。。。。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。