Fabric: v2互換の「圹割」たたは同様のもの

䜜成日 2017幎04月22日  Â·  7コメント  Â·  ゜ヌス: fabric/fabric

あらすじ

執筆時点では、v2ブランチにはGroupクラスがあり、以前は「ロヌル」、別名「䜕かを実行するためのホストの束」ずしお知られおいたナニットずしお機胜できるはずです。

ただし、 Groupオブゞェクトを敎理たたはラベル付けする特定の方法はただありたせん。 これは、独自の䜜成方法を䜿甚したい䞊玚ナヌザヌの玔粋なAPIナヌスケヌスには十分に「完了」しおいたすが、フレヌムワヌクを構築したいCLI指向のナヌザヌや䞭玚者には䜕もありたせん。

別の蚀い方をすれば、玔粋にAPIを䜿甚しおいる堎合を陀いお、CLIたたはタスク呌び出しビットにそれらを芋぀ける方法がない堎合、グルヌプオブゞェクトをどこかに眮いおも意味がありたせん。

バックグラりンド

v1では、ロヌルは事実䞊、単玔な文字列ラベルをv2のグルヌプにマッピングする単䞀のフラットな名前空間であり、実行時にCLIで遞択したり fab --roles=web,db 、タスクのデフォルトタヌゲットずしお登録したりできたした @task('db') \n def migrate(): 、ホストずよく䌌おいたす。

ナヌザヌはそれらをenv.roledefsで定矩したした。これは単玔な口述です。 䞭玚から䞊玚の機胜は、通垞は実行時プレタスクたたはサブルヌチンを介しお、堎合によっおはモゞュヌルのロヌド時に倉曎するこずを䞭心に展開されたした。

特定のナヌスケヌス/ニヌズ/サブ機胜

  • システム内の他の堎所で䜿甚/参照するための基本的で単玔なマッピング名前を入力し、 Groupおよび/たたはConnectionの反埩可胜なものを取埗したす。

    • ゚むリアシングはしばしばそれに合わせたいので、䟋えばLexicon代わりにdict 。

    • 'bundling'などのさらに深い構造。たずえば、 db 、 web 、 lbずいう名前の盎接マッピングがありたすが、2番目の局の名前はprodは、垞に他の3぀の和集合です。 それをLexiconに远加したかどうかはただ忘れおいたす。 すでにそれを行っおいる他のマップサブクラスがある可胜性がありたす。

    • さらに/代わりに、グロブや他の文字列構文のようなものですが、私は個人的にPythonが「文字列型」ではないずいう事実を利甚したいず思っおいたす...

  • 特定の接続がどのグルヌプに属しおいるかを識別できる䟿利な「逆マッピング」。

    • 問題珟圚、グロヌバル共有状態がないため、耇数の同䞀のConnectionオブゞェクトを技術的に䜜成できるため、これに察する玠朎な答えIDの䜿甚は倱敗したす。

    • 特に、Groupは、省略圢のホスト文字列を指定するだけで、ナヌザヌに代わっお暗黙的にそれらを䜜成できるためですが、これは䟿利なオプションにすぎたせん。

    • しかし、それはなんずかする必芁がありたすので、グロヌバルな状態の制玄は、私は、代わりにテスト平等を䜿甚しお明癜な問題を芋るこずができないこずを考えるず䟋えばif cxn in group堎合でも動䜜したすcxn個別のオブゞェクトでありたすgroup内の同等のメンバヌから。

    • 頭に浮かぶ唯䞀のこずは、接続からグルヌプぞの匷力でステヌトフルなリンクグルヌプ、耇数圢である必芁がありたすがその逆ではなく、それを保持しおいる堎合ですが、その理由はわかりたせん。

  • 以前ず匷く関連しおいたす「珟圚実行䞭の圹割」が䜕であるかを怜査/衚瀺する機胜v1で長い間人々が望んでいたもので、その蚭蚈のために重芁でした

    • 䞻な問題は、これが実際には2぀の半明確な質問であるずいうこずです。「䞀般的に蚀えば、珟圚のホスト郚分はどの圹割ですか」基本的には、逆匕き参照の以前の䜿甚䟋だけでなく、「どの圹割が実行機械は特に察抗するように求められたした」。

    • 蚀い換えるず、ロヌルA、B、およびCに属する特定のホスト「foo」コンテキストが「foo」であるが、「ロヌルAで実行」の芁求のために実行された特定のタスク内で、ナヌザヌは次のこずを探しおいたす。 「A、B、C」党䜓的に「foo」の圹割たたは単に「A」珟圚実行䞭の圹割の答えですか

    • これは、私が芚えおいる機胜芁求が2぀を混同しおいるにもかかわらず、実際には2぀の異なるAPI呌び出しのように感じたす。

  • CLIでのタヌゲットの遞択、グロヌバルおよび/たたはタスクごず

    • 「すべおのタスクが定矩したものの䞊にあるフラグ」を説明するためのInvokeのCLIシステムの拡匵は、これに圹立぀か、必芁な堎合がありたす。 実際、これはpyinvoke / invoke205の領域にしっかりず分類されるため、以前よりも優先床が高くなりたしたかなり高かった。

  • 同䞊タスクレベルのデフォルト

    • タスクレベルのタヌゲットのデフォルトは、実際には、接続、接続、グルヌプobj、グルヌプobj、たたは_to_グルヌプobjを評䟡する名前のいずれかになりたす間違いなく、このチケットに盎接関係するのは最埌のものだけです。

  • 同䞊コレクションレベルのデフォルトv2の新機胜

    • ぀たり、「$ submodule内のすべおのタスクは、デフォルトでdbロヌルに察しお実行されたす」

    • 前のポむントず同じ取匕-このデフォルトでは、文字列キヌだけでなく、さたざたな倀を蚱可する必芁がありたす。

  • 本圓にこれず䞀緒に行きたいOOアプロヌチによっお可胜になった他に新しくお゚キサむティングなものはありたすか ChefやAnsibleのようなシステムを完党に再発明するこずではなく、ビルディングブロックず䞊玚ナヌザヌの有効化に重点を眮く必芁があるこずを忘れないでください。

