2017-09-24 83 views
0

我目前正試圖自動部署過程中,涉及3臺不同的機器:的Python面料:在具有不同的密碼不同主機上執行的功能,在同一個腳本

  • 用戶A @玉簪,PWDA
  • 用戶B @hostB,PWDB
  • 用戶C @ hostC,pwdC

這是我想執行,使用Python的面料庫(到我新的)場景:

def deploy(): 
    execute(taskA, hosts=[hostA]) 
    execute(taskB, hosts=[hostB]) 
    execute(taskC, hosts=[hostC]) 

我試圖設置變量env.passwords這樣的:

env.passwords = {'[email protected]:22':pwdA, '[email protected]:22':pwdB, '[email protected]:22':pwdC} 

但它使SSH連接掛。

我目前的解決方法是在每次調用execute之前修改變量env.userenv.password(我也可以在taskA,taskB和taskC的開頭執行此操作)。我真的不覺得這是非常優雅的,完全不在Fabric的精神之中。

如果有人遇到過這種情況,在嘗試使用env.passwords字典時發現他/她掛着SSH連接,我就是你的!當然,如果任何人已經設法做出更優雅的多主機密碼處理,我會很高興聽到任何提示。

回答

0

將你的ssh細節保存在~/.ssh/config中並讓Fabric使用它可能會更好。見

+0

你好,@ jq170727,謝謝你的回答,並且很抱歉我遲到的回覆! 當我們通過公鑰/私鑰對處理安全性時,我確認您的回答正常工作! 但是,在我的情況下,我必須堅持不安全的方式,目前無法控制這一點。然而,我找到了解決我的問題的方法,我將在上面的答案中描述 –

0

正如我在評論說以上,使用use_ssh_config變量運行良好。但是如果你使用密碼SSH,Fabric目前不能處理每個主機/每個用戶/每個密碼的連接(這是正常的,因爲使用SSH密碼被認爲是不安全的)

這就是爲什麼我挖入Fabric的源代碼,並添加了新的「功能」。 Here是我的存儲庫,如果你想看看。基本上,我使用env.roledefs變量,它將角色列爲字典條目。每個角色都有一個主機,一個用戶和一個密碼的列表。現在,如果你想在一個或多個主機(有不同的用戶名和密碼)執行任務,有兩種方法可以做到這一點:

  • 註解任務與裝飾@complete_roles('role1', 'role2')
  • 使用功能execute(task, complete_roles=['role1', 'role2'])

只要確保有「基於role1」和「role2所」作爲關鍵字在env.roledefs

如果你想對我的貢獻更多的信息,只是檢查了兩款最新的提交。我知道,我的代碼不是最乾淨的...

相關問題