[英]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.user
和env.password
(我也可以在taskA,taskB和taskC的开头进行此操作)。 我真的觉得那不是很优雅,完全超出了Fabric的精神。
如果有人遇到这种情况,在尝试使用env.passwords
dict时发现其挂起的SSH连接,我全都是你的! 当然,如果有人已经设法进行更加优雅的多主机密码处理,那么我将很高兴听到任何提示。
最好将ssh详细信息保留在~/.ssh/config
并让Fabric使用。 看到
正如我在上面的评论中所述,使用use_ssh_config变量效果很好。 但是,如果您使用密码进行SSH,Fabric当前不处理每个主机/每个用户/每个密码的连接(这很正常,因为使用SSH密码被认为是不安全的)
这就是为什么我要研究Fabric的源代码,并添加新的“功能”的原因。 如果您想看一下, 这是我的资料库。 基本上,我使用了env.roledefs
变量,该变量将角色列为字典条目。 每个角色都有一个主机列表,一个用户和一个密码。 现在,如果要在一个或多个主机(具有不同的用户名和密码)中执行任务,有两种方法可以执行:
@complete_roles('role1', 'role2')
注释任务 execute(task, complete_roles=['role1', 'role2'])
只是一定要拥有“基于role1”和“role2所”作为钥匙env.roledefs
如果您想了解有关我的贡献的更多信息,只需检查两个最新提交即可。 我知道,我的代码不是最干净的...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.