我目前正在尝试自动化部署过程,涉及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连接挂起。
我目前的解决方法是在每次调用env.user
之前修改变量env.password
和execute
(我也可以在taskA,taskB和taskC的开头执行此操作)。我真的没有找到那么优雅,完全不在Fabric的精神之下。
如果有人遇到这种情况,在尝试使用env.passwords
字典时发现他/她自己挂着SSH连接,我就是你的全部!当然,如果有人已经设法做出更优雅的多主机密码处理,我会很高兴听到任何提示。
答案 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
如果您想了解有关我的贡献的更多信息,请查看最新的两个提交。我知道,我的代码不是最干净的......