溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

系統(tǒng)批量運維管理器Fabric詳解

發(fā)布時間:2020-04-23 22:54:33 來源:網(wǎng)絡 閱讀:526 作者:lvsir666 欄目:編程語言

Fabric是基于Python(2.5及以上版本)實現(xiàn)的SSH命令行工具,簡化了SSH的應用程序部署及系統(tǒng)管理任務,它提供了系統(tǒng)基礎的操作組件,可以實現(xiàn)本地或遠程shell命令,包括命令執(zhí)行、文件上傳、下載及完整執(zhí)行日志輸出等功能。Fab-ric在paramiko的基礎上做了更高一層的封裝,操作起來會更加簡單。Fabric官網(wǎng)地址為:http://www.fabfile.org


一:fab常用參數(shù)

    fab作為Fabric程序的命令行入口,提供了豐富的參數(shù)調(diào)用,命令格式如下:

    fab [options] [:arg1,arg2=val2,host=foo,hosts='h2;h3',...] ...下面列舉了常用的幾個參數(shù),更多參數(shù)可使用fab-help查看。   

        ?-l,顯示定義好的任務函數(shù)名;   

        ?-f,指定fab入口文件,默認入口文件名為fabfile.py;   

        ?-g,指定網(wǎng)關(guān)(中轉(zhuǎn))設備,比如堡壘機環(huán)境,填寫堡壘機IP即可;   

        ?-H,指定目標主機,多臺主機用“,”號分隔;   

        ?-P,以異步并行方式運行多主機任務,默認為串行運行;

        ?-R,指定role(角色),以角色名區(qū)分不同業(yè)務組設備;   

        ?-t,設置設備連接超時時間(秒);   

        ?-T,設置遠程主機命令執(zhí)行超時時間(秒);   

        ?-w,當命令執(zhí)行失敗,發(fā)出告警,而非默認中止任務。

    有時候我們甚至不需要寫一行Python代碼也可以完成遠程操作,直接使用命令行的形式,例如:

    fab -p "shitouit@2018"  -H 18.16.200.151 -- 'ls '

        命令運行結(jié)果如下圖

        系統(tǒng)批量運維管理器Fabric詳解


二:fabfile的編寫

    fab命令是結(jié)合我們編寫的fabfile.py(其他文件名須添加-f filename引用)來搭配使用的,部分命令行參數(shù)可以通過相應的方法來代替,使之更加靈活,例如“-H 192.168.1.21,192.168.1.22”,我們可以通過定義env.hosts來實現(xiàn),如“env.hosts=['192.168.1.21', '192.168.1.22']”。fab-file的主體由多個自定義的任務函數(shù)組成,不同任務函數(shù)實現(xiàn)不同的操作邏輯,下面詳細介紹。

    1:全局屬性設定

        evn對象的作用是定義fabfile的全局設定,支持多個屬性,包括目標主機、用戶、密碼、角色等,各屬性說明如下:env.host,定義目標主機,可以用IP或主機名表示,以Python的列表形式定義,如env.hosts=['192.168.1.21', '192.168.1.22']。   

        ?env.exclude_hosts,排除指定主機,如env.exclude_hosts=['192.168.1.22']。   

        ?env.user,定義用戶名,如env.user="root"。   

        ?env.port,定義目標主機端口,默認為22,如env.port="22"。   

        ?env.password,定義密碼,如env.pass-word='KSJ3548t7d'。

        ?env.passwords,與password功能一樣,區(qū)別在于不同主機不同密碼的應用場景,需要注意的是,配置passwords時需配置用戶、主機、端口等信息,如:env.passwords = {    'root@192.168.1.21:22': 'SJk348ygd',    'root@192.168.1.22:22': 'KSh558j4f',    'root@192.168.1.23:22': 'KSdu43598'}   

        ?env.gateway,定義網(wǎng)關(guān)(中轉(zhuǎn)、堡壘機)IP,如env.gateway='192.168.1.23'。   

        ?env.deploy_release_dir,自定義全局變量,格式:env.+“變量名稱”,如env.de-ploy_release_dir、env.age、env.sex等。   

        ?env.roledefs,定義角色分組,比如web組與db組主機區(qū)分開來,定義如下:

            env.roledefs = {    'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24'],    'dbservers': ['192.168.1.25', '192.168.1.26']}

            引用時使用Python修飾符的形式進行,角色修飾符下面的任務函數(shù)為其作用域,下面來看一個示例:

