Fabric: localhostに移動する堎合は、オプションでsshの䜿甚を避けおください

䜜成日 2011幎08月19日  Â·  59コメント  Â·  ゜ヌス: fabric/fabric

説明

run/ sudoは、ロヌカルホストに移動するこずをむンテリゞェントに認識し、代わりにlocalを実行したす。 これはおそらくオプションです。

IRCに関するJeffからのコメント

そしお、ええ、私は、sshずストレヌトパむプがオフハンドで垞にオヌバヌヘッドになるこずを意味したす。run/ sudo特にリファクタリングされたマスタヌをロヌカル むンテリゞェントに私はコアでその半魔法の振る舞いを望んでいるずは確信しおいたせんそれを有効にするためのオプチンでデフォルトでオフになっおいる堎合でも、それは助けになりたすが、それでも、それは興味深い実隓になるでしょう。 そしお、それが私が思っおいるほど単玔であるならば、私は正盎にそうしない正圓な理由を思い付くこずができたせんこれもデフォルトの動䜜ではないずいう条件で

もずもずニック・りェルチから提出さmackstann 1時39分PM ESTで2009幎11月11日に

関係

  • 364で耇補ロヌカル操䜜でSSHレむダヌをバむパスできるようにする
  • 26に関連「ドラむラン」機胜の実装
Feature Network

最も参考になるコメント

誰かが「なぜ誰かがこれを行うのか」ず疑問に思っおいる堎合、答えは、デプロむメントパむプラむンがある堎合、ロヌカルホスト甚の特別なセットアップスクリプトを甚意するよりも、どの環境に関係なく、たったく同じデプロむメントスクリプトを実行するず圹立぀堎合があるずいうこずです。察他のすべお。

党おのコメント59件

James Pearson xiong.chiamiovの投皿


ircでも述べたように、私は通垞デスクトップマシンでsshサヌバヌを実行しないので、実際にlocalhostにsshするこずはできたせん。


2009幎11月11日の午前3時13分午埌ESTに

Travis Swicegood  tswicegood の投皿


今晩、 doずいう新しいfabric.operations関数の圢で同様の䜕かを実装したした。 env.run_asを調べお、それが「ロヌカル」に等しいかどうかを確認したす。そうするこずで、 run たたはsudoではなくlocalメ゜ッドに切り替わりたす。 sudo=Trueがkwargずしお枡された堎合。 たた、ロヌカルで実行しおいる堎合に備えお、ロヌカルコマンドのプレフィックスずしおsudoしたす。

これは、 runたたはsudoの動䜜を倉曎せずに機胜する、この問題を回避する別の方法です。 これらの倉曎は私のリポゞトリで利甚でき


2010幎1午前12時22分EST

Morgan Goose  goosemo の投皿


私はこれがもっずもらしいずは本圓に思いたせん。 ロヌカルずしお実行するこずのポむントは䜕ですか。 Fabricの芁件の1぀は、マシン、リモヌト、たたはルヌプバックで実行されるsshdです。 もう1぀の問題は、ロヌカルを倉曎するだけでは、put、get、rsync_projectなど、すべおsshが必芁なものが考慮されないこずです。 それらを実装しようずするず、fabfileをbashに倉換する領域にあるため、実際にはさらに倚くの問題が発生したす。


2011幎午埌11時14分EDT

Jeff Forcier  bitprophet が投皿したした


これが玠晎らしいアむデアだず100確信しおいるわけではありたせんが、明らかに倚くのナヌザヌが必芁だず感じおいるものです。別のリク゚ストが364ずしお提出され、ナヌスケヌスの別の説明がありたす。

たた、これに関連しおドラむランチケットを远加したした。これは、この機胜の䞻な䜿甚䟋がテスト/ドラむランであるためです。ランニング。


2011幎午前11時26分EDT

538で述べたように、3぀のランナヌを完党に正芏化しお亀換可胜に䜿甚できる堎合は、シェル゚スケヌプがそれらの間で䞀貫しお機胜するこずを確認する必芁がありたす。 珟圚、 localシェル゚スケヌプしおいたせんが、少なくずも郚分的にはシェルラッパヌを䜿甚しおいないためです。

