2

私は次のような環境を持っています:

env.roledefs = {
    'cisco-collectors': ['hosta', 'hostb', 'hostc'],
    'brocade-collectors': ['hosta', 'hostd']
}

特定の役割のホストに送信する必要がある特定のファイルがいくつかあります。

files = {
    'cisco-collectors': ['/path/to/filea', '/path/to/fileb'],
    'brocade-collectors': ['/path/to/filec', '/path/to/filed']
}

コマンドラインで役割が指定されたとき、または@roles()デコレータを使用して適切なファイルリストを取得できるように、 sendFiles() 関数をどのように記述すればよいですか?

この質問は、ホストがロールに属しているかどうかを判断する方法を示していますが、現在実行されているロールを取得する必要があるため、どのファイル リストを送信するかがわかります。

理想的には、次のようになります。

@roles('cisco-collectors', 'brocade-collectors')    
def sendFiles():
  for file in files[env.current_role]:
    put(file)
4

2 に答える 2

1

env.host_string.role最新のfabricソース (未リリース) の現在の役割が含まれています。

コミット

于 2013-01-22T23:51:42.637 に答える
0

私のテストでは、1.5 で現在の役割を確実に取得できるとは思えません。これがどのように変化するかについては、Pavel の回答を参照してください。これは不便に思えるかもしれませんが、その理由は、Fabric がホストのリストを結合するため、役割が引き継がれないためだと思います。

ただし、ロール機能を使用する必要がない場合は回避策があります。ホスト リストを変更するタスクを作成できます。ただし、これは1 つの役割でしか機能しません。

from fabric.api import task, local, env

@task
def role1():
    env.current_role = 'role1'
    env.hosts.extend(['example.com'])

@task
def role2():
    env.current_role = 'role2'
    env.hosts.extend(['test.example.com'])

@task
def test():
    print env.current_role
    print env.hosts

ここで実行すると、次のfab role1 testように表示されます。

[localhost] Executing task 'test'
role1
['localhost', 'example.com']
[example.com] Executing task 'test'
role1
['localhost', 'example.com']

正確にはあなたが求めていたものではありません...しかし、何がうまくいくかを導くのに役立つかもしれません.

于 2013-01-22T23:59:51.137 に答える