使用Fabric写入远程文件

时间:2011-06-04 15:11:10

标签: python fabric

我正在尝试使用Fabric备份数据库并将它们移动到不同的服务器。

在远程服务器上,要打开文件进行写入失败并显示错误。

newFile = open('%s%s' % (dumpPath,newFileName) ,'w')
IOError: [Errno 2] No such file or directory: '/home/ec2-user/dbbackup.sql.bz2'

那些文件存在,我甚至尝试过预先创建以防万一结构没有权限创建,但它仍然无法正常工作

 run("touch dbbackup.sql.bz2")
编辑:我知道我可以将文件上传到远程服务器,但这不是我想用open命令做的事情。我正在尝试压缩大文件(数据库转储)是否可以在远程服务器上执行此操作,或者我是否必须将数据库转储复制到本地主机,在那里压缩然后再上传。这是本地主机上的压缩:

compObj= bz2.BZ2Compressor()
newFile = open('%s%s' % (dumpPath,newFileName) ,'w')
dbFile = file( '%s%s' % (dumpPath,filename), "r" )
block= dbFile.read( BLOCK_SIZE )
while True: #write the compressed data
        cBlock= compObj.compress( block )
        newFile.write(cBlock)
        block= dbFile.read( BLOCK_SIZE )
        if not block:
            break
    cBlock= compObj.flush()

3 个答案:

答案 0 :(得分:7)

在Fabric中,您永远不会“在远程服务器上”。某些Fabric命令在本地运行,而某些命令在远程服务器上运行。在这种情况下,您正在使用Python的open函数,该函数尝试在本地计算机上打开该文件,并且可以理解为失败。您可以使用Fabric put and get functions在本地计算机和远程服务器之间移动文件。

答案 1 :(得分:5)

我不知道你是否可以远程打开文件。但即使你可以,在你的情况下也可能不是一个好主意,因为你将通过ssh获取大文件(记住Fabric仍在你的本地机器上运行)。为什么不远程压缩文件,然后获取压缩文件?在mysqldump的情况下,它看起来像这样:

run('mysqldump [options] | gzip > outputfile.sql.gz')
get('outputfile.sql.gz')

(更多关于mysqldump和gzip here:Compressing mysqldump output

答案 2 :(得分:0)

  1. 您需要再次阅读Fabric教程。
  2. 您应该使用os.path.join来汇编文件路径。
  3. open()调用试图在本地计算机上打开文件,而不是远程服务器。