1

fabfile.pyにコマンドが1つだけあります。

@role('dev')
def test():
    local('...')

今、私は--role=devすべてのコマンドで使用できますが、これは非常に愚かです。

私が欲しいのは、特定の役割でプロジェクトをホストに一度インストールしてから、このパラメーターを繰り返さずにそれを使用することです。

4

2 に答える 2

2

私は通常、fabfile.pyに次のものを含めます。

if not len(env.roles):
    env.roles = ["test"]

これは、env.rolesが(たとえばコマンドラインを介して)定義されていない場合、私の場合は「テスト」として定義する必要があることを示しています。したがって、あなたの場合、私は上記を変更して代用devするので、次のtestようになります。

if not len(env.roles):
    env.roles = ["dev"]

これを行うことにより、将来の任意の時点で必要に応じてオーバーライドする機能を提供しながら、探している動作を取得できることがわかります。

編集:私はこれを編集して、小さな例のfabfile.pyと使用法の説明を含めています。

env.roledefs = {
    'test': ['test.fabexample.com'],
    'stage': ['stage.fabexample.com'],
    'prod': ['web01.fabexample.com', 'web02.fabexample.com', 'web03.fabexample.com'],
}
# default role will be test
env.roles = ['test']

def git_pull():
    run("git pull")

def deploy():
    target = "/opt/apps/FOO"
    with cd(target):
        git_pull()
    sudo("service apache2 restart")

これで、このfabfileを使用して、「test」、「stage」、または「prod」の3つの異なる環境のいずれかにコードをデプロイできるようになります。コマンドラインからデプロイする環境を選択します。

fab -R stage deploy

また、

fab --role=stage deploy

ロールを指定しない場合、ファブリックは設定されているため、デフォルトで「test」になりますenv.roles。そのファブリックはローカルボックスに何もするために使用されません。代わりに、で定義されているようにローカルボックス(または複数のボックス)に作用しますenv.roledefsが、いくつかの変更を加えると、ローカルでも機能するようになります。

通常、fabricコマンドは、テスト、ステージング、または本番ボックスでこれらの操作をリモートで実行するために開発ボックスから使用されます。したがって、コマンドラインを介して役割を指定することは「非常に愚か」ではありませんが、この場合は仕様によるものです。

于 2012-10-09T22:38:33.113 に答える
0

env.roledefsを使用して、ロールをホストのグループに関連付けることができます。

于 2012-10-09T20:21:48.583 に答える