Python使用fabric在本地及服務端執行命令


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')


免責聲明!

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



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