自動化運維工具fabric的總結

fabric使用總結

Fabric和Fabric2在Pypi中就是同一個東西,fabric2只是Fabric的替代名稱,爲了便於使用備用名稱進行安裝。Fabric2和以前的Fabric1相比,徹底重寫了,接口和功能都有很大改動,官網也不建議繼續用Fabric1,建議升級到Fabric2。而最新版也早就支持Python 3.4+,和以前的Python2.7。

但目前各個社區對fabric2的介紹不多,基本都是fabric1,fabric2與fabric1的接口基本是徹底不一樣,所以目前使用的是fabric1api

安裝fabric1的方法:

pip install 'fabric <2.0'
因爲 fabric 不僅是一個Python 模塊,fabric 仍是一個命令行工具,能夠經過fab -h進行命令的瞭解

使用方式

talk is cheap, show the code工具

  • 新建fable.py文件:
from fabric.api import *
from fabric.colors import *

#env.parallel = True 這個參數的含義是,對於批量機器的某個任務,全部機器並行執行;
#默認是根據機器列表一個機器一個機器執行;

env.warn_only=True
#能夠把退出換爲警告,以提供更靈活的錯誤處理。
#若是設置爲False,則一條命令運行失敗會就會退出,再也不執行後面的命令。

#自動登陸機器的用戶名和密碼
#env:保存用戶配置的字典
#(保存了相關的配置,好比登陸用戶名 env.user,密碼 env.password,端口 env.port  等,
#若是沒有指定用戶名那麼默認使用當前用戶,端口使用22)

env.user = "username"
env.password = "password"

#能夠指定sudo的具體組用戶,這樣,若只有目標機器的cloud組權限,
指定後,sudo(cmd)方法將以cloud組的權限去執行
env.sudo_user = 'cloud'
env.sudo_group = 'cloud'

#設定run(cmd), sudo(cmd)的cmd命令行在目標機器上執行的超時時間
env.command_timeout = 20

#以組爲單位管理機器
env.roledefs = {
          'group1':
          [
              'p1.test.cn',
              'p2.test.cn',
              'p3.test.cn',
              'p4.test.cn',
              'p5.test.cn',
              'p6.test.cn',
              'p7.test.cn',
              'p8.test.cn',
              'p9.test.cn',
              'p10.test.cn',
          ],
          'log':
          [
              'log1.test.cn',
              'log2.test.cn',
          ],
          }
#以上定義了兩個組,一個組叫group1,包含了十臺機器,一個組叫log,包含了兩臺機器;

@roles("group1")
def check_ps():
    run("ps -ef | grep demo") #直接在遠程機器上以登陸帳戶username的權限執行指令
    
    put("./start.sh", "/home/wangzijie") #將本地當前目錄下的start.sh文件複製到遠程機器的/home/wangzijie目錄下
    
    put("./update.sh", "/etc/init.d/update.sh", use_sudo = True) #將本地當前目錄下的start.sh文件複製到遠程機器的/etc/init.d目錄下;
    #因爲這個目錄只有root有寫權限,所以use_sudo = True能夠以sudo的權限來寫,但須要有這臺機器的sudo權限才能夠
    
    sudo("/etc/init.d/update.sh start") #以root的角色來執行update.sh腳本
    
    sudo("/home/wangzijie/start.sh", user = "cloud") #以特定組cloud的角色來執行命令,須要在目標機器有cloud的權限;
    或者在全局變量env.sudo_user, env.sudo_group中定義cloud,這樣就不用在sudo方法中傳遞user這個參數了
  • 執行腳本
fab check_ps
該命令須要在fable.py所在目錄下執行,會對全部的group1機器運行check_ps方法中的全部命令,按照list的順序執行,若須要全部機器並行執行,添加env.parallel = True便可

fab 命令執行時,默認引用一個名爲 fabfile.py 的文件,咱們也能夠經過 -f 來進行指定。命令行

命令行動態傳遞參數

def hello(name, value):
    print "Hello Fabric! %s=%s" % (name,value)

執行時:code

fab hello:name=Year,value=2016

獲取當前任務的目標機器名:

可使用env.host_string變量
按必定順序同時執行多個任務

示例接口

def deploy_all():
    execute(deploy_task1)
    execute(deploy_task2)

@roles("cluster1")
def deploy_task1():
    xxx
    ...
    
@roles("cluster2"):
def deploy_task2():
    XXX
    ...
相關文章
相關標籤/搜索