@roles('webservers')
def webtask():    
    run('/etc/init.d/nginx start')
@roles('dbservers')
def dbtask():
    run('/etc/init.d/mysql start')
@roles ('webservers', 'dbservers')
def pubclitask():
    run('uptime')
def deploy():
    execute(webtask)
    execute(dbtask)
    execute(pubclitask)

            在命令行執(zhí)行#fab deploy就可以實現(xiàn)不同角色執(zhí)行不同的任務函數(shù)了。

    2:常用api

        Fabric提供了一組簡單但功能強大的fab-ric.api命令集,簡單地調(diào)用這些API就能完成大部分應用場景需求。Fabric支持常用的方法及說明如下:   

        ?local,執(zhí)行本地命令,如:local('uname-s');   

        ?lcd,切換本地目錄,如:lcd('/home');   

        ?cd,切換遠程目錄,如:cd('/data/logs');   

        ?run,執(zhí)行遠程命令,如:run('free-m');   

        ?sudo,sudo方式執(zhí)行遠程命令,如:sudo('/etc/init.d/httpd start');   

        ?put,上傳本地文件到遠程主機,如:put('/home/user.info', '/data/user.info');   

        ?get,從遠程主機下載文件到本地,如:get('/data/user.info', '/home/root.info');

        ?prompt,獲得用戶輸入信息,如:prompt('please input user password:');   

        ?confirm,獲得提示信息確認,如:con-firm("Tests failed. Continue[Y/N]?");   

        ?reboot,重啟遠程主機,如:reboot();   

        ?@task,函數(shù)修飾符,標識的函數(shù)為fab可調(diào)用的,非標記對fab不可見,純業(yè)務邏輯;   

        ?@runs_once,函數(shù)修飾符,標識的函數(shù)只會執(zhí)行一次,不受多臺主機影響。

    3:示例:查看本地與遠程主機信息

        使用local()方法執(zhí)行本地命令;@runs_once修飾符保證該任務函數(shù)只執(zhí)行一次;run()方法執(zhí)行遠程命令;@task修飾符標致入口函數(shù)

#!/usr/bin/env python
from fabric.api import * 

env.usr='root'
env.hosts=['18.16.200.150']
env.password="shitouit@2018"

@runs_once
def local_task():
    local('ifconfig')
@runs_once
def input_raw():
    return prompt('ples input the dir you want to lookup:',default='/root')

def remote_task(dirname):
    with cd(dirname):
      run('ls -l')

@task
def go():
    local_task()
    getdir = input_raw()
    remote_task(getdir)

    執(zhí)行結(jié)果如下圖:

    系統(tǒng)批量運維管理器Fabric詳解

    

    4:示例:網(wǎng)關(guān)模式文件上傳與執(zhí)行

        本示例通過Fabric的evn對象定義網(wǎng)關(guān)模式,即俗稱的中轉(zhuǎn)、堡壘機環(huán)境。定義格式為“env.gateway='18.16.200.150'”,其中IP“18.16.200.150”為堡壘機IP,再結(jié)合任務函數(shù)實現(xiàn)目標主機文件上傳與執(zhí)行的操作,詳細源碼如下:

#!/usr/bin/env python
from fabric.api import * 
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.usr='root'
env.gateway='18.16.200.150'
env.hosts=['18.16.200.151','18.16.200.152']
env.passwords={
    "root@18.16.200.151:22": "shitouit@2018",
    "root@18.16.200.152:22": "shitouit@2018",
    "root@18.16.200.150:22": "shitouit@2018",
}

lpackpath = "/root/harbor-offline-installer-v1.4.0.tgz"
rpackpath = "/tmp/install"

@task
def put_task():
    run('mkdir '+ rpackpath)
    with settings(warn_only=True):
        result = put(lpackpath,rpackpath)
    if not result and not confirm("put file faild,Continue[Y/N]?"):
        abort("Aborting file put task!")
@task
def run_task():
    with cd(rpackpath):
        run('tar zvxf harbor-offline-installer-v1.4.0.tgz')

@task
def go():
    put_task()
    run_task()

    執(zhí)行結(jié)果如下圖:

    系統(tǒng)批量運維管理器Fabric詳解

    

    

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI