我正在使用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部署。
答案 0 :(得分:0)
问题在于密钥文件的路径在目录名中有空格。我使用了引用的路径名来容纳这个:
env.key_filename = '~/"Bad Foldername/aws/keyname.pem"'
将密钥移动到没有空格的路径,并消除额外的报价。
答案 1 :(得分:0)
我遇到了同样的问题,但这是由于密钥文件在给定路径中不存在而引起的。
解决方法是将env.key_filename
文件添加到指定路径,并且有效!