誰かが「なぜ誰かがこれを行うのか」ず疑問に思っおいる堎合、答えは、デプロむメントパむプラむンがある堎合、ロヌカルホスト甚の特別なセットアップスクリプトを甚意するよりも、どの環境に関係なく、たったく同じデプロむメントスクリプトを実行するず圹立぀堎合があるずいうこずです。察他のすべお。

機胜の+1

+1

+10

+1

+1

あなたを匕き留めるために、あなたはあなたがOpenSSHサヌバヌを実行しおいるこずを確認するこずができたす。 最初にsudo apt-get install sshを実行しお、むンストヌルされおいるこずを確認したすむンストヌルしおいるず思っおいおも。 次に、 sudo service ssh start | stop | 必芁に応じおrestart 。 このスレッドから孊びたした。

+1

私のナヌスケヌスは単玔です。同じdjango-deployスクリプトを䜿甚しお、CloudWatchを介したcloud-init ロヌカルコマンドを実行する堎合ず通垞のfab deploy_django -H foo@bar䞡方でec2むンスタンスを蚭定したいず思いたす。

+1

これは本圓に䟿利です。 私が持っおいる1぀のナヌスケヌスは、vagrantシェルプロビゞョナヌを䜿甚しお、ファブリックを䜿甚し、ロヌカルホストをsshする必芁なしに特定のVMを構成するこずです。

+1

これがFabricでただ衚瀺されおいないこずに驚きたした。

参考 reboot()ようなファブリック関数に぀いお考えるず、この機胜の実装はより耇雑になりたす。

+1

すでにコアの䞀郚になっおいるはずです

+1

それは完党に理にかなっおいたす。抜象的な芳点からは、 localはrun特殊なケヌスであり、SSH機構は関䞎しおいたせん。

もう1぀指摘しおおきたいこずがありたすおそらく明らかですファブリックは、/ etc / hostsを読み取った埌にrunをlocal倉換するかどうかを決定するのに十分スマヌトである必芁がありたす。

぀たりもし私たちが持っおいるなら

env.host = [ 'mywebserver' ]

/ etc / hostsには次のものがありたす。

127.0.0.1 mywebserver

その堎合、 run呌び出しは、実際にはlocal呌び出しである必芁がありたす。

この抂念をさらに䞀歩進めお、リモヌトホストがロヌカルマシンのネットワヌクむンタヌフェむスに割り圓おられたIPに解決されるずきに、 runをロヌカルコヌルずしお扱う必芁もありたす。
䟋えば
fabfile

env.host = [ 'mywebserver' ]

/ etc / hosts

192.168.1.1 mywebserver

ip addr 

[...]
eth0:
  inet 192.168.1.1
[...]

+1

+1+1

+1

+1

+1

ファブリック2はpyinvoke / invokeを䜿甚するため、これは非垞に簡単に実行できるはずです。 私はこれを行うためのハッキヌでない方法のためにFabric2を埅ちたす。

+1

+1

+1

+1これを実装しおください。特にMacコンピュヌタヌはロヌカルホストサヌバヌぞのリモヌトアクセス甚にSSHトンネルを構成するように自動的に蚭定されおいないためです。

+1

+1 :)

+1しおください

+1

+1

+1

私たちはFabを䜿甚しおDebianパッケヌゞを構築しおおり、これにより耇雑さが増したす

みんな、こんにちはみんな
私は違いのあるファブリックのクロヌンを䜜成しようずしおいたす

  • run関数は、ロヌカルホストのsubprocess.popenでも、リモヌトホストぞのssh接続の堎合ず同じように機胜したす。
  • Factoryはopensshたたは他のsshクラむアントを䜿甚するためこのために構成を倉曎する必芁がありたす、ssh゜ケットのすべおの機胜を䜿甚できたす
  • ファクトリは非同期実行にgeventラむブラリを䜿甚したす

この機胜が必芁な堎合はご芧ください
https://github.com/Friz-zy/factory

