前陣子為了完成 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