使用Fabric写入远程文件
我正在尝试使用Fabric来备份数据库,并把它们移动到不同的服务器上。
当我在远程服务器上时,打开一个文件进行写入时出现了错误。
newFile = open('%s%s' % (dumpPath,newFileName) ,'w')
IOError: [Errno 2] No such file or directory: '/home/ec2-user/dbbackup.sql.bz2'
那个文件是存在的,我甚至提前尝试创建了它,以防Fabric没有权限去创建,但还是不行。
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
- 你需要再看一遍Fabric的教程。
- 你应该使用os.path.join来拼接你的文件路径。
- 那个open()的调用是想在你本地电脑上打开文件,而不是在远程服务器上。
7
在Fabric中,你并不是一直“在远程服务器上”。有些Fabric命令是在你的本地电脑上运行的,有些则是在远程服务器上运行。在这个情况下,你使用的是Python的open
函数,它试图在你的本地电脑上打开文件,但显然失败了。你可以使用Fabric的put和get函数来在你的本地电脑和远程服务器之间移动文件。
5
我不太确定你是否可以远程打开一个文件。不过即使可以,这在你的情况下可能也不是个好主意,因为你需要通过ssh来传输一个大文件(记住,Fabric还是在你的本地机器上运行)。为什么不先在远程压缩这个文件,然后再下载压缩后的文件呢?对于mysqldump来说,操作大概是这样的:
run('mysqldump [options] | gzip > outputfile.sql.gz')
get('outputfile.sql.gz')
(关于mysqldump和gzip的更多信息可以在这里找到:压缩mysqldump输出)