この議論で䜕かが欠けおいるかもしれたせんが、ロヌカルホストずリモヌトマシンの䞡方でfab runコマンドで同じコヌドを䜿甚するために私がしたこずは次のずおりです。

  1. fabfile.pyにenv.use_ssh_config = Trueを蚭定したした
  2. ssh-copy-id localhost

ロヌカルマシンでsshサヌバヌを実行しおいない堎合、これでは問題は解決したせん。

+1

+1

+1この機胜を実装しおください:)

+1

既存のFabricスクリプトを䜿甚しおDockerむメヌゞをブヌトストラップするのに非垞に圹立぀可胜性がありたす。 この機胜により、コンテナヌにSSHサヌバヌをむンストヌルする必芁がなくなりたす。これはDockerのベストプラクティスに反し

+1

+1

+1

@AntoniosHadjiによっお提䟛された回答に

# Generate new SSH key for local usage
ssh-keygen -f ~/.ssh/id_rsa -N ''

# Add server keys to users known hosts (eliminates 'are you sure' messages);
ssh-keyscan -H localhost > ~/.ssh/known_hosts

# Allow user to ssh to itself
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

実際、これは料理を䜿っお行うこずができたす。 cuisine.run関数を参照するには、すべおのrun実行を倉曎する必芁がありたす。これは、むンポヌトで簡単に実行でき、モヌドをロヌカルに倉曎したす。

from cuisine import run, mode_local

mode_local()
print run("echo Hello")

玠晎らしい@cgarciaarano

単玔なナヌスケヌスの堎合、これは私にずっおはうたくいきたす

from fabric.api import run, local
# ...
# in task:
  if env.host is None or env.host == 'localhost':
    run = local

+1

sshがオプションでない堎合、fabfileをリモヌトたたはロヌカルで実行したい。 これには、get / put / existsなどのロヌカルラッパヌが含たれたす。

+1ロヌカルずリモヌトの䞡方で実行されるfabfileがあり、run / local / getの独自のラッパヌ関数をハッキングしお、出力キャプチャや゚ラヌ凊理などの埮劙な違いをすべお凊理するこずになりたした。

ポヌト2223の127.0.0.2技術的にはロヌカルホストで動的ポヌト転送ずバむンディングを実行するssh接続がある堎合はどうなりたすかこれが問題を匕き起こす可胜性があるこずがわかりたす。そのため、ロヌカルホストで照合し、127.0.0.1ではなく解決したす。 127.0.0.0/8クラス党䜓をサポヌトするこずは、凊理するのに良い考えかもしれたせん。

@ blade2005はい、127 ._._。*の範囲党䜓がロヌカルホストを指しおいたす127.0.0.0ず127.255.255.255を陀くが、実際にロヌカルホストを指しおいるずきは、ポヌトを正しく䜿甚したせんか
したがっお、 127.*.*.* == localhostずsshは回避できるず安党に想定できたすが、 127.*.*.*:*は転送されたポヌトを指し、sshが必芁です。

正盎なずころ、この機胜は、料理ラむブラリず同様に、ファブリック䞊に構築されたサヌドパヌティのプラグむンずしおおそらくより理にかなっおいたす。 次に、run / get / put / etcのラップされた関数をむンポヌトしたす。これにより、env倉数に基づいおロヌカルで実行するかリモヌトで実行するかがわかりたす。 少なくずもこの方法で、誰かが誰もが䜿甚できるようにこれを開始するこずができたす。

私はロヌカルで䜕かを実装したした、そしおそれは単にロヌカル/実行を切り替えるよりもはるかに倚くの仕事をしたした。 プレフィックス、倉曎されたディレクトリ、sudoナヌザヌなどを考慮する必芁がありたす。

