自動化運維工具fabric的簡明使用手冊
阿新 • • 發佈:2018-02-27
fabric 自動化運維 python linux ssh 1.簡介
Fabric 是一個 Python (2.5-2.7) 的庫和命令行工具,用來提高基於 SSH 的應用部署和系統管理效率。
更具體地說,Fabric 是:
- 一個讓你通過命令行執行Python函數的工具;
- 一個讓你通過SSH執行Shell命令更加容易、 更符合Python風格的命令庫。
自然而然地,大部分用戶把這兩件事結合著用,使用Fabric來寫和執行Python函數或task,以實現與遠程服務器的自動化交互。讓我們一睹為快吧。
2.安裝
創建.pip目錄和配置文件:
cd ~
mkdir .pip
cd .pip
touch pip.conf
編輯文件pip.conf如下
[global] index-url=http://mirrors.zte.com.cn/pypi/simple [install] trusted-host=mirrors.zte.com.cn
安裝依賴包(如果是centos的,需要使用yum安裝)
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dev
sudo apt-get install libffi-dev
用pip安裝fabric
sudo pip install fabric
3、使用
3.1 執行無參python函數
編寫fabfile.py如下:
def hello():
print("hello world!")
def helloEx(name):
print("hello ", name, "!")
在fabfile文件所在目錄執行如下命令:
wld@trusty:~/fabric$ fab hello
hello world!
Done.
3.2 執行有參python函數
編寫fabfile.py如下:
def hello(name):
print("hello "+name+" !")
在fabfile文件所在目錄執行如下命令:
wld@trusty:~/fabric$ fab hello:name=wld
hello wld!
Done.
3.3 執行本地命令
fabric.api包裏的local()方法可以用來執行本地Shell命令:
from fabric.api import local def hello(): local(‘ls -l ~‘)
local()方法有一個”capture”參數用來捕獲標準輸出,比如:
def hello():
output = local(‘ls -l ~‘, capture=True)
這樣,Hello字樣不會輸出到屏幕上,而是保存在變量output裏。
3.4 執行遠程命令
Fabric真正強大之處不是在執行本地命令,而是可以方便的執行遠程機器上的Shell命令。它通過SSH實現,你需要的是在腳本中配置遠程機器地址及登錄信息:
from fabric.api import *
env.passwords = {
"[email protected]:22":"password"
}
@hosts("[email protected]:22")
def hello():
run("ls -l ~")
我們可以通過設置env.passwords來避免在運行過程中輸密碼,註意ip後面需要加端口號,示例中的22是ssh的端口號。
3.5 執行內網機器命令
有時候我們需要通過一臺中轉機器才能登錄內網機器,這種情況需要設置env.gateway
from fabric.api import *
env.gateway = "[email protected]:22"
env.passwords = {
"[email protected]:22":"password1"
"[email protected]:22":"password2"
}
@hosts("[email protected]:22")
def hello():
run("ls -l ~")
3.6 定義角色讓不同機器執行不同命令
如果對於不同的服務器,我們想執行不同的任務,我們要對服務器定義角色:
from fabric.api import env, roles, run, execute, cd
env.roledefs = {
‘staging‘: [‘[email protected]‘,‘[email protected]‘],
‘build‘: [‘[email protected]‘]
}
env.passwords = {
‘staging‘: ‘11111‘,
‘build‘: ‘123456‘
}
@roles(‘build‘)
def build():
with cd(‘/home/build/myapp/‘):
run(‘git pull‘)
run(‘python setup.py‘)
@roles(‘staging‘)
def deploy():
run(‘tar xfz /tmp/myapp.tar.gz‘)
run(‘cp /tmp/myapp /home/bjhee/www/‘)
def task():
execute(build)
execute(deploy)
現在讓我們執行fab task,這時Fabric會先在一臺build服務器上執行build任務,然後在兩臺staging服務器上分別執行deploy任務。”@roles”裝飾器指定了它所裝飾的任務會被哪個角色的服務器執行。
3.7 SSH功能函數
- sudo(cmd): 以超級用戶權限執行遠程命令。 sudo("mkdir /root/xx")
- get(remote, local): 從遠程機器上下載文件到本地
- put(local, remote): 從本地上傳文件到遠程機器上
- prompt(提示字符串, default, validate): 提示輸入並返回用戶輸入值
- reboot: 重啟服務器
- cd(path): 設置遠程機器的當前工作目錄
- lcd(path): 設置本地工作目錄
- path: 添加遠程機的PATH路徑
- settings: 設置Fabric環境變量參數
- shell_env: 設置Shell環境變量
- prefix: 設置命令執行前綴
自動化運維工具fabric的簡明使用手冊