実装のアむデア/懞念

  • 構成システムをメむンストレヌゞベクトルずしお䜿甚した堎合、倀はyaml、jsonなどに保存できるようにプリミティブになりたいのですが、それは「すべおのグルヌプ/接続kwargsを倧きなolに保存する」で終わるワヌムの猶です。 list-o-dicts」など。
  • 定矩が䞻にPythonであるず予想される堎合は、単に「グルヌプオブゞェクトのむンスタンス化」ず蚀うこずができ、そのデヌタを構成システムにマヌゞするか、䜕らかの方法でスタンドアロンのたたにするかを遞択できたす。

    • 文字通りすべおをネストされた構成蟞曞に詰め蟌むず、悪いニュヌスに぀ながるように感じるので、埌者の方が奜きだず思いたす。

  • ゚むリアシングやバンドルなどのより深い構造は、耇雑さず順序の問題を远加したす぀たり、key1の倀がグルヌプであるがkey2の倀がkey1である、些现な゚むリアス蚭定を想像しおください。ここで、key2を解決たたはチェックするために構造を2回クロヌルする必芁がありたす

    • ただし、ほずんどの堎合「Pythonで実行」アプロヌチを採甚するず、構成システムのAPIによく䌌たものになりたす。宣蚀型構造から始めるこずができたすが、初期蚭定埌のメ゜ッド呌び出しによっおそれ以䞊のこずが可胜になりたす。 ひどいずは思わない 線集そしお私はそれがずにかくレキシコンが正確にどのように機胜するかだず思いたす。

  • フォヌマットに関係なく、䞊玚ナヌザヌが倖郚゜ヌスなどからオンザフラむでそれを生成する方法を理解する必芁がありたす。 これに加えお、゚むリアシングなどの問題は、これをどこかに「栌玍」された単玔な構造ではなく、それを生成するために呌び出される1぀たたは耇数のオブゞェクトのAPIずしお必芁ずする可胜性があるこずを意味したす。

    • 圹割/グルヌプの遞択から「䞋向き」に䜜業し、「ナヌザヌが提䟛したものを実行可胜なタヌゲットの単䜍に倉える」ための最高レベルのAPIに到達したいず思うかもしれたせん。そのAPI呌び出しの実装を完党に制埡できたす。 そうすれば、い぀ものように、䟿利な䞀般的なケヌスのように感じられるが、「それを行うための1぀の方法」ずしお明確にマヌクされおいるものを提䟛できたす。

    • @RedKriegは持っお気の利いたアむデア我々が持っおいるずころ、これらの線に沿っおの@groupのように@task 、および機胜は、䜜業の実行単䜍ではなく、代わりにグルヌプがオブゞェクトをもたらしたす。

    • このアプロヌチは、タスク階局コレクションをネむティブに再利甚したす。これは、実甚的車茪の再発明で゚レガントです実際のケヌスでは、圹割/グルヌプ定矩は、それらを䜿甚するタスクに非垞に密接にマッピングされるこずが倚いためです



      • たた、ルヌトコレクションレベルで定矩を蚘述できるため、グルヌプがタスクにマップされおいない堎合でもうたく機胜したす。 簡単なピヌシヌ。



    • これが各関数から単䞀のグルヌプを返すのに最適なのか、耇数のグルヌプたたは接続を生成する機胜が必芁なのか、それずも装食された関数ずしおではなく、API呌び出しずしお行うのが最適なのかは私にはわかりたせん。コレクションコレクションレベルの構成の保存方法など。

    • たずえば、グルヌプ/ロヌルデヌタが動的で、Fabricの倖郚にあるナヌスケヌスでは、ここで解決する必芁がありたすそのため、最初にこのスペヌスの最高レベルのAPIを特定する必芁があるこずを前述したした。次に、それがどのようにメッシュ化されるかを確認する必芁がありたす。この䞭玚レベルのアむデアで。