別の2.0関連のチケットのコンテキストでこれに぀いお簡単に考えおいたずころ、「 runがlocal再バむンドになる」だけでなく、さらに倚くのこずが発生するこずに気付きたした。

  • localずrun䞡方、たたはput / getいずれかを䜿甚する、あらゆる皮類の真に混合モヌドのタスク

    • 少数掟のナヌスケヌスであるず思いたすがあるずしおも、「 runたたはsudoがDoesntMakeAnySenseError䞊げる以倖の操䜜を呌び出す堎合でも、それを理解する必芁がありたす。

    • put / getはおそらくshutil.copyたたは同様のものに倉わる可胜性がありたす

    • localはおそらく倉曎されないでしょうただし、䜕が起こっおいるかを印刷するずきは、 run-except-locally前に付けられおいるものず区別したいでしょう...

    • 䞊蚘に觊れたように、 prefix 、 cdなどのさたざたなコンテキスト操䜜メ゜ッド/コンテキストマネヌゞャヌはすべお、同様の質問に答える必芁がありたす。

  • それはさおおき、ロヌカルでsudoコマンドを実行するこずは、朜圚的に巚倧なフットガンであり、おそらく远加の安党チェックが必芁です。

    • それもたた、 localぞの単なる別のバむンディングにならない限り、これは別の可胜性です。 倧きなものではありたせんが、ロヌカルでさえ機胜する぀たり、Linuxにデプロむし、そこからデプロむしおいる sudoコマンドは、おそらくロヌカルで特暩を維持する必芁がありたす䟋 apt / yumずその仲間、ファむアりォヌルのいじくり回しなど。

  • sudoもJonが前述したように、sudoナヌザヌ、パスワヌドなどが䞡者で異なる可胜性があるため、個別のlocal-vs-remote構成ベクトルを構成する可胜性を高める必芁がありたす。

    • 私はFab2のコンテキストでこれらすべおを考えおいるので、予想されるホストごずの構成オヌバヌラむドは、おそらく少なくずもその郚分を解決したす- localhostコンテキストは単に適切な倀を枡されたす。 さらに、「リモヌトのものをロヌカルで実行するための」専甚のContextサブクラスずしお、必芁に応じお他のこずも実行できたす。

@ max-arnoldはv2アルファ版でこれを詊しおいたしたが、混乱する問題が発生したした。これは、この時点で予想されるこずです。 run確認する以倖は、この特定のチケットのナヌスケヌスにただ到達しおいたせん。およびlocalは、可胜な限り類䌌したAPIがありたす。

珟時点での倧きな問題は、タスクのコンテキスト cたたはctxたたは名前が付けられたものposargにバむンドされたオブゞェクトの性質ずAPIです。 珟圚、そしお繰り返したすが、これは最終的なものではありたせん。これたでのずころ、これが最終的な結果です。

  • デフォルトでは、InvokeのExecutorによっお実行されるか、ホストが存圚しないずきにFab 2のFabExecutorによっお実行されるず、 invoke.Context 、ロヌカルで実行されるrunがありたす。 、およびlocalたせん;
  • Fab 2に実行するホストがある堎合、 fabric.Connection 、そのrunはリモヌトで実行され、そのlocalはInvokeのrunの再バむンドです。

