的Python面料:在具有不同的密码不同主机上执行的功能,在同一个脚本
问题描述:
我目前正试图自动部署过程中,涉及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.user
和env.password
(我也可以在taskA,taskB和taskC的开头执行此操作)。我真的不觉得这是非常优雅的,完全不在Fabric的精神之中。
如果有人遇到过这种情况,在尝试使用env.passwords
字典时发现他/她挂着SSH连接,我就是你的!当然,如果任何人已经设法做出更优雅的多主机密码处理,我会很高兴听到任何提示。
答
将你的ssh细节保存在~/.ssh/config
中并让Fabric使用它可能会更好。见
- 利用SSH本地配置文件
http://docs.fabfile.org/en/1.4.0/usage/execution.html#ssh-config - 连接到在〜/ .ssh/config中列出的主机使用面料
时https://stackoverflow.com/a/9685171
答
正如我在评论说以上,使用use_ssh_config变量运行良好。但是如果你使用密码SSH,Fabric目前不能处理每个主机/每个用户/每个密码的连接(这是正常的,因为使用SSH密码被认为是不安全的)
这就是为什么我挖入Fabric的源代码,并添加了新的“功能”。 Here是我的存储库,如果你想看看。基本上,我使用env.roledefs
变量,它将角色列为字典条目。每个角色都有一个主机,一个用户和一个密码的列表。现在,如果你想在一个或多个主机(有不同的用户名和密码)执行任务,有两种方法可以做到这一点:
- 注解任务与装饰
@complete_roles('role1', 'role2')
- 使用功能
execute(task, complete_roles=['role1', 'role2'])
只要确保有“基于role1”和“role2所”作为关键字在env.roledefs
如果你想对我的贡献更多的信息,只是检查了两款最新的提交。我知道,我的代码不是最干净的...
你好,@ jq170727,谢谢你的回答,并且很抱歉我迟到的回复! 当我们通过公钥/私钥对处理安全性时,我确认您的回答正常工作! 但是,在我的情况下,我必须坚持不安全的方式,目前无法控制这一点。然而,我找到了解决我的问题的方法,我将在上面的答案中描述 –