通過(guò) SSH 進(jìn)行軟件部署或系統(tǒng)管理。
設(shè)置
在連接目標(biāo)主機(jī)之前,必須提供足夠的配置信息。
任務(wù)
任務(wù)就是些普通函數(shù),可以直接用 execute 執(zhí)行,或在命令行調(diào)用。
也可用裝飾器設(shè)置這些參數(shù)。另外,最好顯式關(guān)閉連接。
from fabric.api import *
from fabric.network import *
def rcmd(s): run(s)
env.user = "root"
env.password = "123456"
env.hosts = ["192.168.1.1", "192.168.1.2", "192.168.1.3"]
env.roledefs = {"A": ["192.168.1.1", "192.168.1.2"], "B":["192.168.1.3"] }
try:
execute(rcmd, "uname -a", roles = ["A", "B"])
finally:
disconnect_all()
顏色
fabric.colors 提供了一些顏色包裝函數(shù),可配合 print 顯示一些需要特別注意的信息。
from fabric.colors import *
print(green("This text is green"))
上下文
fabric.context_managers 為命令提供區(qū)域設(shè)置。
切換到合適的工作目錄,減少命令行輸入。
with cd("/etc"):
run("pwd") # /etc
with cd ("init.d"):
run("pwd") # /etc/init.d
操作
fabric.operations 包含用于任務(wù)的一些命令。
最常用的是 run 命令,它執(zhí)行遠(yuǎn)程命令,返回輸出結(jié)果字符串。該字符串對(duì)象還有 failed、succeeded、 return_code、command、real_command 等屬性用來(lái)檢查運(yùn)行結(jié)果。
out = run("uname -a")
print out.succeeded, out.failed, out.return_code
print out.command, out.real_command
其他
fabric.utils 提供了一些輔助操作。
fabric.contrib.console 提供 confirm 函數(shù),讓用戶輸入 [Y/n] 確認(rèn)信息。
if confirm("Continue", default = False):
out = run("uname -a")
fabric.contrib.files 提供了遠(yuǎn)程文件操作功能。
問(wèn)題
(1) 對(duì)后臺(tái)運(yùn)行命令 nohup 支持不好,可以考慮用 screen、pexpect 等代替。
$ screen -d -m -S <session_name> [cmd args]; sleep 5
注意用 sleep 暫停,避免 screen 尚未運(yùn)行,會(huì)話就結(jié)束。
(2) 用 open_shell 進(jìn)入交互模式,Ctrl+C 導(dǎo)致 fabric 進(jìn)程退出,而不是遠(yuǎn)程進(jìn)程。#