1. 程式人生 > >輕量級自動化運維工具Fabric的安裝與實踐

輕量級自動化運維工具Fabric的安裝與實踐

sof contex 重要 Once easy test inpu puppet rep

一、背景環境

在運維工作中,經常會遇到重復性的勞動,這個時候為了效率就必須要使用自動化運維工具。

這裏我給大家介紹輕量級自動化運維工具Fabric,Fabric是基於Python語言開發的,是開發同事的最愛。

為了方便自動化運維,經常會將Fabric部署在跳板機上。之所以部署跳板機是基於幾點考慮的:

1.1基於安全的考慮,只有跳板機上開放了公網IP和SSH Key登錄,其他內部的業務機默認只允許內網登錄,公網IP地址不對外開放。

1.2為了方便自動化運維部署,跳板機上做了免密碼登錄,可以直接通過SSH命令操作其他業務機器。

1.3設置了權限控制權限,跳板機上部署了幾套key,分別對應於不同的權限分配,可以給公司的同事不同的私鑰登錄跳板機

Fabric是基於Python實現的ssh命令行工具,簡化了ssh的應用程序部署及系統管理任務,它為系統提供了基礎的操作組件,可以實現本地或遠程Shell命令,包括文件上傳、下載、腳本執行及完整執行日誌輸出等功能。

二、Fabric的安裝

安裝Fabric時,可以選擇采用Python的pip、easy_install及源碼安裝方式,這些方式能夠很方便的解決包依賴關系。

大家可以根據系統環境自行選擇最優的安裝方法,如果選擇pip或easy_install安裝方式,若是使用系統最小化安裝,註意提前安裝gcc、gcc+、make這些基礎開發包和python-pip):

yum -y install make gcc gcc++ python-devel python-pip

pip是安裝python包的工具,提供了安裝包、列出已經安裝的包、升級包及卸載包的功能,可以通過pip工具直接安裝Fabric。

使用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當前已經安裝成功。

技術分享圖片

三、Fabric核心API

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.

輕量級自動化運維工具Fabric的安裝與實踐