Пишете в отдалечен файл с 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. Опитвам се да компресирам голям файл (изхвърляне на база данни) Възможно ли е да направя това на отдалечения сървър или ще трябва да копирам изхвърлянето на DB на локалния хост, да компресирам там и след това да кача обратно. Ето компресията на локалния хост:

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 се изпълняват локално, а други се изпълняват на отдалечения сървър. В този случай вие използвате функцията open на Python, която се опитва да отвори файла на вашия локален компютър и разбираемо се проваля. Можете да използвате функциите за поставяне и получаване на Fabric, за да премествате файлове между вашия локален компютър и отдалечения сървър.

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

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