2013-09-23 2 views
0

Мне нравится обновлять локальную базу данных на сервере db. поэтому я создал fabfile с 3 env. в моей задаче сначала я перехожу на сервер, делаю что-то там - тогда мне нравится переключаться, например. к местным и делать что-то там. как я могу изменить среду внутри задачи?Переключатель env внутри задачи

для других вещей я использовал его вот так: fab www task, но тогда у меня есть только www env.

вот мой fabfile.py:

def www(): 
    env.hosts = ['s7.wservices.ch'] 
    env.user = 'beautyparlour' 
    env.dbname = 'db1' 
    env.dbuser = 'user1' 
    env.dbpass = 'password' 

    env.name_vitualenv = 'django15' #name of the virtualenv 
    env.name_folder = 'projektfoldername' # name of the project folder 


def dev(): 
    env.hosts = ['s7.wservices.ch'] 
    env.user = 'beautyparlour' 
    env.dbname = 'db1' 
    env.dbuser = 'user1' 
    env.dbpass = 'password' 

    env.name_vitualenv = 'django15' #name of the virtualenv 
    env.name_folder = 'projektfoldername' # name of the project folder 



def home(): 
    env.hosts = ['localhost'] 
    env.user = '' 
    env.dbname = 'dbx' 
    env.dbuser = 'Roland' 
    env.dbpass = '' 

    env.name_vitualenv = 'django15' #name of the virtualenv 
    env.name_folder = 'projektfoldername' # name of the project folder 



def update_db(): 
    ''' 
    use this on your local maschine to get the db from the live system 
    fab update_db 

    1. create a backup on server 
    2. download the backup 
    3. unzip the packup media and sql 
    4. load the sql dump to database 

    ''' 

    # switch env to server ?? 
    www() 

    ...do stuff on server 

    # switch env to local ?? 
    home() 

    ... do stuff local 

ответ

0

Это прекрасная вещь, чтобы использовать для roles и settings

Сначала вы должны, вероятно, разделить ваши команды немного лучше, а затем создать определенную роль определения. Если вы хотите использовать определенную среду, то это, вероятно, лучше всего использовать settings

from fabric.api import roles, settings, task 

env.roledefs = { 
    "www": ["some_remote_server"], 
    "other": ["wherever"], 
} 

@roles("www") 
@task 
def do_stuff_on_www(): 
    with settings(user="myname", some_prop="bar"): 
     # Do some stuff on the www server 

Учитывая, что вы используете менеджер контекста среда сбросит по умолчанию, который вы первоначально введенный после того, как функция заканчивается.

Кстати, вам не нужно указывать какие-либо новые определения узлов для запуска команды на localhost. Вы можете просто запустить метод ткани local, который будет обрабатывать все вызовы в вашем локальном поле. local - это удобная обертка модуля подпроцесса, поэтому в фоновом режиме не происходит никакой магии ткани/парамико. Код можно найти here, если вы заинтересованы в поиске

+0

спасибо, это выглядит хорошо для меня, но если я сделаю это так, как я могу установить, например. 'env.user',' env.dbname', 'env.name_folder', ... для каждой среды? – Roland

+0

так же, как вы это делали раньше? вы также можете просто создать новую функцию 'load_env', которая сканирует, какую роль вы используете, а затем загружает пользователя, dbname и name_folder соответствующим образом. – Greg

+0

На самом деле, вероятно, лучше использовать диспетчер контекстов 'settings'. Я обновил ответ, чтобы отразить это. – Greg

Смежные вопросы