84

Fabric无法识别我在~/.ssh/config.

fabfile.py的如下:

from fabric.api import run, env

env.hosts = ['lulu']

def whoami():
    run('whoami')

运行$ fab whoami给出:

[lulu] 跑:whoami

致命错误:lulu 的名称查找失败

名称lulu在 my 中~/.ssh/config,如下所示:

Host lulu
     hostname 192.168.100.100
     port 2100
     IdentityFile ~/.ssh/lulu-key

lulu.lulu我解决这个问题的第一个想法是添加类似的东西/etc/hosts(我在 Mac 上),但是我还必须将身份文件传递给 Fabric - 我宁愿将我的身份验证(即~/.ssh/config)与我的部署分开(即fabfile.py)。

同样,顺便说一句,如果您尝试连接到 hosts 文件中的主机,fabric.contrib.projects.rsync_project似乎并没有确认其中的“端口” hosts.env(即,如果您使用hosts.env = [lulu:2100]调用 torsync_project似乎尝试连接到lulu:21)。

Fabric 无法识别此lulu名称是否有原因?

4

4 回答 4

146

从 1.4.0 版开始,Fabric 使用您的 ssh 配置(部分)。但是,您需要显式启用它,使用

env.use_ssh_config = True

在你的 fabfile 顶部附近的某个地方。完成此操作后,Fabric 应该读取您的 ssh 配置(~/.ssh/config默认情况下,或来自env.ssh_config_path)。

env.use_ssh_config一个警告:如果您使用早于 1.5.4 的版本,如果已设置但不存在配置文件,则会发生中止。在这种情况下,您可以使用以下解决方法:

if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
    env.use_ssh_config = True
于 2012-03-13T13:42:03.090 回答
9

请注意,当名称不在时也会发生这种情况/etc/hosts。我遇到了同样的问题,不得不将主机名添加到该文件和~/.ssh/config.

于 2011-04-15T08:30:23.760 回答
5

更新:这个答案现在已经过时了


Fabric 目前不支持 .ssh/config 文件。您可以在函数中设置这些,然后调用 cli,例如:fab production task;其中 production 设置用户名、主机名、端口和 ssh 身份。

至于 rsync 项目,它现在应该具有端口设置功能,如果没有,您始终可以运行 local("rsync ...") ,因为这本质上是贡献函数所做的。

于 2010-09-02T14:35:09.910 回答
4

可以使用以下代码来读取配置(原始代码取自: http: //markpasc.typepad.com/blog/2010/04/loading-ssh-config-settings-for-fabric.html):

from fabric.api import *
env.hosts = ['servername']

def _annotate_hosts_with_ssh_config_info():
    from os.path import expanduser
    from paramiko.config import SSHConfig

    def hostinfo(host, config):
        hive = config.lookup(host)
        if 'hostname' in hive:
            host = hive['hostname']
        if 'user' in hive:
            host = '%s@%s' % (hive['user'], host)
        if 'port' in hive:
            host = '%s:%s' % (host, hive['port'])
        return host

    try:
        config_file = file(expanduser('~/.ssh/config'))
    except IOError:
        pass
    else:
        config = SSHConfig()
        config.parse(config_file)
        keys = [config.lookup(host).get('identityfile', None)
            for host in env.hosts]
        env.key_filename = [expanduser(key) for key in keys if key is not None]
        env.hosts = [hostinfo(host, config) for host in env.hosts]

        for role, rolehosts in env.roledefs.items():
            env.roledefs[role] = [hostinfo(host, config) for host in rolehosts]

_annotate_hosts_with_ssh_config_info()
于 2011-09-20T11:07:13.607 回答