[英]Deploying to multiple EC2 servers with Fabric
我想知道是否有人在使用結構的 ec2上部署到負載平衡器后面的多個服務器的經驗
我現在已經使用了一段時間的Fabric,並且沒有問題,或者部署到多個服務器,但我想在這個場景中做的是(假設我有十個實例運行)de-register half(5)of來自我的負載均衡器的盒子,將我的代碼部署到它們並運行冒煙測試,如果一切看起來都很好,再次使用負載均衡器注冊它們並取消注冊剩余的5個實例並部署到它們,然后將它們注冊回負載均衡器。
我完成任何單個任務(取消注冊,運行測試,部署等)都沒有問題,我只是不知道如何以簡單的方式組織我的主機,以便我可以部署上半部分,然后是下半部分。 Fabric似乎設置為按順序在所有主機上運行相同的任務(主機1上的任務1,主機2上的任務1,主機1上的任務2,主機2上的任務2等)
我的第一個想法是創建一個任務來處理取消注冊,部署和測試的第一部分,然后為服務器的后半部分設置env.hosts,但我覺得這似乎有點過分了。
以前有沒有人用Fabric模仿類似的東西?
您可以通過定義角色 (用於主機聚合)和在一個角色上執行任務,然后在第二個角色上運行測試和部署來簡化此操作。
roledefs
示例:
env.roledefs = {
'first_half': ['host1', 'host2'],
'second_half': ['host3', 'host4'],
}
def deploy_server():
...
# deploy one host from current role here
def deploy():
# first role:
env.roles = ['first_half']
execute('deploy_server')
test() # here test deployed servers
# second role:
env.roles = ['second_half']
execute('deploy_server')
更多鏈接:
您想使用execute()函數。 這將允許您執行以下操作:
def update():
deallocate()
push_code()
smoke_test() #could fail fast
reallocate()
def deploy():
execute(update, hosts=first_five)
execute(update, hosts=last_five)
您還可以在部署中對每個deallocate,push_code和smoke_test任務執行execute()調用,然后運行所有deallocates然后運行所有代碼推送等。
然后進行某種檢查,然后繼續運行所述任務的其他人。
我已成功將Fabric與boto結合起來。 我使用boto填充主機列表。 您可以使用@parallel裝飾器來限制一次執行的主機數量。 該命令如下所示;
fab running deploy
代碼看起來像這樣;
@task
@runs_once
def running():
ec2conn = ec2.connect_to_region(region)
reservations = ec2conn.get_all_instances(filters={'instance-state-name': 'running'})
instances = list(chain.from_iterable(map(lambda r: r.instances, reservations)))
env.hosts = list(chain.from_iterable(map(lambda i: i.public_dns_name, instances)))
@task
@parallel(pool_size=5)
def deploy():
# do stuff on n<=5 hosts in parallel
如果您需要處理主機的子部分,我建議使用標簽。
或者你可以簡單地編寫一個設置一些變量的方法,例如:
def live():
global PATH, ENV_PATH
env.hosts = ["22.2.222.2"]
env.user = 'test'
PATH = '/path/to/project'
# optional, is using virtualenv
ENV_PATH = '/path/to/virtualenv'
# overwri
在當前機器上需要更改的任何變量
在運行deploy命令之前,運行:
fab live deploy
詳細信息: http : //simionbaws.ro/programming/deploy-with-fabric-on-multiple-servers/
您可以將列表(或任何可迭代的)傳遞給主機裝飾器,而不是插入env.hosts。 就像是:
def deploy(half_my_hosts):
@hosts(half_my_hosts)
def mytask():
# ...
mytask()
然后你可以用你喜歡的任何方式拆分你的env.hosts並將它傳遞給deploy()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.