Бегущая ткань script локально
У меня есть приложение django, и я написал ткань script, которая устанавливает мое приложение на сервере развертывания (Cent OS 5).
Теперь я хочу запустить ту же самую ткань script локально на сервере развертывания.
Есть ли способ сделать это без предоставления пользователю и паролю ssh?
Я имею в виду только с "-H localhost"?
Спасибо, Алекс А.
Ответы
Ответ 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')