Fabric: 'hosts'以外の追加のroledefsキーがenvにロードされない

作成日 2015年02月13日  ·  7コメント  ·  ソース: fabric/fabric

ドキュメントからサンプルキー「foo」をユーザーがenv経由で利用できるようにするのではなく、「hosts」キーのみがその後Fabricによって(env.hostsに)ロードされます。

from fabric.api import env

env.roledefs = {
    'web': {
        'hosts': ['www1', 'www2', 'www3'],
        'foo': 'bar'
    },
    'dns': {
        'hosts': ['ns1', 'ns2'],
        'foo': 'baz'
    }
}

このstackoverlowの質問についてさらに文書化

最も参考になるコメント

@bitprophetなぜこれが閉じられたのですか? 追加のroledefキーの動作は変更されていないので、これは「修正されない」のでしょうか。

全てのコメント7件

以下の例を設定ファイルとして使用し、fabfiles.pyを処理するための内部関数を追加できます。

のように:list.db
インターフェイス| ip |パスワード|役割...。
それがあなたのために働くことを願っています。

各セッションで接続するホストを決定するためにファブリックによって使用されるいくつかのenvキーがあります。つまり、roles、effective_roles、hosts、host_stringです。 そしてもちろんデコレータも。

とはいえ、roledefsはホストをグループ化するための名前マッピングにすぎず、env.hostsにマージする必要はありません。

roledefsをdictとして定義すると、ホストの横にある、役割固有の他のカスタム設定を整理するのに役立ちます。 完全なenvパス、つまりenv.roledefs.web.fooを介してそれらにアクセスできます。

しかし、あなたが発行するように、そしておそらく期待するように、dictとして定義された役割はenvルートにマージされるべきであるということです。
これは私が個人的にも使用しているものです。 特定のタスクを実行するときに「現在の」ロールを実際に設定/取得するすべての可能な方法と、タスク内でサブタスクを呼び出すときの複雑さのために、それを実装してリクエストをプルするための良い方法をまだ見つけていません。 簡単に説明すると、envへの変更をサブスクライブし、キーrolesがenvに設定されたときにロールをマージすることでこれを行います。 ただし、「難しい」部分は、状態を保持し、セッション内で新しいロールが使用されたときにマージされるロールをクリーンアップすることです。

env.roledefs.web.fooは次のエラーを生成します: AttributeError: 'dict' object has no attribute 'web'

つまり、通常のdict、env.roledefs ['web'] ['foo']のようにアクセスできますが、この機能がFabricに存在する理由がわかりません。これは、単なるdictです。 この機能はもっと便利な理由で実装されたようですか?

申し訳ありませんが、あなたは正しいです、あなたはあなたが言うようにそれにアクセスしなければなりません。

現在、ホストの横にさらに多くの役割設定をグループ化できるようにする以外に理由はありません。
ただし、マイルストーン1.11がリリースされ、#1092が存在する場合は、より理にかなっています。

また、#1088は1.11の一部であり、これはあなたの説明/期待に似ています。 しかし、私が言ったように、roledefのマージを実装するための良い方法はまだ見つかりませんでした。 「醜い」深いモンキーパッチを使用したフォークでの認識の証明のみ。

ああ、そうですね、何かが足りないと思って壁に頭をぶつけていました:)参照されている問題番号は、転がるたびにかなり役立つように見えます。 Jonasに感謝します!

これは紛らわしいので、これらの追加の変数はroledefの外部からアクセスできないことに注意する必要があると思います。

@bitprophetなぜこれが閉じられたのですか? 追加のroledefキーの動作は変更されていないので、これは「修正されない」のでしょうか。

このページは役に立ちましたか?
0 / 5 - 0 評価