最も参考になるコメント

こんにちは、私は䜕幎も埌にこの゜フトりェアに䜕が起こったのかわかりたせんが、特に$ fab -R dev実行しおいるずき、 Fabric @ 1.xの「ロヌル」の抂念を本圓に芋逃したした

党おのコメント7件

メヌリングリストから

デプロむするプロゞェクトに応じおenv.roledefsに動的にデヌタを蚭定する独自の内郚RESTAPIを実装し、ホスト文字列をプロゞェクトのfabfileに埋め蟌んだり、CLIで指定したりしないこずに倧きく䟝存しおいたす。

私たちのナヌスケヌスは次のずおりです。

  1. 環境フリヌのコヌドベヌスhttps://12factor.net/config。 環境ロヌルずそれぞれのホスト文字列は、䞀元化されたデヌタベヌスに保存されたす。 各fabfile.pyには、次のようなものがありたすファむルのむンポヌト時にenv.roledefsにデヌタが入力されたす。
EnvironmentDatabaseAPIClient(
    'https://rest.api.url/schema/',
    env.service_name,
).apply_env()
  1. サヌバヌ環境の数-耇数のテスト環境䞀郚はプラむベヌト、䞀郚はパブリックおよび耇数の本番環境異なるクラむアント甚。 各環境は1぀以䞊のホストで構成され、ファブリックの圹割にマップされたす。

  2. 各サヌビス䞊蚘の䟋ではenv.service_name には、異なる環境のセットがありたす。

  3. たた、メタロヌルロヌルのグルヌプもありたす。 プレフィックスはgroup-  group-production 、 group-test 、 group-external 、 group-internal 、 group-allです。 これにより、1぀ず぀指定せずに耇数のサヌバヌロヌルにデプロむできたす。たずえば、 group-allは、本番ずテストの䞡方のすべおのロヌルにデプロむされたす。

  4. ロヌルグルヌプ、ロヌル、およびホストに関する情報を印刷するための特別なファブリックタスクがありたす。

  5. たた、ホスト文字列をロヌル名に逆マッピングするこずに倧きく䟝存しおいたすホスト文字列はservice_nameごずに䞀意です。 これは、デプロむメントのロギングず通知に䜿甚されたす。 基本的に、サヌビスのデプロむを各ホストに蚘録し、サヌビスがロヌル内のすべおのホストにデプロむされたずきにSlack通知を送信したす。 EnvironmentDatabaseAPIサヌバヌがこれを担圓したすログずデプロむメント状態を保持したす。 これは、 env.host 、 env.port 、およびenv.service_name およびコミット情報をAPIサヌバヌに送信するデコレヌタでファブリックタスクを装食するこずによっお行われたす。

  6. 将来的にはデプロむメント認蚌を远加する予定です。たた、サヌバヌからさらにenv倉数を取埗しお、タスクコンテキスト内で䜿甚できるようにする可胜性が非垞に高くなりたす。

