簡介
Fabric是基於Python實現的SSH命令行工具,簡化了SSH的應用程序部署及系統管理任務,它提供了系統基礎大操作組件,可以實現本地或遠程shell命令,包括:命令執行、文件上傳、下載及完整執行日志輸出等功能。Fabric在Paramiko的基礎上做了更高一層的封裝,操作起來會更加簡單。
安裝Fabric
安裝pip命令 yum -y install epel-release yum install python-pip pip install --upgrade pip(升級) 安裝依賴包 yum install -y openssl openssl-devel gcc gcc-c++ python-devel 安裝Fabric pip install fabric
命令說明
格式 fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...]... 常用參數 -l 顯示定義好的任務函數名 -f 指定fab入口文件,默認入口文件名為fabfile.py -g 指定網關(中轉)設備,比如堡壘機環境,填寫堡壘機ip即可 -H 指定目標主機,多台主機用","號分隔 -P 以異步並行方式運行多主機任務,默認是串行運行 -p 遠程帳號的密碼,fab執行時默認使用root賬戶 -R 指定roel(角色),以角色名區分不同業務組設備 -t 設置設備連接超時時間(秒) -T 設置遠程主機命令執行超時時間(秒) -w 當命令執行失敗,發出警告,而非默認中止任務
示例
編寫一個fabfile.py文件

fab命令操作

上面實例也可以寫成一行代碼

fabfile文件編寫
fab命令是結合fabfile.py文件(其他文件通過-f filename參數來引用)來搭配使用的。fab的部分命令行參數還能通過相應的方法來代替,如:

fabfile之env對象
env對象的最用是定義fabfile的全局設定,就像上面的舉例,下面對個屬性進行說明: env.hosts: 定義目標主機,可以用IP或主機名表示,以python的列表形式定義。如env.hosts=["192.168.88.2", "192.168.88.3"] env.exclude_hosts: 排除指定主機,如env.exclude_hosts=['192.168.88.2'] env.user 定義用戶名,如env.user='root' env.port 定義端口,默認為22,如env.port='22' env.password 定義密碼,如env.password='123.com' env.passwords 定義多個密碼,不同主機對應不同密碼,如:env.passwords={'root@192.168.88.2:22':'123.com', 'root@192.168.88.2:22':'123456'} env.gateway 定義網關(中轉,堡壘機)ip,如env.gateway='192.168.88.10' env.roledefs 定義角色組,比如web組合db組主機區分開來env_roledefs={'webserver':['192.168.88.2', '192.168.88.3'], 'dbserver':['192.168.88.4']} env.deploy_release_dir 自定義全局變量,格式:env. + '變量名', 如env.age, env.sex等
env.roledefs的使用方法實例

Fabric常用API
local 執行本地命令,如local('uname -s') lcd 切換本地目錄,如lcd('/home') cd 切換遠程目錄 run 執行遠程命令 sudo sudo 方式執行遠程命令,如sudo('/etc/init.d/httpd start') put 上傳本地文件到遠程主機,如put('/home/user.info', '/data/user.info') get 從遠程主機下載文件到本地,如get('/data/user.info', '/home/user.info') prompt 獲得用戶輸入信息,如prompt('please input user password:') confirm 獲得提示信息確認,如confirm('Test faild, Continue[Y/N]?') reboot 重啟遠程主機,如reboot() @task 函數裝飾符,標識的函數為fab可調用,非標記對fab不可見,純業務邏輯 @runs_once 函數裝飾符,標識的函數只會執行一次,不受多台主機影響
Fabric應用示例說明
查看本地與遠程主機信息
本示例調用local方法執行本地命令,添加@runs_once修飾符保證任務函數只執行一次,調用run方法執行遠程命令

動態獲取遠程目錄列表
本例調用@task修飾符標志入口函數go()對外部可見,配合@runs_once修飾符接收用戶輸入,最后調用worktask()函數實現遠程命令

查看定義的函數名

執行

測試發現:
①設置了默認值,不輸入就是以默認值為准,如果不設置默認值,那么dirname就是空的,ls -l的就是你登錄用戶的家目錄
②對於寫在go函數的內容,有多少主機就會循環多少次,它是以主機為循環的
③這個腳本是對於所有主機列出同一個目錄,對於不同的主機選擇不同的目錄,可以簡單的修改為:

文件打包校驗(把context_manages 改為context_managers)

這樣我們可以分開執行,也可以執行go函數達到一鍵執行的目的

網關模式文件上傳與執行
本例通過定義env.gateway網關模式,即熟稱的中轉、堡壘機環境。通過網關對其他主機進行文件上傳和執行

堡壘機環境:
192.168.88.1(Fabric) ------------->192.168.88.2---------------->192.168.88.3
(堡壘機) ---------------->192.168.88.4
之前看到上面的腳本不是很理解,感覺192.168.88.2是多余的。其實這種想法是錯誤的。上面腳本的目的是把88.1里面的文件包通過88.2中轉 來傳輸到88.3、88.4並執行。並不是88.2直接傳輸到88.3、88.4。那么這樣做有什么作用呢?我通過實驗:88.3和88.4開啟防火牆丟棄88.1所
有的包,但是接收88.2的包,這種情況下,價值就體現出來了。88.1並不能聯通88.3,88.4。但是作為堡壘機88.2可以。如果我們不用網關模式
是不能夠完成88.1直接傳輸文件到88.2,88.3,也不能夠執行遠程命令。
生產案例--代碼包發布管理

生產案例--分發SSH key
