запускать скрипт фабрики локально - PullRequest
41 голосов
/ 17 июля 2011

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

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

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

Я имею в виду просто "-H localhost"?

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

Ответы [ 6 ]

78 голосов
/ 21 июля 2011

Да, вы можете запустить fab локально, используя метод local вместо 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')

А в зависимости от среды вы можете сделать следующее

Установка на локальный хост:

    fab localhost install

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

    fab remote install
7 голосов
/ 06 февраля 2014

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

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")
4 голосов
/ 12 декабря 2014

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

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")

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

fab host_info

или удаленно с:

fab live host_info

PS.Вот проблема Github на эту тему.

3 голосов
/ 21 августа 2015

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

$ ssh-copy-id localhost

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

2 голосов
/ 07 января 2015

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

0 голосов
/ 04 февраля 2016

Модифицированная версия Ответа Варуна , который учитывает локальное отсутствие захвата stdout / stderr.Без указания capture = True вы не сможете получить результаты от local.

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')
...