ここやリンクされたチケットのナヌスケヌスを芋るなど、より具䜓的な怜蚎が必芁です。 オフハンドブレむンストヌミング

  • これに察する有甚な解決策たたは少なくずもドキュメントは、ほが確実にコアに存圚するはずですコアの倖に䜏んでいるこずに぀いおの以前のチャットによる

    • それは十分に䞀般的なナヌスケヌスです

    • 混乱するのは簡単です

    • 特に、コヌド共有の量を通知するため、v2互換バヌゞョンのpatchwork née contrib および/たたはinvocations Invokeのバヌゞョンを有効に実装する必芁がありたす。 NS。 これらの皮類のコヌドベヌスの倚くのタスクやサブルヌチンは、ロヌカルたたはリモヌトで実行したい堎合がありたす。

  • 本質的には、タスクが呌び出されおいる「方法」を確実に知らない可胜性があるContextオブゞェクトからどのAPIを期埅するかに぀いおです。
  • タスクがどのように生成されるか、぀たり、異なるバヌゞョンの@taskやkwargsを同じにするか、ナヌザヌが期埅を宣蚀できるかどうかに䟝存する可胜性がありたす぀たり、「リモヌト察応のコンテキストを本圓に䞎えたい」、 「リモヌト察応のコンテキストを教えおはいけたせん」など

    • あいたいさを避けるために、これを_必芁_にするこずができたす ZoP12 

    • 考えれば考えるほど、Fabricに@task / Task呚りに独自の軜量ラッパヌを成長させたいこずは明らかです。 pure-Invokeコヌドベヌスは@taskを䜿甚するだけで、垞にバニラContextがトリガヌされたすが、Fabricのバヌゞョンを介しお䜜成されたタスクには、少なくずもConnectionが䞎えられるオプションがありたす。

    • 欠点は、䞊蚘の「ロヌカルでXORをリモヌトで䜿甚できる」タむプのタスクです。 単䞀の「コマンドを実行しおください」オプションのみが必芁で、䞡方のモヌドを同時に混合しないタスク。 これは、「デコレヌタがコンテキストのタむプを宣蚀する」゜リュヌションではうたく機胜したせん。これは、誰がどのように呌び出すかに応じおコンテキストタむプを「切り替える」必芁があるためです。

    • これは実際には珟圚のAPIの1぀のポむントです。 これらのタスクは、_ ctx.run()存圚する限り_、コンテキストサブクラスを_気にしたせん_。

    • したがっお、おそらく、FabricたたはFabricのような呌び出しの芳点から誰かがそれらを䞎えるオプションがあるこずを理解しお、 @task 「ベヌスのバニラコンテキストのみが必芁」バヌゞョンで装食したいず思うでしょう。 Context代わりにConnectionタスクしたす。



      • これにより、タスクを正確に実行する方法、別名pyinvoke / invoke170に぀いお疑問に思うようになりたす。



  • 実装に関係なく、次のようなこずを行うナヌザヌの朜圚的なフットガンを最小限に抑える必芁がありたす。

    • 存圚しない堎合はlocal期埅したすファブリック/接続-Invokeを介しお実行されるコヌドを期埅したす

    • 代わりにリモヌトrunコンテキストが䞎えられたずきに、 runがロヌカルで実行されるこずを期埅したすファブリックを介しお実行されるコヌドの呌び出し/コンテキストを期埅したす

    • ここにマックスの远加コメントから他のもの

  • はるかに叀いコメントに芋られるように、ここでのサブナヌスケヌスは、v2に盞圓するConnection('localhost').run('foo')が_SSHを䜿甚せず_代わりにConnection('localhost').local('foo')たったく同じように動䜜するこずを期埅しおいるナヌザヌです。

    • ロヌカルホストの健党性チェックを行おうずする人にずっおは厄介なフットガンのように感じるので、私は実際にはこれをしたくないず思っおいたす。 それは私にはあたりにも魔法のように感じたす。 しかし、私はおそらくオプトむンベヌスで議論を受け入れおいたすたずえば、 ssh.localhost_becomes_subprocess = Trueなどの構成オプションを蚭定したす。

珟時点での私の唯䞀のナヌスケヌスは、 upload_template()がテンプレヌトをロヌカルでレンダリングできるこずです。

もちろん、次のようにするこずもできたす。

#http://matthiaseisen.com/pp/patterns/p0198/
import os
import jinja2


def render(tpl_path, context):
    path, filename = os.path.split(tpl_path)
    return jinja2.Environment(
        loader=jinja2.FileSystemLoader(path or './')
    ).get_template(filename).render(context)

しかし、ロヌカルでレンダリングするオプションがないのはなぜですか

私の堎合、この機胜の䞻な甚途は、ロヌカルテストのためにアプリケヌション構成をロヌカルマシンにデプロむするこずです。

デプロむ時に宛先サヌバヌにレンダリングされるsettings.py.j2があり、 settings.pyずいう名前で、Pythonコヌドのみが含たれ、jinjaは含たれおいないずしたす。
ここでロヌカルでテストしたいのですが、 settings.py.j2からレンダリングする必芁があるため、ロヌカルにはただsettings.pyありたせん。
そのため、アプリを起動できず、ロヌカルテスト甚に個別のsettings.py手動で䜜成する必芁がありたす。

これは非垞に疲れたす、そしおそれはもっず簡単なはずです。

たずえば、Ansibleでは、「ロヌカル接続」を䜿甚するこずをタスクに指瀺するだけで、SSHで接続しようずせずにロヌカルホストでレンダリングされたす。

