如何通過python的fabric包完成代碼上傳部署
首先是安裝fabric包
pip install fabric
fabric常用參數(shù)
-l : 顯示定義好的任務(wù)函數(shù)名
-f : 指定fab入口文件,默認入口文件名為fabfile.py
-H : 指定目標(biāo)主機,多臺主機用","號分割
fabric常用API
local : 執(zhí)行本地命令,如:local('uname -s')
lcd : 切換本地目錄,如:lcd('/home')
cd : 切換遠程目錄,如:cd('/etc')
run : 執(zhí)行遠程命令,如:run('free -m')
sudo : sudo方式執(zhí)行遠程命令,如:sudo('touch /abc')
put : 上傳本地文件到遠程主機,如:put('/hello', '/home/baagee/hello')
get : 從遠程主機下載文件到本地,如:get('/home/python/world', '/home/baagee/world')
reboot : 重啟遠程主機,如:reboot()
@task : 函數(shù)裝飾器,標(biāo)識的函數(shù)為fab可調(diào)用的,非標(biāo)記的對fab不可見,純業(yè)務(wù)邏輯
@runs_once : 函數(shù)裝飾器,標(biāo)識的函數(shù)只會執(zhí)行一次,不受多臺主機影響
fabric全局屬性設(shè)定
env.hosts : 定義目標(biāo)主機,如:env.hosts=['192.168.117.192', '192.168.117.193']
env.user : 定義用戶名,如:env.user="root"
env.port : 定義目標(biāo)主機端口,默認為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'}
簡單入門示例
from fabric.api import run def host_type(): run('uname -s')
執(zhí)行的話就不能用python fabfile.py執(zhí)行了要使用:fab -f fabfile.py host_type -H baagee@192.168.117.136
意思就是-f指定文件,后面跟要執(zhí)行的函數(shù),-H指明登錄用戶名和host,
[root@localhost pythontest]# fab -f fabfile.py host_type -H baagee@192.168.117.136 [baagee@192.168.117.136] Executing task 'host_type' [baagee@192.168.117.136] run: uname -s [baagee@192.168.117.136] Login password for 'baagee': [baagee@192.168.117.136] out: Linux [baagee@192.168.117.136] out: Done. Disconnecting from baagee@192.168.117.136... done. [root@localhost pythontest]
示例1:動態(tài)獲取遠程目錄列表
首先寫個小例子熟悉一下這東西到底要怎么用:
from fabric.api import * env.hosts=['192.168.117.136'] env.user='baagee' env.password = 'ubuntu@2017' @runs_once def input_raw(): return prompt("please input directory name:", default="/home") def workask(dirname): run('ls -l ' + dirname) @task def go(): print('start ...') getdirname = input_raw() workask(getdirname) print('end ...')
go函數(shù)是入口函數(shù),首先獲取用戶輸入的路徑,然后ls它,顯示里面的文件就是這么簡單。
執(zhí)行結(jié)果顯示:
[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.
熟悉了之后接下來就是寫一個小程序?qū)⒈镜啬硞€文件夾的代碼上傳到執(zhí)行服務(wù)器,然后執(zhí)行它;
示例2:上傳文件并執(zhí)行
首先寫個小代碼:(demo.py)
#coding:utf-8 def add(a,b): print('開始計算a+b') print(a+b) add(9,1)
將本機centos7上的demo.py上傳到ubuntu上并執(zhí)行:
#coding:utf-8 from fabric.api import * env.user = 'baagee' env.hosts = ['192.168.117.136'] env.password = 'ubuntu@2017' @task @runs_once def tar_task(): #進入本地目錄 with lcd('/home/vagrant/windowshare/pythontest'): #打包 local('tar zcvf demo.tar.gz demo.py') @task def put_task(): #創(chuàng)建遠程服務(wù)器文件夾 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') @task def 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 ...') @task def run_task(): with cd('/home/baagee/testdemo'): run('tar zxvf demo.tar.gz') run('python demo.py') @task def go(): tar_task() put_task() check_task() run_task()
步驟就是
1,找到demo.py打包,。2,上傳,。3,驗證文件md5。4,然后就是解壓執(zhí)行。
也很簡單,當(dāng)然你也可以一次性填寫多個host,將他們同時上傳到多臺服務(wù)器上。
最后程序在我centos上執(zhí)行的效果是:
[root@localhost pythontest]# fab -f upload1.py go [192.168.117.136] Executing task 'go' [localhost] local: tar zcvf demo.tar.gz demo.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: 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.
最后結(jié)合git完成代碼部署:
需要服務(wù)器和本地都需要安裝git
#coding:utf-8 from fabric.api import * #這兩臺服務(wù)器用戶名和密碼都一樣,所以就不用env.passwords了 env.user = 'baagee' env.hosts = ['192.168.117.192', '192.168.117.193'] env.password = 'pythontestpass' @runs_once @task def 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") @task def remote_update(): #服務(wù)器將git上的代碼拉下來 with cd("/home/baagee/tmp/baageehello"): run("git checkout master") run("git pull origin master") @task def deploy(): #本地上傳 local_update() #服務(wù)器下拉 remote_update()
over。。。。。。。。。。。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
循環(huán)神經(jīng)網(wǎng)絡(luò)TextRNN實現(xiàn)情感短文本分類任務(wù)
這篇文章主要為大家介紹了循環(huán)神經(jīng)網(wǎng)絡(luò)TextRNN實現(xiàn)情感短文本分類任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04python獲得linux下所有掛載點(mount points)的方法
這篇文章主要介紹了python獲得linux下所有掛載點(mount points)的方法,涉及Python操作Linux下掛載點的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04pytorch torchvision.ImageFolder的用法介紹
今天小編就為大家分享一篇pytorch torchvision.ImageFolder的用法介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02詳談python3中用for循環(huán)刪除列表中元素的坑
下面小編就為大家分享一篇詳談python3中用for循環(huán)刪除列表中元素的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python基礎(chǔ)數(shù)據(jù)類型tuple元組的概念與用法
元組(tuple)是 Python 中另一個重要的序列結(jié)構(gòu),和列表類似,元組也是由一系列按特定順序排序的元素組成,這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)數(shù)據(jù)類型tuple元組的概念與使用方法,需要的朋友可以參考下2021-07-07