首頁  >  文章  >  後端開發  >  運維管理器Fabric使用方法

運維管理器Fabric使用方法

高洛峰
高洛峰原創
2017-01-16 17:47:341202瀏覽

Fabric的安裝

Fabric支援pip,easy_install或原始碼方式安裝,很方便解決套件依賴問題,(根據使用者環境,自行選擇pip或ease_install)
pip install fabric
easy_install fabric

碼。

校驗安裝結果,如果導入模組沒有提示異常,則表示安裝成功:

root@Python_S6:~# python

Python 2.7.5+ (default, Sep 19 2013, 13:48:49)  4. .1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import fabric
>>>

官網提供了一個簡單的入門範例:

root@Python_S6:/home/chart7/test/fabric# cat farbic.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.api import run
  
def host_type(): #定义一个任务函数,通过run方法实现远程执行'uname -s'命令
  run('uname -s')

運行結果如果下圖所示

運維管理器Fabric使用方法指令引用預設檔名為fabfile.py,如果使用非預設檔名稱,則需透過'-f'來制定,如:fab -H 192.168.1.23, 192.168.1.24 -f host_type.py host_type,如果管理員與目標主機未設定金鑰認證信任,將提示會輸入目標主機對應帳號登入密碼。

一、fab的常用參數

fab作為Fabric程式的命令入口,提供了豐富的參數調用,命令格式如下:

fab [options] [:arg1,arg2=val2,host=foo,hosts ='h1;h2',....]

下面列舉了常用的幾個參數,更多參數可使用fab -help查看.
-l,顯示定義好的任務函數名;
-f,指定fab入口文件,預設入口文件名稱為fabfile.py;
-g,指定網關設備,如堡壘機環境,填寫堡壘機IP即可;
-H,指定目標主機,多台主機以','號分隔;
-P,以非同步並行方式執行多個主機任務,預設為序列運作;
-R,指定role(角色),以角色名稱區分不同業務群組裝置;
-t,設定裝置連線逾時時間;
-T,設定遠端主機指令執行逾時時間;
-w,當指令執行失敗,發出警告,而非預設終止任務

二、fabfile的編寫

fab指令是結合我們所寫的fabfile.py(其他文件名必須加入-f filename引用)來搭配使用,部分命令列參數可以透過對應的方法來代替,使其更加靈活,列如"-H 192.168.1.23,192.168.1.24",我們可以透過定義env.hosts來實現,如"env.hosts=[192.168.1.23,192.168.1.24]".fabfile的主體由多個自定義的任務函數組成,不同任務函數實現不同的操作邏輯,下面詳細介紹

三、全局屬性設定

env物件的作用是定義fabfile的全域設定,支援多個屬性,包括目標主機,用戶,密碼角色,各屬性說明如下:

env.host,定义目标主机,可以用IP或主机名表示,以Python的列表形式定义,如env.hosts=['192.168.1.23,192.168.1.24'].
env.exculde_hosts,排除指定主机,如env.exclude_hosts=['192.168.1.23']
env.user,定义用户名,如env.user="root"
env.port,定义目标主机端口,如env.port = '22'
env.password,定义密码,如env.password='123456'
env.passwords,与password功能一样,区别在于不同主机不同密码的应用场景,需要注意的是,配置passwords时需要配置用户,主机,端口等信息,如:env.passwords = {'root@192.168.1.21:22':'123456',
'root@192.168.1.23:22':'3234234',
'root@192.168.1.24:23':'09887',
}
env.gateway,定义网关(中转,堡垒机)IP,如env.gateway = '192.168.1.1'
env.roledefs,定义角色分组,比如web组与db组主机区分开来,定义如下:
env.roledefs = {
'webservers':['192.168.1.21','192.168.1.22','192.168.1.23'],
'dbservers':['192.168.1.24','192.168.1.25'],
}

引用時使用python修飾符的形式進行,角色修飾符下面的任務函數為其作用域,下面來看一個範例:

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

在指令執行fab deploy就可以實作不同角色執行不同的任務函數。

常用API

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,函数修饰符,标识符的函数为fab可调用,非标记对fab不可见,纯业务逻辑;
@runs_once,函数修饰符,标识符的函数只会执行一次,不受多台主机影响;

範例1 :查看本地與遠端主機資訊

本範例呼叫local()方法執行本地命令,新增"@runs_once"修飾保證該任務函數只執行一次。呼叫run()方法執行遠端指令,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.api import *
env.user = 'root'
env.hosts = ['192.168.1.43','192.168.1.23','192.168.1.24']
env.port = '22'
env.password = '123456'
  
@runs_once #查看本地系统信息,当有多台主机时只运行一次
def local_task(): #本地任务函数
  local('uname -a')
  
def remote_task():
  with cd('/data'): #with的作用是让后面的表达式语句继承当前状态,实现cd /var && ls -l的效果
    run('ls -l')

透過fab指令分別呼叫local_task任務函數運作效果如下圖所示

運維管理器Fabric使用方法結果中顯示了[192.168.1.23] Executing,ask'上並非在主機192.168.1.23上執行任務,而是傳回Fabric主機本地的'uname -a'的執行效果

呼叫remtoe_task任務函數的執行結果如下圖所示

運維管理器Fabric使用方法範例2;目錄清單

本範例使用"@task"修飾符標誌入口函數go()對外部可以,配合"@runs_once"符等待接受使用者輸入,最後呼叫worktask()任務函數實作遠端指令執行,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.api import *
env.user = 'root'
env.hosts = ['192.168.1.23','192.168.1.24']
env.password = '123456'
@runs_once #在主机遍历过程中,只有一台出发此函数
def input_raw():
  return prompt("please input direcotry name:",default="/home")
  
  
def worktask(dirname):
  run("ls -l %s" %dirname)
  
@task
def go():
  getdirname = input_raw()
  worktask(getdirname)

這個範例實作了一個動態輸入遠端目錄名稱,在取得目錄清單的功能,由於我們只要求輸入一次,再顯示所有主機上該目錄的列表信息,呼叫了一個子函數input_raw(同時配置)@runs_once修飾符來達到此目的,執行結果如下圖

運維管理器Fabric使用方法檔案上傳與執行

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
env.hosts=['192.168.1.23','192.168.1.24']
#假如所有主机密码都不一样,可以通过env.passwords字典变量一一指定
env.passwords = {
  'root@192.168.1.23:22': '123456',
  'root@192.168.1.24:22': '123456',
}
  
lpackpath="/home/a.tar.gz"
rpackpath="/tmp/install"
  
@task
def put_task():
  run("mkdir -p /tmp/install")
  with settings(warn_only=True):
    result = put(lpackpath, rpackpath)
  if result.failed and not confirm("put file failed, Continue[Y/N]?"):
    abort("Aborting file put task!")
  
@task
def run_task():
  with cd("/tmp/install"):
    run("tar -zxvf a.tar.gz")
  
@task
def go():
  put_task()
  run_task()

更多維運管理器Fabric使用方法相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn