#python #fabric
#python #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()
Ответ №1:
В Fabric вы никогда не находитесь «на удаленном сервере». Некоторые команды Fabric выполняются локально, а некоторые — на удаленном сервере. В этом случае вы используете open
функцию Python, которая пытается открыть файл на вашем локальном компьютере и, по понятным причинам, терпит неудачу. Вы можете использовать функции put и get Fabric для перемещения файлов между вашим локальным компьютером и удаленным сервером.
Комментарии:
1. Спасибо за размещение ссылки. Пожалуйста, посмотрите мой обновленный вопрос. Могу ли я удаленно открывать и добавлять в файл данные на удаленном хосте или мне нужно копировать туда и обратно
Ответ №2:
Я не знаю, можете ли вы открыть файл удаленно. Но даже если вы сможете, в вашем случае это может оказаться не очень хорошей идеей, поскольку вы будете извлекать большой файл по ssh (помните, что Fabric все еще работает на вашем локальном компьютере). Почему бы не сжать файл удаленно, а затем получить сжатый файл? В случае mysqldump это выглядело бы следующим образом:
run('mysqldump [options] | gzip > outputfile.sql.gz')
get('outputfile.sql.gz')
(подробнее о mysqldump и gzip здесь: Сжатие выходных данных mysqldump )
Комментарии:
1. спасибо, пытался выполнить сжатие с помощью python, но использование gzip также отлично работает.
Ответ №3:
- Вам нужно еще раз прочитать руководство по Fabric.
- Вы должны использовать os.path.join для сборки вашего пути к файлу.
- Этот вызов open() пытается открыть файл на вашем локальном компьютере, а не на удаленном сервере.