簡體   English   中英

使用Fabric部署到多個EC2服務器

[英]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

如果您需要處理主機的子部分,我建議使用標簽。

Fabric未設置為在所有主機上運行相同的任務。

除了可以使用-H命令行參數顯式設置特定任務的主機之外,您還可以使用模式和新模式完全按照您的意願執行操作。

更新: 此處顯示了如何使用roles

或者你可以簡單地編寫一個設置一些變量的方法,例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM