我正在使用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:[email protected]
时,我收到以下错误:
[[email protected]] Executing task 'deploy'
[[email protected]] 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脚本中工作?
详细信息:使用Amazon Web Services EC2服务器,使用默认的ubuntu
用户。 App使用django,nginx,gunicorn,Python3.6。我正在关注Harry Percival的书Test-Driven Development with Python。从Mac OS X部署。
问题在于密钥文件的路径在目录名称中有空格。我使用了引用的路径名来容纳这个:
env.key_filename = '~/"Bad Foldername/aws/keyname.pem"'
将密钥移动到没有空格的路径并消除额外的引号。
我遇到了同样的问题,但这是因为密钥文件在给定路径中不存在。
修复是在指定的路径添加env.key_filename
文件,它的工作原理!