Fabric自動化運維工具


簡介

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

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM