fabric是一款命令行工具,支持執行本地命令,執行遠程命令,上傳下載等。fabric想一個subprocess+paramiko的集合,又像一個更加輕量級的ansible,可以批量對服務進行操作。
官方文檔地址,安裝方法:
pip3 install fabric3
fabric.api中的常用操作
- 執行命令
- local('命令'): 本地執行命令
- run('命令'):在服務器上執行命令
- sudo('命令'): 在服務器上執行sudo命令
- abort('顯示消息'): 終止任務
- confirm('用戶確認Y/N'): 暫停並等待用戶確認
- 上傳下載
- put('本地文件', '服務器文件'): 上傳文件
- get('服務器文件', '本地文件'): 下載文件
- 設置
- settings: 命令輸出設置
- hide: 隱藏命令輸出
- env: 服務器地址,用戶密碼信息設置
- 任務
- exectue(任務函數, 函數參數):執行一個任務
編寫fab腳本
fabic需要新建一個文件,並定義函數使用,使用方式如下。
新建一個腳本,如task.py,內容如下
from fabric import api as fab # 導入fabric的api,給個別名為fab
def task1():
print('執行本地命令')
fab.local('ls') # 使用local可以執行本地命令
執行fab腳本
命令執行
腳本執行方式有兩種,一種是命令行使用fab命令執行,如
fab -f task.py task1
-f
指定腳本文件, 后面跟要運行的函數
當函數有參數時,如
def task2(path):
fab.local(f'ls {path}')
執行fab命令傳入參數的方式如下
fab -f task.py task1:path=/usr/local
腳本中執行
另外也可以直接在腳本中使用execute執行任務
from fabric import api as fab # 導入fabric的api,給個別名為fab
def task1():
print('執行本地命令')
fab.local('ls') # 使用local可以執行本地命令
def task2(path):
fab.local(f'ls {path}')
if __name__ == '__main__':
fab.execute(task1) # 執行任務1
fab.execute(task2, path='/usr/local') # 執行任務2
在服務端執行命令
from fabric import api as fab
fab.env.hosts = ['*.*.*.*]
fab.env.port = 22
fab.env.user = 'test'
fab.env.password = '123456'
def task3():
fab.run('ls /home/test') # 在遠程執行命令,可也使用 fab.sudo(命令) 執行sudo命令
if __name__ == '__main__':
fab.execute(task3)
如果想忽略輸出信息,並拿到結果可以使用settings
def task3():
with fab.settings(fab.hide('everything'), warn_only=True): # 關閉顯示,僅顯示警告
result = fab.run('ls /home/test') # 調用遠程命令,並獲取結果
print('命令輸出信息', result)
print('命令是否失敗', result.faild)
注:env.hosts中可以指定一批服務器,當服務器密碼不同時,可以參考如下設置
fab.env.hosts = [
'root@192.168.10.201:22',
'root@192.168.10.202:22',
]
fab.env.passwords = {
'root@192.168.10.201:22':'123456201',
'root@192.168.10.202:22':'123456202',
}
上傳文件
from fabric import api as fab
fab.env.hosts = ['*.*.*.*]
fab.env.port = 22
fab.env.user = 'test'
fab.env.password = '123456'
def task4(): # 上傳
result = fab.put("/data/test.tar.gz", "/data/logs/test.tar.gz") # 第一個參數是本地文件路徑,第二個參數服務器文件路徑
if __name__ == '__main__':
fab.execute(task4)
出錯時用戶確認
from fabric import api as fab
def task5():
with fab.settings(warn_only=True):
result = local('jmeter -v', capture=True)
if result.failed and not fab.confirm("jmeter不存在,是否繼續"): # 用戶交互
abort('任務終止')
if __name__ == '__main__':
fab.execute(task5)
任務組合
在腳本中多個任務可以相關組合,執行時可以直接執行組合任務,示例如下
def task6(path): # 組合任務
task1()
task2(path)
if __name__ == '__main__':
fab.execute(task6, path='/usr/local')