使用Fabric连接到~/.ssh/config中列出的主机
我在使用Fabric
的时候遇到了问题,它没有识别我在~/.ssh/config
文件中设置的主机。
我的fabfile.py
文件内容如下:
from fabric.api import run, env
env.hosts = ['lulu']
def whoami():
run('whoami')
当我运行$ fab whoami
时,得到的结果是:
[lulu] 运行: whoami
致命错误: 找不到名称 lulu
在我的~/.ssh/config
文件中,有一个名为lulu
,内容是这样的:
Host lulu
hostname 192.168.100.100
port 2100
IdentityFile ~/.ssh/lulu-key
我最初想到的解决办法是往/etc/hosts
文件里添加类似lulu.lulu
的内容(我用的是Mac),但这样我还得把身份文件传给Fabric——我更希望把我的身份验证(也就是~/.ssh/config
)和部署(也就是fabfile.py
)分开。
另外,如果你尝试连接hosts
文件中的主机,fabric.contrib.projects.rsync_project
似乎也不识别hosts.env
中的“端口”(也就是说,如果你使用hosts.env = [lulu:2100]
,调用rsync_project
时,它似乎会尝试连接到lulu:21
)。
那么,Fabric为什么不识别这个lulu
的名字呢?
4 个回答
更新: 这个回答 现在已经过时。
Fabric 目前不支持 .ssh/config 文件。你可以把这些设置放在一个函数里,然后在命令行中调用,比如:fab production task;其中 production 设置了用户名、主机名、端口和 SSH 身份。
至于 rsync 项目,现在应该可以设置端口了,如果不行,你可以直接运行 local("rsync ..."),因为这基本上就是那个贡献的功能所做的事情。
请注意,当名字不在 /etc/hosts
文件里时,也会出现这个问题。我之前也遇到过同样的问题,所以我需要把主机名同时添加到这个文件和 ~/.ssh/config
文件里。
从1.4.0版本开始,Fabric部分支持使用你的ssh配置。不过,你需要手动开启这个功能,方法是在你的fabfile文件的顶部附近加上
env.use_ssh_config = True
这样一来,Fabric就会读取你的ssh配置文件(默认是~/.ssh/config
,或者是env.ssh_config_path
指定的路径)。
需要注意的是:如果你使用的版本低于1.5.4,当env.use_ssh_config
被设置时,如果没有找到配置文件,就会出现错误。这种情况下,你可以使用以下的解决方法:
if env.ssh_config_path and os.path.isfile(os.path.expanduser(env.ssh_config_path)):
env.use_ssh_config = True