Sharing

2012年3月20日 星期二

Fabric 1.4 筆記


要安裝最新版的 fabric 建議用以下的方式, Ubuntu 11.10 目前是使用 1.0 版的 Fabric, 有很多好功能還無法使用

sudo apt-get install python-pip
sudo apt-get install python-crypto
sudo pip install fabric


http://docs.fabfile.org/en/1.4.0/index.html

from fabric.api import run, sudo, cd
run(): 跑在 remote 端
sudo(): 用 root 權限跑在 remote 端
cd(): 進入 folder, 只在 remote 端執行

from fabric.api import local, lcd

local(): 在本地執行, 而且會傳回一個物件,包含著執行是否成功的資訊
lcd(): 進入 folder, 只在 local 端執行

from fabric.api import env

可以設定環境變數, 其中有一些很常用
  • user: 登入 remote 端使用的帳號
  • password: 登入 remote 端使用的密碼
  • skip_bad_hosts: 跳過沒有反應的 remote, 而不要中斷
  • hosts: 設定有那些 remote
  • roledefs: 設定有那些角色,以及包含了那一些 host, 不過和上一個屬性建議分開使用
from fabric.api import settings

settings(): 在某一區塊短暫的改變 fabric 執行環境變數,
ex:warn_only -- 不要因為錯誤就中斷

from fabric.contrib.console import confirm

confirm(): 和 User互動,確認 Yes or No


from fabric.api import abort

abort(): 直接中斷


from fabric.api import run, roles

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3'],
}

@roles('db')
def migrate():
    # Database stuff here.
    pass

@roles('web')
def update():
    # Code updates here.
    pass

def deploy():
    execute(migrate)
    execute(update)


可以把每台機器分成不同的角色, 並且指定那些功能是那些角色要做的事
在執行時要記得使用 execute, 不然會只在原本的 host list 執行
我覺得用法應該是不用指定 env.hosts, 只要把每台機器的角色設定好後, 就執行 deploy 即可

Warning
This technique works because tasks that themselves have no host list (this includes the global host list settings) only run one time.

def new_user(username, admin='no', comment="No comment provided"):
    log_action("New User (%s): %s" % (username, comment))
    pass

http://docs.fabfile.org/en/1.4.0/usage/fab.html#per-task-arguments

可以針對每個功能下參數
fab new_user:myusername
fab new_user:username=myusername
fab new_user:myusername,yes
fab new_user:myusername,admin=yes


有很多好用的 tag

@parallel(pool_size=5) 指定要平行運作, 但最多一次5台機器, 如果是用 cmd line : -P -z 5
@serial 指定要遁序運作
@hosts 指定那些 hosts 要執行這個 task
@roles 指定那些 roles 要執行這個 task
@task(alias='xxx', default=True) 指定成外部可以用的 task, 並且有一個 alias


http://docs.fabfile.org/en/1.4.0/usage/tasks.html
這邊介紹了如何用 submodule 及 namespacing 來建構工作, 非常實用, 目前的想法是可以把 fabric 檔案放在 source code 的每一層
比方說:一個大專案裡面有三個小專案, 可以在每個專案下建制自己的 deployment 方法, 最後在最上層打一個整合包
.
├── __init__.py
├── fabfile.py
├── module1
│   ├── __init__.py
│   ├── deploy.py
├── module2
│   ├── __init__.py
│   ├── deploy.py
├── module3
│   ├── __init__.py
│   ├── deploy.py

在fabfile.py 內, 就指定那些角色要安裝什麼 module

from fabric.api import *
import module_1
import module_2
import module_3

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3'],
}

@task(default=True, alias='deploy')
def deploy_all():
    execute(module_1.deploy, role='db')
    execute(module_2.deploy, role='web')
    execute(module_3.deploy, roles=env.roledefs.keys())




沒有留言: