fabric 介紹
- Fabic是一個python(2.5-2.7)庫,用于簡化使用ssh的應(yīng)用程序部署,或系統(tǒng)管理任務(wù)
- 它提供的操作包括: 執(zhí)行本地或者遠程shell命令,上傳/下載文件,以及其他輔助的功能,如提示用戶輸入,中止執(zhí)行等
Github主頁: http://github.com/fabric/fabric
fabric的安裝
shell 腳本實現(xiàn)
#!/bin/bash
Install() {
yum install python-setuptools python-devel -y
easy_install pip
pip -v uninstall pycrypto
pip -v install pycrypto --upgrade
pip install fabric
}
Install
[ $? -eq 0 ] && fab -V || echo "Install fabric error!"
常用的fabric接口
- local : 執(zhí)行本地命令,如local('uname -s')
- lcd: 切換本地目錄, 如lcd('/home') ,進入到home目錄下
- cd: 切換遠程的目錄, 如cd('/tmp')
- run: 執(zhí)行遠程命令, 如run('free -m')
- sudo: 以sudo的方式執(zhí)行遠程命令,如:sudo(/etc/init.d/httpd start)
- put: 上傳本地文件到遠程主機,put('/etc/fstab','/tmp/fstab.info')
- get: 從遠程主機下載本地文件到主機 ,get('/etc/fatab','/tmp/fstab.info')
- prompt:獲得用戶輸入信息交互式,prompt('plese input user password:')
- confirm: 獲得提示信息確認,confirm('please continue[y/n]')
- reboot: 重啟遠程主機reboot()
- colors: 輸入顏色用的
常用的命令
- -l: 顯示定義好的任務(wù)函數(shù)名字
- -f: 指定fab入口的文件,默入口文件名為fabile.py
- -g: 指定網(wǎng)關(guān)設(shè)備,比如堡壘機環(huán)境,填寫堡壘機ip即可
- -H:指定目標主機, 多臺主機用''號分隔
- -P:以異步并行方式運行多個主機任務(wù),默認為串行運行
- -R:指定role角色,以角色名字區(qū)分不同業(yè)務(wù)組設(shè)備
- -T: 設(shè)定遠程主機命令執(zhí)行超時時間
- -t: 設(shè)定設(shè)備的連接超時時間
- -w: 當命令執(zhí)行時效,發(fā)出警告,而非默認終止任務(wù)
常用的裝飾器
- @runs_once: 函數(shù)修飾符,標識符的函數(shù)只會執(zhí)行一次,不受多臺主機的影響
- @task: 函數(shù)修飾符,標識符的函數(shù)為fab可調(diào)用,非標記的fab不可見,純屬業(yè)務(wù)邏輯
- @hosts: 定義按照主機來執(zhí)行如hosts('user1@hostname','user2@hostname')
- @roles: 函數(shù)修飾符,定義按照角色分組來執(zhí)行,如@roles('web','db')
- @parallel 和@serial: 任務(wù)并行或串行執(zhí)行芍碧,如果任務(wù)同時被 serial 和 parallel 裝飾器裝飾饲握,parallel 的優(yōu)先級更高私杜。
- @with_setting(warn_only=True): warn_only表示是否當在遠程機器上執(zhí)行命令,出現(xiàn)錯誤時救欧,fabric是否退出衰粹。將整個函數(shù)封裝起來,其效果類似于執(zhí)行在 settings 上下文管理器中笆怠。如果你想要修改函數(shù)的設(shè)置铝耻,但不愿改動其縮進時,它會很有用蹬刷。
fabric env 環(huán)境變量
env.host : 主機ip瓢捉,也可以使用fab選項-H參數(shù)來指定
env.roledefs : 角色分組,如:{'web': ['x', 'y'], 'db': ['z']}
env.all_hosts:Default 為 []办成,由 fab 設(shè)置的當前正在執(zhí)行命令的主機列表泊柬。僅用于顯示信息。
env.exclude_hosts : Default 為 []诈火,指定一個主機串列表兽赁, fab 執(zhí)行期間會跳過列表中的主機。例:env.exclude_hosts = [ '192.168.1.102' ]
env.port:定義目標主機端口冷守,默認為22刀崖。例:env.port = '80'。
env.password : SSH密碼拍摇,若已經(jīng)設(shè)置好無密碼登錄亮钦,則可以忽略
env.passwords:與 password 功能 一樣,區(qū)別在于不同主機不同密碼的應(yīng)用場景充活,需要注意的是蜂莉,配置passweords時需要配置用戶蜡娶,主機,端口等信息映穗。例:
env.passwords = {
'root@192.168.1.104:22':'123',
'root@192.168.1.86:22':'789',
'root@222.24.51.147:22':'345643',
}env.parallel :全局并行參數(shù)窖张,例 env.parallel = True 。
</code>
fabric 的簡單使用(-)
Fabric工具提供了一個簡單的構(gòu)建工具fab蚁滋,其作為Fabric程序的命令行入口宿接,提供了豐富的參數(shù)調(diào)用。
fab 默認會讀取當前目錄叫做fabfile.py名字的文件,這個是默認的, 如果當前目錄沒有,就去上級目錄
也就是父目錄中去找這個文件
[root@bdstravel fabric]# cat fabfile.py
#!/usr/bin/env python
def hello():
print("hello world")
[root@bdstravel fabric]# fab hello
hello world
Done.
[root@bdstravel fabric]#
如果不想以fabfile.py 命名文件的話 ,比如fuck.py 執(zhí)行的時候如下
[root@bdstravel fabric]# cat fuck.py
#!/usr/bin/env python
def fuck():
print("hello world")
[root@bdstravel fabric]# fab -f fuck.py fuck
hello world
Done.
@task #如果定義了task,那么其他的任務(wù)也要定以,否則-l的時候任務(wù)不顯示,提示variable comment
def mod(): #本地任務(wù)函數(shù)
with lcd('/tmp'): #‘with’的作用是讓后面的表達式語句繼承當前狀態(tài)辕录,即實現(xiàn)‘cd('/tmp') && ls’ 的效果
run('echo "budongshu" > bds.tmp')
run('ls')
[root@bdstravel fabric]# fab -f hostinfo.py mod
[127.0.0.1] Executing task 'mod'
[127.0.0.1] run: echo "budongshu" > bds.tmp
[127.0.0.1] run: ls
[127.0.0.1] out: anaconda-ks.cfg deploy_git.sh fabric install.log.syslog nohup.out
[127.0.0.1] out: bds.tmp dnspod_load_agent.sh install.log nginx-1.8.0.tar.gz shadowsocks-libev
[127.0.0.1] out:
Done.
fabric 的 簡單實用(二)
[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python
from fabric.api import *
from fabric.colors import *
import os
env.user = 'root'
env.hosts = ['127.0.0.1']
env.port = '22'
def hname():
print('print hostname....')
local('hostname')
[root@bdstravel fabric]# fab -f hostinfo.py -l
Available commands:
hname
[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname....
[localhost] local: hostname
bdstravel
Done.
fabric 簡單實用進階
不想打印過程
[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python
from fabric.api import *
from fabric.colors import *
import os
env.user = 'root'
env.hosts = ['127.0.0.1']
env.port = '22'
def hname():
print(red('print hostname....'))
with settings(hide('running'), warn_only=True):
local('hostname')
[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname.... #打印輸出的是紅色
bdstravel
Done.
對上一步操作做出判斷
[root@bdstravel fabric]# cat hostinfo.py
#!/usr/bin/env python
#coding:utf-8
from fabric.api import *
from fabric.colors import *
import os
env.user = 'root'
env.hosts = ['127.0.0.1']
env.port = '22'
def hname():
print(red('print hostname....'))
with settings(hide('running'), warn_only=True):
res = local('hostname')
if res.return_code == 0:
print (red('-'*30))
print (green('打印成功'))
print (red('-'*30))
else:
print (blue('#'* 30 ))
print (red('打印失敗'))
print (blue('#'* 30 ))
[root@bdstravel fabric]# vim hostinfo.py
[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname....
bdstravel
------------------------------
打印成功
------------------------------
Done
res = local('hostname') 修改為 res = local(red('hostname')) 就是為了讓他報出一個錯誤
[root@bdstravel fabric]# fab -f hostinfo.py hname
[127.0.0.1] Executing task 'hname'
print hostname....
/bin/sh: hostname: command not found
Warning: local() encountered an error (return code 127) while executing 'hostname'
##############################
打印失敗
##############################
Done.
fabric部署lnmp
#!/usr/bin/env python
#coding:utf-8
from fabric.colors import *
from fabric.api import *
"""
自動化部署lnmp環(huán)境
"""
env.roledefs = {
'web':['128.199.177.154']
'db':['127.0.0.1']
}
env.passwords = {
'root@128.199.177.154:22':'centos',
'root@127.0.0.1:22':'centos'
}
@roles('web')
def webtask(): #部署nginx php php-fpm等環(huán)境
print('install nginx php php-fpm...')
with settings(warn_only=True):
run('yum install nginx -y')
run('yum install php-fpm php-mysql php-mbstring php-xml php-mcrypt php-gd -y')
run('chkconfig --levels 35 php-fpm on')
run('chkconfig --levels 35 nginx on')
@roles('db')
def dbtask(): #部署mysql環(huán)境
print(yellow('install mysql...'))
with settings(warn_only=True):
run('yum install mysql-server -y')
run('chkconfig --levels 35 on')
@roles('web','db')
def default_task():
print(yellow('install epel ntp ...'))
with settings(warn_only=True):
run('wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-6.repo')
run('yum install ntp')
def deploy(): #部署入口
execute(default_task)
execute(webtask)
execute(dbtask)