8

ファブリックを使用したec2のロードバランサーの背後にある複数のサーバーにデプロイした経験がある人はいないかと思います

私はしばらくの間ファブリックを使用していて、問題がないか、複数のサーバーにデプロイしていますが、このシナリオで実行したいのは(10個のインスタンスを実行しているとしましょう)半分(5)の登録を解除することですロードバランサーのボックスを使用して、コードをそれらにデプロイし、スモークテストを実行します。すべてが正常に見える場合は、それらをロードバランサーに再度登録し、残りの5つのインスタンスの登録を解除してデプロイしてから、ロードバランサー。

個々のタスク(登録解除、テストの実行、デプロイなど)を実行するのに問題はありません。前半、後半をデプロイできるように、ホストを単純な方法で整理する方法がわかりません。 。ファブリックは、すべてのホストで同じタスクを順番に実行するように設定されているようです(ホスト1のタスク1、ホスト2のタスク1、ホスト1のタスク2、ホスト2のタスク2など)

私の最初の考えは、登録解除、デプロイ、テストの最初の部分を処理するタスクを作成し、次にサーバーの後半にenv.hostsを設定することでしたが、これは少し厄介なように思えました。

誰かが以前にFabricでこれに似たものをモデル化したことがありますか?

4

6 に答える 6

5

これを単純化するには、ロール(ホストの集約に使用)を定義し、1つのロールでタスクを実行してから、テストを実行して2番目のロールにデプロイします。

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')

その他のリンク:

于 2012-05-01T21:47:08.493 に答える
3

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()呼び出しを実行してから、すべてのdeallocateを実行してから、すべてのコードプッシュを実行することもできます。

次に、ある種のチェックを行い、他のタスクを実行します。

于 2012-05-01T21:36:46.227 に答える
1

私は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

ホストのサブセクションを処理する必要がある場合は、タグを使用することをお勧めします。

于 2013-01-20T01:14:46.723 に答える
0

ファブリックは、すべてのホストで同じタスクを実行するように設定されていません。

-Hコマンドラインパラメーターを使用して特定のタスクのホストを明示的に設定できるという事実とは別に、このパターンと この新しいパターンを使用して、必要なことを正確に実行できます。

更新:ここでは、使用方法を示していますroles

于 2012-05-01T20:49:08.807 に答える
0

または、次のように、いくつかの変数を設定するメソッドを作成することもできます。

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/

于 2014-03-04T20:23:41.847 に答える
-1

env.hostsに干渉するのではなく、リスト(または反復可能なもの)をホストデコレータに渡すことができます。何かのようなもの:

def deploy(half_my_hosts):
    @hosts(half_my_hosts)
    def mytask():
        # ...
    mytask()

次に、env.hostsを任意の方法で分割し、deploy()に渡すことができます。

于 2012-05-01T20:59:06.470 に答える