python fabric使用
作用
很強大的工具
可以將自動化部署或者多機操作的命令固化到一個腳本里
和某些運維工具很像,用它主要是因為,Python…..
簡單好用易上手
當然,shell各種命令組合起來也可以,上古神器和現代兵器的區別
環境配置
在本機和目標機器安裝對應包(注意,都要有)
sudo?easy_install?fabric目前是1.6版本(或者用pip install,一樣的)
安裝完后,可以查看是否安裝成功
[ken@~$]?which?fab /usr/local/bin/fab裝完之后,可以瀏覽下官方文檔
然后,可以動手了
hello world
先進行本機簡單操作,有一個初步認識,例子來源與官網
新建一個py腳本: fabfile.py
def?hello():print("Hello?world!")命令行執行:
[ken@~/tmp/fab$]?fab?hello Hello?world!Done.注意,這里可以不用fabfile作為文件名,但是在執行時需指定文件
[ken@~/tmp/fab$]?mv?fabfile.py?test.py fabfile.py?->?test.py [ken@~/tmp/fab$]?fab?helloFatal?error:?Couldn't?find?any?fabfiles!Remember?that?-f?can?be?used?to?specify?fabfile?path,?and?use?-h?for?help.Aborting. [ken@~/tmp/fab$]?fab?-f?test.py?hello Hello?world!Done.帶參數:
修改fabfile.py腳本:
def?hello(name,?value):print("%s?=?%s!"?%?(name,?value))執行
[ken@~/tmp/fab$]?fab?hello:name=age,value=20 age?=?20!Done. [ken@~/tmp/fab$]?fab?hello:age,20 age?=?20!Done.執行本機操作
簡單的本地操作:
from?fabric.api?import?localdef?lsfab():local('cd?~/tmp/fab')local('ls')結果:
[ken@~/tmp/fab$]?pwd;ls /Users/ken/tmp/fab fabfile.py???fabfile.pyc??test.py??????test.pyc [ken@~/tmp/fab$]?fab?-f?test.py?lsfab [localhost]?local:?cd?~/tmp/fab [localhost]?local:?ls fabfile.py??fabfile.pyc?test.py?????test.pycDone.實戰開始:
假設,你每天要提交一份配置文件settings.py到版本庫(這里沒有考慮沖突的情況)
如果是手工操作:
cd?/home/project/test/conf/ git?add?settings.py git?commit?-m?'daily?update?settings.py' git?pull?origin git?push?origin也就是說,這幾個命令你每天都要手動敲一次,所謂daily job,就是每天都要重復的,機械化的工作,讓我們看看用fabric怎么實現一鍵搞定:(其實用shell腳本可以直接搞定,但是fab的優勢不是在這里,這里主要位后面本地+遠端操作做準備,畢竟兩個地方的操作寫一種腳本便于維護)
from?fabric.api?import?localdef?setting_ci():local("cd?/home/project/test/conf/")local("git?add?settings.py")#后面你懂的,懶得敲了…..混搭整合遠端操作
這時候,假設,你要到機器A的/home/ken/project對應項目目錄把配置文件更新下來
#!/usr/bin/env?python #?encoding:?utf-8from?fabric.api?import?local,cd,runenv.hosts=['user@ip:port',]?#ssh要用到的參數 env.password?=?'pwd'def?setting_ci():local('echo?"add?and?commit?settings?in?local"')#剛才的操作換到這里,你懂的def?update_setting_remote():print?"remote?update"with?cd('~/temp'):???#cd用于進入某個目錄run('ls?-l?|?wc?-l')??#遠程操作用rundef?update():setting_ci()update_setting_remote()然后,執行之:
[ken@~/tmp/fab$]?fab?-f?deploy.py?update [user@ip:port]?Executing?task?'update' [localhost]?local:?echo?"add?and?commit?settings?in?local" add?and?commit?settings?in?local remote?update [user@ip:port]?run:?ls?-l?|?wc?-l [user@ip:port]?out:?12 [user@ip:port]?out:Done.注意,如果不聲明env.password,執行到對應機器時會跳出要求輸入密碼的交互
多服務器混搭
操作多個服務器,需要配置多個host
#!/usr/bin/env?python #?encoding:?utf-8from?fabric.api?import?*#操作一致的服務器可以放在一組,同一組的執行同一套操作 env.roledefs?=?{'testserver':?['user1@host1:port1',],??'realserver':?['user2@host2:port2',?]}#env.password?=?'這里不要用這種配置了,不可能要求密碼都一致的,明文編寫也不合適。打通所有ssh就行了'@roles('testserver') def?task1():run('ls?-l?|?wc?-l')@roles('realserver') def?task2():run('ls?~/temp/?|?wc?-l')def?dotask():execute(task1)execute(task2)結果:
[ken@~/tmp/fab$]?fab?-f?mult.py?dotask [user1@host1:port1]?Executing?task?'task1' [user1@host1:port1]?run:?ls?-l?|?wc?-l [user1@host1:port1]?out:?9 [user1@host1:port1]?out:[user2@host2:port2]?Executing?task?'task2' [user2@host2:port2]?run:?ls?~/temp/?|?wc?-l [user2@host2:port2]?out:?11 [user2@host2:port2]?out:Done.擴展
1.顏色
可以打印顏色,在查看操作結果信息的時候更為醒目和方便
from?fabric.colors?import?*def?show():print?green('success')print?red('fail')print?yellow('yellow') #fab?-f?color.py?show2.錯誤和異常
關于錯誤處理
默認,一組命令,上一個命令執行失敗后,不會接著往下執行
失敗后也可以進行不一樣的處理,?文檔
目前沒用到,后續用到再看了
3.密碼管理
看文檔
更好的密碼管理方式,哥比較土,沒打通,主要是服務器列表變化頻繁,我的處理方式是:
1.host,user,port,password配置列表,所有的都寫在一個文件
或者直接搞到腳本里,當然這個更........
env.hosts = [
'host1',
'host2'
]
env.passwords = {?
'host1': "pwdofhost1",
'host2': "pwdofhost2",
}
?或者
?
env.roledefs = {
'testserver': ['host1', 'host2'],
'realserver': ['host3', ]
}
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
'host3': "pwdofhost3",?
}?
2.根據key解析成map嵌套,放到deploy中
另外命令其實也可以固化成一個cmds列表的…..
初略就用到這些,后續有更多需求的時候再去撈文檔了,話說文檔里好東西真多,就是太多了,看了暈。。。
The end!
轉載于:https://blog.51cto.com/03301216/1871154
總結
以上是生活随笔為你收集整理的python fabric使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: offsetLeft和style.lef
- 下一篇: 关于虚拟机迁移文档(p2v v2v