前陣子為了完成 Fabric 同時部屬多台機器的功能,寫了一個字串展開的小工具。
使用 python regular expression 來實作,讓使用者可以利用逗號、數字、括弧將字串批次展開。
簡單的 use case:
>>> from name_expansion import NameExpansionCore >>> ne = NameExpansionCore() >>> host = '[tw,hk][1-2].host[3,5].com' >>> host_list = list([host]) >>> for match in ne.parse(host): ... host_list = ne.expand(match, host_list) >>> host_list ['tw1.host3.com', 'hk1.host3.com', 'tw1.host5.com', 'hk1.host5.com', 'tw2.host3.com', 'hk2.host3.com', 'tw2.host5.com', 'hk2.host5.com']
Fabric 要部屬的機器是儲存在 env.hosts 裡面,型態是 list,所以我們只要在 fabfile.py 加入一個 method,將 Name expansion 批次展開的結果回存到 env.hosts 裡。
def h(curr_host): ne = NameExpansionCore() host_list = list([curr_host]) for match in ne.parse(curr_host): host_list = ne.expand(match, host_list) env.hosts = host_list
接著我們就可以透過 Fabric 內建指令 fab,同時指定多台機器做部屬的動作,不過執行部屬的動作是循序的,並不是平行的。
fab h:host[1-3].com deploy
詳細使用教學可以參照 Github repository 的說明。
Github repository link: https://github.com/hansliu/name-expansion