要安裝最新版的 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, cdrun(): 跑在 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())
沒有留言:
張貼留言