Fabric是基于Python實(shí)現(xiàn)的SSH命令行工具,簡化了SSH的應(yīng)用程序部署及系統(tǒng)管理任務(wù),它提供了系統(tǒng)基礎(chǔ)的操作組件,可以實(shí)現(xiàn)本地或遠(yuǎn)程shell命令,包括:命令執(zhí)行、文件上傳、下載及完整執(zhí)行日志輸出等功能。Fabric在Paramiko的基礎(chǔ)上做了更高一層的封裝,操作起來會(huì)更加簡單。下面用3個(gè)常用的實(shí)例來帶大家學(xué)習(xí)Fabric。
命令說明
命令格式:
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...
常用參數(shù):
-l #顯示定義好的任務(wù)函數(shù)名
-f #指定fab入口文件,默認(rèn)入口文件名為fabfile.py
-f #指定網(wǎng)關(guān)(中轉(zhuǎn))設(shè)備,比如堡壘機(jī)環(huán)境,填寫堡壘機(jī)IP即可
-H #指定目標(biāo)主機(jī),多臺(tái)主機(jī)用‘,’號(hào)分隔
-p #遠(yuǎn)程賬號(hào)的密碼,fab執(zhí)行時(shí)默認(rèn)使用root賬戶
-P #以異步并行方式運(yùn)行多主機(jī)任務(wù),默認(rèn)為串行運(yùn)行
-R #指定role(角色),以角色名區(qū)分不同業(yè)務(wù)組設(shè)備
-t #設(shè)置設(shè)備連接超時(shí)時(shí)間(秒)
-T #設(shè)置遠(yuǎn)程主機(jī)命令執(zhí)行超時(shí)時(shí)間(秒)
-w #當(dāng)命令執(zhí)行失敗,發(fā)出警告,而非默認(rèn)中止任務(wù)。
實(shí)例
1、查看本地與遠(yuǎn)程主機(jī)信息
本示例調(diào)用local方法執(zhí)行本地命令,添加@runs_once修飾符保證任務(wù)函數(shù)只執(zhí)行一次,調(diào)用run方法執(zhí)行遠(yuǎn)程命令。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from fabric.api import *
env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'
@runs_once #查看本地系統(tǒng)信息,當(dāng)有多臺(tái)主機(jī)時(shí)只運(yùn)行一次
def local_task(): #本地任務(wù)函數(shù)
local('uname -a')
def remote_task():
with cd('/var/logs'): #with的作用是讓后面的表達(dá)式語句繼承當(dāng)前狀態(tài),實(shí)現(xiàn):cd /var/logs && ls -l的效果
run('ls -l')
simple1.py
執(zhí)行:
fab -f simple1.py local_task
fab -f simple1.py remote_task
2、動(dòng)態(tài)獲取遠(yuǎn)程目錄列表
本例調(diào)用@task修飾符標(biāo)志入口函數(shù)go()對(duì)外部可見,配合@runs_once修飾符接收用戶輸入,最后調(diào)用worktask()函數(shù)實(shí)現(xiàn)遠(yuǎn)程命令執(zhí)行。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from fabric.api import *
env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'
@runs_once #主機(jī)遍歷過程中,只有第一臺(tái)觸發(fā)此函數(shù)
def input_raw():
return prompt('please input directoryname:',default='/root')
def worktask(dirname):
run('ls -l'+dirname)
@task #限定只有go函數(shù)對(duì)fab命令可見,其他沒有使用@task標(biāo)記的函數(shù)fab命令不可用
def go():
getdirname = input_raw()
worktask(getdirname)
simple2.py
執(zhí)行:
fab -f simple2.py go
3、網(wǎng)關(guān)模式文件上傳與執(zhí)行
本例通過定義env.gateway網(wǎng)關(guān)模式,即俗稱的中轉(zhuǎn)、堡壘機(jī)環(huán)境。通過網(wǎng)關(guān)對(duì)其他主機(jī)進(jìn)行文件上傳和執(zhí)行。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
env.user = 'root'
env.gateway = '192.168.1.23' #定義堡壘機(jī)IP,作為文件上傳、執(zhí)行的中轉(zhuǎn)設(shè)置
env.hosts = ['192.168.1.21','192.168.1.22']
env.passwords = {
'root@192.168.1.21:22':'123456',
'root@192.168.1.22:22':'abcdef',
'root@192.168.1.23:22':'123abc', #堡壘機(jī)賬號(hào)信息
}
lpackpath = '/home/install/lnmp.tar.gz' #本地安裝包路徑
rpackpath = '/tmp/install' #遠(yuǎn)程安裝包路徑
@task
def put_task(): #上傳文件
run('mkdir -p /tmp/install')
#默認(rèn)情況下,當(dāng)命令執(zhí)行失敗時(shí),Fabric會(huì)停止執(zhí)行后續(xù)命令。有時(shí),我們允許忽略失敗的命令繼續(xù)執(zhí)行,比如run(‘rm /tmp/abc')在文件不存在的時(shí)候有可能失敗,這時(shí)可以用with settings(warn_only=True):執(zhí)行命令,這樣Fabric只會(huì)打出警告信息而不會(huì)中斷執(zhí)行。
with settings(warn_only=True):
result = put(lpackpath,rpackpath) #上傳
if result.failed and not confirm('put file failed,Continue[Y/N]?'):
abort('Aborting file put task!')
@task
def run_task(): #安裝
with cd('/tmp/install'):
run('tar -zxvf lnmp.tar.gz')
with cd('lnmp/'): #使用with繼承/tmp/install目錄位置狀態(tài)
run('./centos.sh')
@task
def go(): #上傳、安裝組合命令
put_task()
run_task()
simple3.py
simple3.py
執(zhí)行:
#上傳文件fab simple3.py put_task#執(zhí)行文件fab simple3.py run_task#上傳并執(zhí)行
fab simple3.py go
文章來自:博客園/MacoLee