Python Fabric:在同一脚本中使用不同密码在不同主机上执行功能
Python Fabric : Executing functions on different hosts with different passwords, in the same script
我目前正在尝试自动化部署过程,涉及 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.user
和 env.password
(我也可以在 taskA、taskB 和 taskC 的开头这样做)。我真的不觉得那很优雅,完全不符合 Fabric 的精神。
如果有人 运行 遇到这种情况,在尝试使用 env.passwords
字典时发现 him/herself 有一个挂起的 SSH 连接,我就是你的了!当然,如果有人已经设法做出更优雅的多主机密码处理,我会很高兴听到任何提示。
最好将您的 ssh 详细信息保存在 ~/.ssh/config
中并让 Fabric 使用它。参见
- 利用本机 SSH 配置文件
http://docs.fabfile.org/en/1.4.0/usage/execution.html#ssh-config
- 使用 Fabric 时连接到 ~/.ssh/config 中列出的主机
正如我在上面的评论中所说,使用 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
中的键
如果您想了解有关我的贡献的更多信息,只需查看最近的两个提交即可。我知道,我的代码不是最干净的...
我目前正在尝试自动化部署过程,涉及 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.user
和 env.password
(我也可以在 taskA、taskB 和 taskC 的开头这样做)。我真的不觉得那很优雅,完全不符合 Fabric 的精神。
如果有人 运行 遇到这种情况,在尝试使用 env.passwords
字典时发现 him/herself 有一个挂起的 SSH 连接,我就是你的了!当然,如果有人已经设法做出更优雅的多主机密码处理,我会很高兴听到任何提示。
最好将您的 ssh 详细信息保存在 ~/.ssh/config
中并让 Fabric 使用它。参见
- 利用本机 SSH 配置文件
http://docs.fabfile.org/en/1.4.0/usage/execution.html#ssh-config - 使用 Fabric 时连接到 ~/.ssh/config 中列出的主机
正如我在上面的评论中所说,使用 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
如果您想了解有关我的贡献的更多信息,只需查看最近的两个提交即可。我知道,我的代码不是最干净的...