我正在使用Fabric运行一些部署任务,需要将Mercurial存储库签出/更新到机器,然后执行适当的复制/配置。
每次我安装一台新机器(我们目前正在为我们的基础架构使用EC2)或者当我在机器中运行hg pull
时,它会询问我的ssh密钥密码,这对我们来说有点烦人需要一次初始化十几台机器。
我尝试在新的EC2实例初始化时在Fabric中运行ssh-add
,但看起来ssh-agent
没有针对该shell运行,我收到Could not open a connection to your authentication agent.
条消息来自Fabric的输出。
当Fabric脚本连接到实例时,如何使ssh-add
工作?
答案 0 :(得分:3)
面料问题跟踪器上的comment为我解决了这个问题。它是lincolnloop solution的修改版本。使用此“run”而不是fabric将通过本地ssh管理命令,允许本地ssh-agent提供密钥。
from fabric.api import env, roles, local, output
from fabric.operations import _shell_escape
def run(command, shell=True, pty=True):
"""
Helper function.
Runs a command with SSH agent forwarding enabled.
Note:: Fabric (and paramiko) can't forward your SSH agent.
This helper uses your system's ssh to do so.
"""
real_command = command
if shell:
cwd = env.get('cwd', '')
if cwd:
cwd = 'cd %s && ' % _shell_escape(cwd)
real_command = '%s "%s"' % (env.shell,
_shell_escape(cwd + real_command))
if output.debug:
print("[%s] run: %s" % (env.host_string, real_command))
elif output.running:
print("[%s] run: %s" % (env.host_string, command))
local("ssh -A %s '%s'" % (env.host_string, real_command))
请注意我正在运行Fabric 1.3.2,这个修复程序将不再需要更长时间。