Python Fabric:在同一个脚本

时间:2017-09-24 17:47:16

标签: python ssh fabric

我目前正在尝试自动化部署过程,涉及3台不同的机器:

  • userA @ hostA,pwdA
  • userB @ hostB,pwdB
  • userC @ hostC,pwdC

这是我想要使用Python的Fabric库(我是新的)执行的场景:

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

我试图像这样设置变量 env.passwords

env.passwords = {'userA@hostA:22':pwdA, 'userB@hostB:22':pwdB, 'userC@hostC:22':pwdC}

但它使SSH连接挂起。

我目前的解决方法是在每次调用env.user之前修改变量env.passwordexecute(我也可以在taskA,taskB和taskC的开头执行此操作)。我真的没有找到那么优雅,完全不在Fabric的精神之下。

如果有人遇到这种情况,在尝试使用env.passwords字典时发现他/她自己挂着SSH连接,我就是你的全部!当然,如果有人已经设法做出更优雅的多主机密码处理,我会很高兴听到任何提示。

2 个答案:

答案 0 :(得分:0)

最好将您的ssh详细信息保存在~/.ssh/config中并让Fabric使用它。参见

答案 1 :(得分: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

中的键

如果您想了解有关我的贡献的更多信息,请查看最新的两个提交。我知道,我的代码不是最干净的......