env
を設定するFabric 1fabfileがたくさんあります。 現在、そのコードをファブリック2に移行することは自明ではありません。ドキュメントでは、たとえばconnect_kwargs
ていますが、それを設定する方法や場所についてはあまり説明していません。 Invokeのドキュメントを読んだ後、コードを実行する必要があるため(以下の例では、 keyring
を使用してパスワードを取得する)、YAML / JSON構成オプションを使用できないようです。
すべてをfabric.py
ファイルに移動するようなものが機能するように見えました。
import subprocess
import sys
from getpass import getuser
import os
domain = os.environ.get("DOMAIN", "loctest")
def get_config():
user = getuser()
try:
password = subprocess.check_output(["keyring", "get", domain, user]).strip()
print("Loaded %s password for %s from keyring" % (domain, user))
except subprocess.CalledProcessError:
print(
"Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
file=sys.stderr,
)
return {'user': user, 'password': password}
connect_kwargs = get_config()
残念ながら、それはTypeError: can't pickle module objects
を取得します。 __all__
設定するだけではそれを回避できませんが、すべてを関数に移動することは機能しているようです。
def get_config():
import subprocess
import sys
from getpass import getuser
import os
domain = os.environ.get("DOMAIN", "loctest")
user = os.environ.get("USER", getuser())
try:
password = subprocess.check_output(["keyring", "get", domain, user]).strip()
print("Loaded %s password for %s from keyring" % (domain, user))
except subprocess.CalledProcessError:
print(
"Unable to set password using `keyring` (is it in your PATH?) — expect to be nagged",
file=sys.stderr,
)
return {"user": user, "password": password}
connect_kwargs = get_config()
これを行うためのよりクリーンな方法はありますか/計画されていますか? とりわけ、このコードは、構成からユーザー名を取得しないため、Fabric 1バージョンとはまったく同等ではありません。これは、私が必要とするものではありませんが、「処理を取得する」と言う方法があるはずです。この1つの値を構成および更新します。」
「Python形式」の構成ファイルが「ランタイムコードの実行を介して構成値を入力する」という穴を大まかに埋めることを意図していたので、 .py
ファイルで間違いなく正しい方向に進んでいました。 そうは言っても、私は結論に至るまでその考えに従わなかったので、あなたはその代償を払っているようです、お詫びします。 (理由の一部は、ほとんどの上級ユーザーがタスクファイル/ファブファイルで何かをしていると想定していることに注意しますが、どちらの方法でも、構成風データからランタイムタスク本体へのブリッジは機能する必要があります。)
何がピクルスになるかを覚えていないが、それはおそらく設定システムのいくつかの癖です、私はそれを掘り下げる必要があります。 私はピクルスが好きではないので(最近は好きです)、このコンテキストでピクルスがポップアップするのを見つけたのは少し驚きでした。
とにかく、最も近い原因は、モジュールの内容が構成であると想定しているため、モジュールオブジェクトの属性から構成のネストされたdictに移行するときに、より厳密なフィルタリングが必要になることです。 正直に言うと、モジュールを削除するだけで十分な場合があります。これは、他の変数の割り当ては、構成ファイルの作成者の側で間違いなく悪い動作になるためです。
Re:「ネストされた構成値を1つだけ変更する」という高レベルの設計の質問。ほとんどの場合、直感的に機能するはずです(構成のマージプロセスは深いマージを行う傾向があるため、.pyファイルはconnect_kwargs = {'user': foo', 'password': 'bar'}
設定するだけですconnect_kwargs
コンテンツとマージされるはずですが、特にconnect_kwargs
周りにいくつかのバグがある可能性があると思います(例:#1762)。
これが私の最初のFabric2アップグレードの試みであり、それ以来多くのコミットが飛んでいるのを見てきたので、これを再テストする必要があります。
fabfile.pyファイルを使用した簡単なHelloWorldの例はありますか? 私はすべてのドキュメントを読み、インターネットを数日間精査してきましたが、v2ではまだ1つのコマンドをリモートで実行できませんでした。 私が得る限り、SSHException「利用可能な認証方法がありません」で立ち往生しています
最も参考になるコメント
fabfile.pyファイルを使用した簡単なHelloWorldの例はありますか? 私はすべてのドキュメントを読み、インターネットを数日間精査してきましたが、v2ではまだ1つのコマンドをリモートで実行できませんでした。 私が得る限り、SSHException「利用可能な認証方法がありません」で立ち往生しています