在運維工做中,常常會遇到重複性的勞動,這個時候爲了效率就必需要使用自動化運維工具。html
這裏我給你們介紹輕量級自動化運維工具Fabric,Fabric是基於Python語言開發的,是開發同事的最愛。python
爲了方便自動化運維,常常會將Fabric部署在跳板機上。之因此部署跳板機是基於幾點考慮的:mysql
1.1基於安全的考慮,只有跳板機上開放了公網IP和SSH Key登陸,其餘內部的業務機默認只容許內網登陸,公網IP地址不對外開放。c++
1.2爲了方便自動化運維部署,跳板機上作了免密碼登陸,能夠直接經過SSH命令操做其餘業務機器。git
1.3設置了權限控制權限,跳板機上部署了幾套key,分別對應於不一樣的權限分配,能夠給公司的同事不一樣的私鑰登陸跳板機sql
Fabric是基於Python實現的ssh命令行工具,簡化了ssh的應用程序部署及系統管理任務,它爲系統提供了基礎的操做組件,能夠實現本地或遠程Shell命令,包括文件上傳、下載、腳本執行及完整執行日誌輸出等功能。apache
安裝Fabric時,能夠選擇採用Python的pip、easy_install及源碼安裝方式,這些方式可以很方便的解決包依賴關係。api
你們能夠根據系統環境自行選擇最優的安裝方法,若是選擇pip或easy_install安裝方式,如果使用系統最小化安裝,注意提早安裝gcc、gcc+、make這些基礎開發包和python-pip):安全
yum -y install make gcc gcc++ python-devel python-pip
pip是安裝python包的工具,提供了安裝包、列出已經安裝的包、升級包及卸載包的功能,能夠經過pip工具直接安裝Fabric。bash
使用pip 安裝 Fabric的命令:
pip install fabric
這是推薦使用源碼安裝的方式:
yum -y install python-setuptools cd /usr/local/src wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.3.0.tar.gz --no-check-certificate tar -xvf Fabric-1.3.0.tar.gz cd Fabric-1.3.0 python setup.py install
下載完成後,安裝相關的軟件包。
而後解壓源碼包,使用Python命令運行安裝腳本,進行安裝。
等待安裝命令運行完畢後,就能夠去驗證了。
這裏使用IPython進行驗證,在交互解釋器下,輸入import fabric 查看是否導入模塊成功,若無報錯則表示fabric當前已經安裝成功。
3.1 Fabric的核心API主要有7類:
帶顏色的輸出類(color output)、上下文管理類(context managers)、裝飾器類(decorators)、網絡類(network)、操做類(operations)、任務類(tasks)、工具類(utils)。
Fabric提供了一組操做簡單但功能強大的fabric.api命令集,簡單地調用這些API就能完成大部分應用場景的需求,Fabric支持的經常使用命令及說明以下。
local:執行本地命令,如local ('uname -s')。
lcd:切換本地目錄,如lcd ('/home')。
cd:切換遠程目錄,如cd ('/data/logs/')。
run:執行遠程命令,如run ('free -m')。
sudo:以sudo方式執行遠程命令,如sudo ('/etc/init.d/httpd start')。
put:上傳本地文件到遠程主機,如put ('/home/user.info','/data/user.info')。
get:從遠程主機下載文件到本地,如get ('/home/user.info','/data/user.info')。
prompt:得到用戶輸入信息,如prompt ('please input user password:')。
confirm:得到提示信息確認,如confirm ('Test failed,Continue[Y/N]')。
reboot:重啓遠程主機,如reboot ()。
@task:函數修飾符。新版本的Fabric對面向對象的特性和命名空間有很好的支持。面向對象的繼承和多態特性,對代碼的複用極其重要。新版本的Fabric定義了常規的模塊級別的函數,並帶有裝飾器@task,這會直接將該函數轉化爲task子類。該函數名會被做爲任務名,後面會舉例說明@task的用法。
@runs_once:函數修飾符。標識此修飾符的函數只會執行一次,不受多臺主機影響。
3.2 下面來看看@task的用法,它能夠爲任務添加別名,命令以下:
from fabric.api import task
@task(alias='dwm')
def deploy_with_migrations():
pass
用fab命令打印指定文件中存在的命令,以下:
fab -f /home/yhc/test.py --list
命令顯示結果以下所示:
Available commands:
deploy_with_migrations
dwm
還能夠經過@task來設置默認的任務,好比deploy(部署)一個子模塊,命令以下:
from fabric.api import task
@task
def migrate():
pass
@task
def push()
pass
@task
def provision():
pass
@task(default=True)
def full_deploy():
provision()
push()
migrate()
fab -f /home/yhc/test.py --list
結果以下所示:
Available commands:
deploy
deploy.full_deploy
deploy.migrate
deploy.provision
deploy.push
也能夠經過@task以類的形式定義任務,例如:
from fabric.api import task
from fabric.tasks import Task
class MyTask(Task):
name = "deploy"
def run(self, environment, domain="whatever.com"):
run("git clone foo")
sudo("service apache2 restart")
instance = MyTask()
下面採用@task方式的代碼跟上面的代碼效果是同樣的:
from fabric.api import task
from fabric.tasks import Task
@task
def deploy(environment, domain="whatever.com"):
run("git clone foo")
sudo("service apache2 restart")
你們能夠對比看看,是否是採用@task函數修飾器的方式更爲簡潔和直觀呢?
關於@task修飾器的用法和其餘fabric.api命令,請參考Fabric官方文檔http://fabric-chs.readthedocs.org/zh_CN/chs/tutorial.html。
3.3這裏舉個例子說明一下@runs_once用法,源碼文件/home/yhc/test.py文件內容以下所示:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from fabric.api import *
from fabric.colors import *
env.user = "root" #定義用戶名,env對象的做用是定義Fabric指定文件的全局設定
env.password = "redhat" #定義密碼
env.hosts = ['192.168.1.204','192.168.1.205']
#定義目標主機
@runs_once
#當有多臺主機時只執行一次
def local_task(): #本地任務函數
local("hostname")
print red("hello,world")
#打印紅色字體的結果
def remote_task(): #遠程任務函數
with cd("/usr/local/src"):
run("ls -lF | grep /$")
#with是Python中更優雅的語法,能夠很好地處理上下文環境產生的異常,這裏用了with之後至關於實現了"cd /var/www/html && ls -lsart"的效果。
經過fab命令調用local_task本地任務函數,命令以下:
fab -f test.py local_task
結果以下所示:
[192.168.1.204] Executing task 'local_task'
[localhost] local: hostname
client.cn7788.com
My hostname is client.cn7788.com
Hello,world!
Done.
上述命令顯示的雖然不是本機的IP地址,但實際上並無在主機192.168.1.204上面執行命令,而是在本地主機client.cn7788.com(IP爲192.168.1.206的機器)上執行了命令,並以紅色字體顯示了 「hello,world」和「My hostname is client.cn7788.com」。
調用remote_task遠程函數顯示結果,分別在204和205的機器上打印/usr/local/src/下面存在的目錄,結果以下:
[192.168.1.204] Executing task 'remote_task'
[192.168.1.204] run: ls -lF | grep /$
[192.168.1.204] out: drwxr-xr-x. 2 root root 4096 Nov 22 00:01 download/
[192.168.1.204] out: drwxr-xr-x. 9 501 games 4096 Nov 19 04:44 Fabric-1.3.0/
[192.168.1.204] out: drwxr-xr-x. 2 root root 4096 Nov 22 00:01 object/
[192.168.1.205] Executing task 'remote_task'
[192.168.1.205] run: ls -lF | grep /$
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 mysql/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 puppet/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 soft/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 3 07:56 test/
Done.
Disconnecting from 192.168.1.204... done.
Disconnecting from 192.168.1.205... done.