2015-02-23 33 views
3

這款面料命令的作品就好了fab local grab_from_s3:bucket=...Fabric:在目標主機上執行內聯Python?

def grab_from_s3(bucket, path, localfile): 
    s3_connection = S3Connection() 
    s3_bucket = s3_connection.get_bucket(bucket) 
    s3_key = Key(s3_bucket) 
    s3_key.key = path 
    s3_key.get_contents_to_filename(localfile) 

當然,如果我給它一個遠程目標主機,它下載到本地主機,而不是遠程。 (即fab staging grab_from_s3:bucket=...)。

我希望這些可能性存在一個:

  1. 該任務可以自動上以最少的編碼大驚小怪的遙控盒上運行,或
  2. 我可以編程方式檢測目標主機ISN本地,併爲遠程主機指定結構命令行。

我非常喜歡#1,但目前尚不清楚這是否可能。關於#2的不明確之處在於是否有現有的光纖通道設施使其變得如此簡單(即檢測本地/遠程主機以及它們不同)。

我該怎麼辦?

回答

3

Fabric不支持在遠程主機上運行任意python代碼。 Fabric主要通過SSH(對於遠程機器)調用shell命令來運行。遠程計算機甚至不需要爲Fabric運行安裝python。

execnet項目允許您像在想象的那樣通過網絡運行python代碼,您可以在本地和遠程不用修改的情況下運行相同的代碼。

最簡單的解決方案可能是將相同的結構代碼部署到本地主機和遠程主機,然後讓本地任務遠程運行S3下載任務(通過shell命令)。

你遇到的一個問題(用execnet和在遠程機器上運行fab任務)都是你需要在遠程機器上安裝boto。不知道你是否已經有了這個設置。

另一種選擇是通過遠程主機上的結構運行命令行工具,如s3cmdofficial AWS command line client

2

在本地主機上使用Fabric在遠程主機上運行Fabric,這將允許您在遠程主機上執行Python命令。由於Fabric配置可能非常複雜,因此以下代碼片段不一定會在您的環境中無需修改即可使用。例如,運行Fabric的命令在各種平臺上可能會有所不同。

def local_grab_from_s3(): 
    bucket = "my_bucket" 
    path = "my_path" 
    localfile = "local_filename" 

    s3_connection = S3Connection() 
    s3_bucket = s3_connection.get_bucket(bucket) 
    s3_key = Key(s3_bucket) 
    s3_key.key = path 
    s3_key.get_contents_to_filename(localfile) 

定義另一個函數調用遠程主機上的第一功能:

def grab_from_s3(): 
    cmd("fab local_grab_from_s3") 

在本地的命令行

在fabfile執行所需Python代碼定義一個函數主機,運行fab -H remote_host grab_from_s3

相關問題