25

これは非常にFabric固有の質問ですが、経験豊富な Python ハッカーは、Fabric を知らなくても、これに答えることができるかもしれません。

コマンドが実行されている役割に応じて、コマンドで異なる動作を指定しようとしています。

def restart():
    if (SERVERTYPE == "APACHE"):
        sudo("apache2ctl graceful",pty=True)
    elif (SERVERTYPE == "APE"):
        sudo("supervisorctl reload",pty=True)

私はこれを次のような関数でハッキングしていました:

def apache():
    global SERVERTYPE
    SERVERTYPE = "APACHE"
    env.hosts = ['xxx.xxx.com']

しかし、それは明らかにあまりエレガントではなく、役割を発見したばかりなので、私の質問は次のとおりです。

現在のインスタンスが属しているロールを確認するにはどうすればよいですか?

env.roledefs = {
    'apache': ['xxx.xxx.com'],
    'APE': ['yyy.xxx.com'],
}

ありがとう!

4

5 に答える 5

18

この質問をした他のすべての人にとって、これが私の解決策です:

鍵は env.host_string を見つけることでした。

これは、1 つのコマンドでさまざまなタイプのサーバーを再起動する方法です。

env.roledefs = {
    'apache': ['xxx.xxx.com'],
    'APE': ['yyy.xxx.com']
}

def apache():
    env.roles = ['apache']

...

def restart():
    if env.host_string in env.roledefs['apache']:
        sudo("apache2ctl graceful", pty=True)
    elif env.host_string in env.roledefs['APE']:
        sudo ("supervisorctl reload", pty=True)

楽しい!

于 2010-06-23T14:51:40.690 に答える
12

私はそれをテストしませんでしたが、うまくいくかもしれません:

def _get_current_role():
    for role in env.roledefs.keys():
        if env.host_string in env.roledefs[role]:
            return role
    return None
于 2012-03-12T19:46:46.890 に答える
6

-R フラグで指定された役割、またはスクリプト自体にハードコーディングされたenv.roles役割が与えられます。@rolesコマンドラインまたはデコレータを使用してタスクごとに指定されたロールは含まれません。現在、この種の情報を取得する方法はありません。

fabric の次のリリース (おそらく 1.9)env.effective_rolesでは、現在実行されているタスクに使用されているロールなど、正確に必要な属性が提供されます。そのためのコードはすでに master にマージされています。

この問題を見てください。

于 2014-04-21T19:43:57.607 に答える