この機胜がFabricで利甚可胜になるたでは、もちろん、数行のコヌドであるため、䞊蚘で貌り付けた゜リュヌションを䜿甚したす。 私芋ですがもっず簡単なはずです。 それは本圓に生地が私にずっお簡単にするべきもののようなものだず思いたす。

@fninja upload_template自䜓はただ移怍しおいたせんが、この問題領域に該圓するこずには間違いなく同意したす。 おそらく、Jinja-wrappingレンダリングステップずupload-some-stringアップロヌドステップを分割するだけでこれを凊理できたす。埌者はすでに「FLOをput枡す」ずいう圢匏で存圚するためです。 䟋えば

from StringIO import StringIO # too lazy to remember the newer path offhand
from somewhere.jinja_wrapper import render
from invoke import task

<strong i="9">@task</strong>
def render_settings(c):
    rendered = render('settings.py.j2', {'template': 'params'})
    c.put(StringIO(rendered), 'remote/path/to/settings.py')

しかし、 Connectionメ゜ッドたたはConnection匕数を取るサブルヌチンのいずれかである、 Connection upload_templateさらに短い1ストップアナログの䜙地はおそらくただありたす。

いずれにせよ、それはさらに倚くの質問を提起したす正確にこの皮のものをどのように扱うか-たずえば、呌び出しのみ- Contextオブゞェクトにはput / getがありたせん。 それらを远加する䟡倀はありたすか このチケットのコンテキストでは、Fabricナヌザヌにずっおは十分に理にかなっおいたすその堎合、 upload_templateたたはw / eはどちらの堎合も単にputを呌び出すこずができたすが、玔粋な呌び出しナヌザヌにずっおは奇劙ですAPIの圹に立たない郚分。

これをコア機胜にするための+1

1637からのクロスポスト。 ただのアむデア

from fabric import task, local

<strong i="6">@task</strong>
<strong i="7">@local</strong>
def build(ctx):
    with ctx.cd('/project/dir'):
        ctx.run('build > artifact.zip')

<strong i="8">@task</strong>
def deploy(conn):
    build(local(conn))

    with conn.cd('/remote/path'), local(conn).cd('/project/dir'):
        conn.put(remote_path='build.zip', local_path='artifact.zip')

基本的に、 local()はデコレヌタ/コンテキストマネヌゞャ/関数ずしお機胜し、 ConnectionをContext倉換できたす。

私が蚀及したずは思わない別のナヌスケヌス再利甚可胜な関数のラむブラリを構築する。 私の堎合、それは䞻にgitコマンドです。 runずlocal関数パラメヌタヌv1の違いを隠す非垞に単玔なdorunを䜜成したした。 どの関数が遞択されたかがパラメヌタずしお枡されたす。 たずえば、 git checkoutを次に瀺したす。

def git_checkout(branch, remote='origin', run=run):
    """Checkout a branch if necessary."""

    if branch == git_current_branch(run=run):
        return
    elif branch in git_local_branches(run=run):
        dorun('git checkout ' + branch, run=run)
    else:
        dorun('git checkout -t -b {0} {1}/{0}'.format(branch, remote), run=run)


def git_current_branch(run=run):
    """Get the current branch (aka HEAD)"""

    output = dorun('git name-rev --name-only HEAD', run=run)
    return output.strip()


def git_local_branches(run=run):
    """Get a list of local branches; assumes in repo directory."""

    output = dorun('git branch --no-color', run=run)
    branches = {l.strip().split(' ')[-1]
                for l in output.strip().split('\n')}
    return branches

これは次のようになりたす。

from fabric.api import run as run_remote, local as run_local

def dorun(*args, **kwargs):
    """Work around the fact that "local" and "run" are very different."""
    kwargs.setdefault('run', run_remote)
    run = kwargs.pop('run')

    if run == run_local:
        kwargs.setdefault('capture', True)
    elif 'capture' in kwargs:
        del kwargs['capture']

    return run(*args, **kwargs)

sudo䜕が起こるかわかりたせん。たた、パスを生成するために~remoteuserを展開するなど、簡単に察凊できない問題がありたす。

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