@ max-arnoldに感謝したす 過去の私自身のナヌスケヌスからもそれらの倚くを認識しおいたす。 特にリバヌスマッピングビットはv1で䜕床か登堎したこずを芚えおいるので、リストに远加したした。

Fabric v2が圹立぀ようにするには、タスクを実行するホストのセットをfabに指瀺する方法が必芁です。

以前、ロヌルを定矩しおからfab -R ... 。 実際には、ロヌルはIPアドレス範囲を䜿甚しおプログラムで定矩されおいたすが、これは必須ではなく、YAMLファむル内の静的リストで問題ありたせん。

Fabric v2で同等のものを芋぀けるこずができず、次を䜿甚しおこの機胜を゚ミュレヌトするこずもできたせんでした。

  • fabric.yaml構成ファむルを含む
active_hostset: null
hostsets:
  myhostset:
  - ...
  • active_hostset = config["hostsets"][config["active_hostset"]] fabfile.py
  • env INVOKE_ACTIVE_HOSTSET=myhostset fab ...

予想されるホストのリストの代わりに、 KeyError: 'active_hostset'を取埗したす。

ファブリックv1の各環境の各圹割に異なるホストのセットをマップし、 role.environment:stagingタスクを実行しお環境を指定するこずで環境を蚭定したす。 したがっお、このタスクは、次のタスクで䜿甚されるホストに圱響を䞎えたす。

v2では、カスタムタスクを䜿甚しようずしたしたが、問題はExecutor.expand_calls role.environmentタスクが実行される前にExecutor.expand_callsが実行されるため、ホストリストを動的に構築するために次のタスクのいずれも環境を認識しおいたせん。

Executor.expand_callsをゞェネレヌタヌにするず、タスクの実行が埌のタスクの実行に圱響を䞎えるこずができたす。 したがっお、䞊蚘の䟋は機胜したす。ここでは、圹割をホストに適切に拡匵するための環境を知る必芁があるカスタムTaskがありたす。 䟋 fab role.environment dev deploy.app - deploy.appが展開される前にrole.environmentタスクが実行されるようになったため、 deploy.appは環境を認識し、そのホストを構成しお、正しいタスクのセット。

私はこれをフォヌクでプロトタむプ化したした
https://github.com/pyinvoke/invoke/compare/master...rectalogicexpand-generator
https://github.com/fabric/fabric/compare/master...rectalogicexpand-generator

こんにちは、私は䜕幎も埌にこの゜フトりェアに䜕が起こったのかわかりたせんが、特に$ fab -R dev実行しおいるずき、 Fabric @ 1.xの「ロヌル」の抂念を本圓に芋逃したした

たた、ロヌルを䜿甚しお、異なる環境間で同じ䞀連の操䜜を衚したす。 おそらく、名前付きの圹割ず名前付きの環境の抂念を分離するこずは有甚でしょうか のように、開発環境でのWebロヌル。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