Запись в удаленный файл с помощью 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()

person JiminyCricket    schedule 04.06.2011    source источник


Ответы (3)


Я не знаю, можете ли вы открыть файл удаленно. Но даже если вы можете, это может быть не очень хорошей идеей в вашем случае, так как вы будете получать большой файл по ssh (помните, что Fabric все еще работает на вашем локальном компьютере). Почему бы не сжать файл удаленно, а затем получить сжатый файл? В случае mysqldump это будет выглядеть так:

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

(подробнее о mysqldump и gzip здесь: Сжатие вывода mysqldump)

person Yavar    schedule 06.06.2011
comment
спасибо, пытался сделать сжатие с помощью python, но с помощью gzip тоже работает нормально. - person JiminyCricket; 06.06.2011

В Fabric вы никогда не находитесь «на удаленном сервере». Некоторые команды Fabric выполняются локально, а некоторые — на удаленном сервере. В этом случае вы используете функцию Python open, которая пытается открыть файл на вашем локальном компьютере и по понятным причинам терпит неудачу. Вы можете использовать функции put и get Fabric для перемещения файлов между локальным компьютером и удаленный сервер.

person Yavar    schedule 05.06.2011
comment
Спасибо, что разместили ссылку. Пожалуйста, смотрите мой обновленный вопрос. Могу ли я открыть и добавить в файл удаленно с данными на удаленном хосте или мне нужно копировать туда и обратно - person JiminyCricket; 06.06.2011

  1. Вам нужно снова прочитать учебник по ткани.
  2. Вы должны использовать os.path.join для сборки вашего пути к файлу.
  3. Этот вызов open() пытается открыть файл на вашем локальном компьютере, а НЕ на удаленном сервере.
person Michael Kent    schedule 04.06.2011