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

Бегущая ткань script локально

У меня есть приложение django, и я написал ткань script, которая устанавливает мое приложение на сервере развертывания (Cent OS 5).

Теперь я хочу запустить ту же самую ткань script локально на сервере развертывания.

Есть ли способ сделать это без предоставления пользователю и паролю ssh?

Я имею в виду только с "-H localhost"?

Спасибо, Алекс А.

4b9b3361

Ответ 1

Да, вы можете запустить fab локально, используя метод локальный вместо run. Обычно я использую методы настройки среды и сначала вызываю эти методы, прежде чем вызывать фактическую задачу. Позвольте мне проиллюстрировать это примером для вашего конкретного вопроса.

fabfile.py

    from fabric.operations import local as lrun, run
    from fabric.api import task
    from fabric.state import env

    @task
    def localhost():
        env.run = lrun
        env.hosts = ['localhost']

    @task
    def remote():
        env.run = run
        env.hosts = ['some.remote.host']

    @task
    def install():
        env.run('deploymentcmd')

И на основе среды вы можете сделать следующее

Установить на localhost:

    fab localhost install

Установить на удаленном компьютере:

    fab remote install

Ответ 2

Я использую другой трюк для выполнения удаленной задачи локально:

from fabric.api import run, sudo, local
from contextlib import contextmanager

@contextmanager
def locally():
    global run
    global sudo
    global local
    _run, _sudo = run, sudo
    run = sudo = local
    yield
    run, sudo = _run, _sudo

def local_task():
    with locally():
        run("ls -la")

Ответ 3

Чуть менее элегантный, чем Ответ Varun, но, возможно, более практичный, по умолчанию для запуска на локальном компьютере, если не указан другой переключатель среды.

from fabric.api import *

# default to running on localhost
env.hosts = ["localhost"]

DEPLOYMENT_PATH = "/some/path/{}/"

def local_or_remote(*args, **kwargs):
    func = local if env.host == "localhost" else run
    return func(*args, **kwargs)


@task
def live():
    """
    Select live environment
    """
    env.hosts = ["host1", "host2"]
    env.path = DEPLOYMENT_PATH.format("live")


@task
def beta():
    """
    Select beta environment
    """
    env.hosts = ["host1", "host2"]
    env.path = DEPLOYMENT_PATH.format("beta")


@task
def host_info():
    local_or_remote("uname -a")

Затем выполните локально как:

fab host_info

или удаленно с помощью:

fab live host_info

PS. Ниже приведена проблема Github по этой теме.

Ответ 4

Вы можете запустить ssh-сервер на вашем локальном компьютере, чтобы иметь возможность ssh на localhost. А затем просто запускайте скрипты с "-H localhost". Отлично работает для меня.

Ответ 5

Сначала убедитесь, что вы можете использовать ssh в своем локальном хосте без пароля:

$ ssh-copy-id localhost

И затем просто запустите его, как вы сказали, с опцией командной строки -H localhost

Ответ 6

Измененная версия Varun answer, которая учитывает локальное не фиксирование stdout/stderr. Без указания capture = True вы не сможете получить результаты из локального.

from fabric.operations import local, run
from fabric.api import task
from fabric.state import env

def local_run(*args):
    return local(args[0], capture=True)

@task
def localhost():
    env.run = local_run
    env.hosts = ['localhost']

@task
def remote():
    env.run = run
    env.hosts = ['some.remote.host']

@task
def install():
    env.run('deploymentcmd')