结构部署“mkdir -p”给出套接字错误“没有这样的文件或目录”,但命令在ssh中工作

时间:2017-05-29 16:40:27

标签: python django amazon-web-services ubuntu fabric

我正在使用fabric3将django项目部署到ubuntu(16.04)服务器。该代码包括使用mkdir -p创建目录(如果需要)。代码段:

from fabric.api import env, local, run
(...)
def _create_directory_structure_if_necessary(site_folder):
    for subfolder in ('database', 'static', 'virtualenv', 'source'):
        run(f'mkdir -p {site_folder}/{subfolder}')

当我运行fab deploy:host=ubuntu@my.site.com时,我收到以下错误:

[ubuntu@my.site.com] Executing task 'deploy'
[ubuntu@my.site.com] run: mkdir -p /home/ubuntu/sites/my.site.com/database

Fatal error: Low level socket error connecting to host my.site.com on port 22: No such file or directory (tried 1 time)

Underlying exception:
    No such file or directory

Aborting.

生成的目录是正确的,并且服务器上已存在此文件结构,其中包含有效的网站。如果我ssh到服务器,mkdir -p /home/ubuntu/sites/my.site.com/database没有错误。为什么命令在ssh窗口中工作,而不在Fabric脚本中工作?

详细信息:使用默认情况为ubuntu的Amazon Web Services EC2服务器。 App使用django,nginx,gunicorn,Python3.6。我正在关注Harry Percival的书Test-Driven Development with Python。从Mac OS X部署。

2 个答案:

答案 0 :(得分:0)

问题在于密钥文件的路径在目录名中有空格。我使用了引用的路径名来容纳这个:

env.key_filename = '~/"Bad Foldername/aws/keyname.pem"'

将密钥移动到没有空格的路径,并消除额外的报价。

答案 1 :(得分:0)

我遇到了同样的问题,但这是由于密钥文件在给定路径中不存在而引起的。

解决方法是将env.key_filename文件添加到指定路径,并且有效!