2017-09-24 77 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

如果你想对我的贡献更多的信息,只是检查了两款最新的提交。我知道,我的代码不是最干净的...

相关问题