Python自動(dòng)化部署工具Fabric的簡(jiǎn)單上手指南
Fabric 是基于 SSH 協(xié)議的 Python 工具,相比傳統(tǒng)的 ssh/scp 方式,用 Python 的語(yǔ)法寫(xiě)管理命令更易讀也更容易擴(kuò)展,管理單臺(tái)或者多臺(tái)機(jī)器猶如本地操作一般。
官網(wǎng)地址:http://fabfile.org
安裝
省略python、pip管理工具安裝過(guò)程
pip install fabric
驗(yàn)證是否安裝成功
進(jìn)入python編輯模式,輸入代碼,無(wú)錯(cuò)即表示成功安裝
from fabric.api import local
fabric版hello world
fabric 默認(rèn)文件fabfile.py,當(dāng)然如果不想用這個(gè)名字,需要加-f參數(shù)
創(chuàng)建fabfile.py文件
vim fabrile.py
編輯代碼
#coding:utf-8
from fabric.api import local#
def hello():
# local函數(shù)用來(lái)執(zhí)行本地命令
local('echo "hello wolrd!"')
執(zhí)行代碼
fab hello
可以通過(guò)fab -l查看可以執(zhí)行的任務(wù),當(dāng)前為hello函數(shù)
運(yùn)行結(jié)果
[localhost] local: echo "hello world!" hello world! Done.
傳統(tǒng)維護(hù)方法:
$ ssh x.x.x.x 'uname -a' -- 輸出略
Fabric 示例:
$ cat fabfile.py
from fabric.api import run
def uname():
run('uname -a')
$ fab -H x.x.x.x uname -- 輸出略
肉眼直觀看上去,貌似比 ssh 方式要寫(xiě)不少代碼,但是基于 ssh 方式中間可控環(huán)節(jié)比較少,例如:你想判斷某服務(wù)是否已經(jīng)啟動(dòng),沒(méi)有啟動(dòng)則執(zhí)行啟動(dòng)等等操作。ssh 命令式的做法稍顯麻煩。(當(dāng)然齷齪一點(diǎn)可以在被操作機(jī)器上寫(xiě)好一個(gè)腳本,ssh 調(diào)用這個(gè)腳本)
說(shuō)幾個(gè) Fabric 的優(yōu)點(diǎn)吧:
- 角色定義
- 代碼易讀
- 封裝了本地、遠(yuǎn)程操作(還需要自己封裝system/popen/ssh操作么?)
- 參數(shù)靈活(動(dòng)態(tài)指定 host/role 等,還有并發(fā)執(zhí)行 基于multiprocessing )
- 完整的日志輸出
羅列的這些,其實(shí)日常工作里基本都有類似的封裝了,但是有現(xiàn)成的一個(gè)成熟的工具,干啥不用呢?對(duì)吧。
常用的配置:
- env.host -- 主機(jī)ip,當(dāng)然也可以-H參數(shù)指定
- env.password -- 密碼,打好通道的請(qǐng)無(wú)視
- env.roledefs -- 角色分組,比如:{'web': ['x', 'y'], 'db': ['z']}
- fab -l -- 顯示可用的task(命令)
- fab -H -- 指定host,支持多host逗號(hào)分開(kāi)
- fab -R -- 指定role,支持多個(gè)
- fab -P -- 并發(fā)數(shù),默認(rèn)是串行
- fab -w -- warn_only,默認(rèn)是碰到異常直接abort退出
- fab -f -- 指定入口文件,fab默認(rèn)入口文件是:fabfile/fabfile.py
更多請(qǐng)參考:fab --help
常用的函數(shù):
- local('pwd') -- 執(zhí)行本地命令
- lcd('/tmp') -- 切換本地目錄
- cd('/tmp') -- 切換遠(yuǎn)程目錄
- run('uname -a') -- 執(zhí)行遠(yuǎn)程命令
- sudo('/etc/init.d/nginx start') -- 執(zhí)行遠(yuǎn)程sudo,注意pty選項(xiàng)
示例1:管理遠(yuǎn)程 nginx 服務(wù)
$ cat fabfile.py
from fabric.api import *
@task
def nginx_start():
''' nginx start '''
sudo('/etc/init.d/nginx start')
@task
def nginx_stop():
''' nginx stop '''
sudo('/etc/init.d/nginx stop')
$ fab --list -- 查看可用命令 Available commands: nginx_start nginx start nginx_stop nginx stop $ fab -H x.x.x.x nginx_start -- 啟動(dòng) nginx
示例2:基于角色
$ cat fabfile.py
from fabric.api import *
env.roledefs = {'nginx': ['x.x.x.x', 'y.y.y.y'], 'mysql': 'z.z.z.z'}
@task
def mysql_start()
''' mysql start '''
sudo('/etc/init.d/mysql start')
$ fab --list -- 查看可用命令 Available commands: nginx_start nginx start nginx_stop nginx stop mysql_start mysql start $ fab -R nginx nginx_start -- 啟動(dòng) nginx $ fab -R mysql mysql_start -- 啟動(dòng) mysql
示例3:混合本地和遠(yuǎn)程操作
$ cat fabfile
def hello():
''' test hello '''
with lcd('/tmp'): # 切換到 /tmp 目錄下
local('svn co http://xxx xxx') # check 代碼到本地
local('tar czf xxx.tar.gz xxx/') # 壓縮本地包
put('xxx.tar.gz', '/tmp') # 上傳壓縮包到遠(yuǎn)程 /tmp 目錄下
with cd('/tmp'): # 切換到遠(yuǎn)程 /tmp 目錄
run('tar zxf xxx.tar.gz') # 遠(yuǎn)程解壓
是不是看上去都是像本地一樣?對(duì)吧。
示例4:多個(gè)目標(biāo)服務(wù)器
相同密碼或者手動(dòng)輸入:
env.hosts = ['root@ip1:22',root@ip2:22]
不同密碼或者不想手動(dòng)輸入(此方法也可定義不角色一組服務(wù)器):
#coding:utf-8
from fabric.api import local,cd,put,lcd,env,run,execute,roles
env.roledefs = {
'role1':['root@ip1:22',],
'role2':['root@ip2:22',]
}
env.passwords={
'root@ip1:22':'pwd1',
'root@ip2:22':'pwd2'
}
@roles('role1')
def role1():
with cd('/tmp'):
run('ls -l')
@roles('role2')
def role2():
with cd('/tmp'):
run('ls')
def task():
execute(role1)
execute(role2)
相關(guān)文章
Django數(shù)據(jù)庫(kù)遷移報(bào)錯(cuò)InconsistentMigrationHistory
最近在使用Django,學(xué)習(xí)了一下Django數(shù)據(jù)庫(kù)遷移,在執(zhí)行遷移命令時(shí),突然報(bào)錯(cuò),本文就總結(jié)了一下原因,感興趣的小伙伴們可以參考一下2021-05-05
pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法
今天小編就為大家分享一篇pyqt遠(yuǎn)程批量執(zhí)行Linux命令程序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
對(duì)python append 與淺拷貝的實(shí)例講解
今天小編就為大家分享一篇對(duì)python append 與淺拷貝的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
使用Python來(lái)批量檢測(cè)并刪除Word文檔中的宏
Word文檔作為最常用的電子文檔格式之一,經(jīng)常被用來(lái)作為內(nèi)容分享工具,在網(wǎng)絡(luò)中或設(shè)備之間進(jìn)行傳輸,其安全性也需要受到關(guān)注,宏是可嵌入Word文檔中的一種VBA迷你程序,本文將介紹如何使用Python來(lái)批量檢測(cè)并刪除Word文檔中的宏,保護(hù)計(jì)算機(jī)的安全,需要的朋友可以參考下2024-07-07
零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

