Подтвердить что ты не робот

Лучший способ добавить переменную окружения в ткань?

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

with prefix('export FOO=BAR'):
    run('env | grep BAR')

Это похоже на работу, но это похоже на хак.

Я посмотрел в репозиторий GIT, и он выглядит так: issue # 263.

4b9b3361

Ответ 1

Что касается ткани 1.5 (выпущена), fabric.context_managers.shell_env делает то, что вы хотите.

    with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
        local("echo FOO1 is $FOO1")

Ответ 2

Я думаю, что ваше решение на основе prefix отлично подходит. Однако, если вы хотите, чтобы менеджер контекста shell_env был предложен в issue # 263, вы можете использовать следующую альтернативную реализацию в ваших файлах fab:

from fabric.api import run, env, prefix
from contextlib import contextmanager

@contextmanager
def shell_env(**env_vars):
    orig_shell = env['shell']
    env_vars_str = ' '.join('{0}={1}'.format(key, value)
                           for key, value in env_vars.items())
    env['shell']='{0} {1}'.format(env_vars_str, orig_shell)
    yield
    env['shell']= orig_shell

def my_task():
    with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'):
        with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
            run('env | grep BAR')

Обратите внимание, что этот менеджер контекста изменяет env['shell'] вместо env['command_prefixes'] (как это делает prefix менеджер контекста), поэтому вы:

  • может использовать prefix (см. пример ниже) без проблем взаимодействия, упомянутых в выпуске # 263.
  • должны использовать любые изменения в env['shell'] перед использованием shell_env. В противном случае изменения shell_env будут перезаписаны, а переменные окружения не будут доступны для ваших команд.

При выполнении файла fab выше вы получаете следующий результат:

$ fab -H localhost my_task
[localhost] Executing task 'my_task'
[localhost] run: env | grep BAR
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3
[localhost] out: FOO1=BAR1
[localhost] out: FOO2=BAR2
[localhost] out: FOO3=BAR3
[localhost] out: 

Done.
Disconnecting from localhost... done.

Ответ 3

Ткань 1.5.0 (в настоящее время в Git) принимает shell как local() named argument. Если вы передадите '/bin/ bash', он передает его в исполняемый аргумент Popen.

Он не будет выполнять ваш .bashrc, хотя из-за того, что .bashrc получен при интерактивном вызове bash. Вы можете указать любой файл, который вы хотите внутри локального:

local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash')

Ответ 4

Другой способ - передать значение через командную строку с -set:

--set=domain=stackoverflow.com 

Затем вы можете обратиться к нему в script с помощью env.domain

см. http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set