fabfile.pyにコマンドが1つだけあります。
@role('dev')
def test():
local('...')
今、私は--role=dev
すべてのコマンドで使用できますが、これは非常に愚かです。
私が欲しいのは、特定の役割でプロジェクトをホストに一度インストールしてから、このパラメーターを繰り返さずにそれを使用することです。
私は通常、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コマンドは、テスト、ステージング、または本番ボックスでこれらの操作をリモートで実行するために開発ボックスから使用されます。したがって、コマンドラインを介して役割を指定することは「非常に愚か」ではありませんが、この場合は仕様によるものです。
env.roledefsを使用して、ロールをホストのグループに関連付けることができます。