31

次のような fabfile があります。

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()

やりたい

fab deploy

と同等にする

fab host1_deploy host2_deploy

つまり、各サブタスクを実行し、それぞれに指定されたホストのリストを使用します。ただし、これは機能しません。代わりに、 deploy() タスクは、すべてのサブタスクに伝播する独自のホスト リストを必要とします。

ここで deploy() タスクを更新して、サブタスクを個別に実行できるように残しながら、必要なことを実行する方法はありますか?

4

4 に答える 4

31

Fabric 1.3 以降、executeこれを行うためにヘルパーが利用できるようになりました。ドキュメントはここから入手できます: execute を使用してインテリジェントにタスクを実行します。

彼らが使用する例は次のとおりです。

from fabric.api import run, roles, execute

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3'],
}

@roles('db')
def migrate():
    # Database stuff here.
    pass

@roles('web')
def update():
    # Code updates here.
   pass

そして、両方migrateweb別のタスクから実行するにはdeploy:

def deploy():
    execute(migrate)
    execute(update)

そして、これはそれらのタスクが持つ役割とホストのリストを尊重します。

于 2011-11-17T20:02:16.900 に答える
3

これは不自由ですが、Fabric 1.1.2 で動作します。

def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    if env.host in ["host1"]:
        pass #this is only on host2

def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    if env.host in ["host2"]:
        pass #this is only on host2

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()

ここに私のテストコードがあります:

@task
@roles(["prod_web","prod_workers"])
def test_multi():
    test_multi_a()
    test_multi_b()

def test_multi_a():
    if env.host in env.roledefs["prod_web"]:
        run('uname -a')

def test_multi_b():
    if env.host in env.roledefs["prod_workers"]:
        run('uname -a')
于 2011-07-12T20:35:58.950 に答える
1

おそらくこれを処理するためのより良い方法がありますが、両方のホストを deploy() に渡し、次に host1_deploy() と host2_deploy() で env.host をチェックすることができます。

def host1_deploy():
    if env.host in ['host1']:
         run(whatever1)

def host2_deploy():
    if env.host in ['host2']:
         run(whatever2)

@hosts('host1','host2')
def deploy():
    host1_deploy()
    host2_deploy()
于 2011-03-18T04:44:23.073 に答える
1

これを試してみてください。run明らかに local をorに置き換えたいと思いますsudo。キーは空の@hostsデコレータですdeploy

from fabric.api import local
from fabric.decorators import hosts

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    local('echo foo')

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    local('echo bar')

@hosts('')
def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()
于 2011-06-28T07:08:40.663 に答える