【问题标题】:Python Fabric : Executing functions on different hosts with different passwords, in the same scriptPython Fabric:在同一脚本中使用不同密码在不同主机上执行功能
【发布时间】:2017-10-17 17:56:27
【问题描述】:

我目前正在尝试自动化部署过程,涉及 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 连接挂起。

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

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

【问题讨论】:

    标签: python ssh fabric


    【解决方案1】:

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

    【讨论】:

    • 您好,@jq170727,感谢您的回答,很抱歉我的回复晚了!当我们通过公钥/私钥对处理安全性时,我确认您的回答效果很好!但是,在我的上下文中,我必须坚持不安全的方式,并且暂时无法控制。但是我找到了解决问题的方法,我将在上面的答案中进行描述
    【解决方案2】:

    正如我在上面的评论中所说,使用 use_ssh_config 变量效果很好。但是如果您使用密码进行 SSH,Fabric 当前不处理每个主机/每个用户/每个密码的连接(这是正常的,因为使用 SSH 密码被认为是不安全的)

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

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

    请确保将“role1”和“role2”作为env.roledefs 中的键

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多