Python Fabric:在同一脚本中使用不同密码在不同主机上执行功能

Python Fabric : Executing functions on different hosts with different passwords, in the same script

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

这是我想要执行的场景,使用 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 连接挂起。

我目前的解决方法是在每次调用 execute 之前修改变量 env.userenv.password(我也可以在 taskA、taskB 和 taskC 的开头这样做)。我真的不觉得那很优雅,完全不符合 Fabric 的精神。

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

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

正如我在上面的评论中所说,使用 use_ssh_config 变量效果很好。但是如果你使用密码 SSH,Fabric 当前不处理 per-host/per-user/per-password 连接(这是正常的,因为使用 SSH 密码被认为是不安全的)

这就是我深入研究 Fabric 源代码并添加新 "feature" 的原因。 Here 是我的资源库,如果你想看的话。基本上,我使用了 env.roledefs 变量,它将角色列为字典条目。每个角色都有一个主机列表、一个用户和一个密码。现在,如果你想在一个或多个主机(具有不同的用户名和密码)上执行任务,有两种方法可以做到:

  • 用装饰器注释任务@complete_roles('role1', 'role2')
  • 使用函数execute(task, complete_roles=['role1', 'role2'])

请务必将 'role1' 和 'role2' 作为 env.roledefs

中的键

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