exécution locale du script fabric

J'ai une application django et j'ai écrit un script fabric qui installe mon application sur le serveur de déploiement (Cent OS 5).

Maintenant, je veux exécuter le même script fabric localement sur le serveur de déploiement.

Existe-t-il un moyen de le faire sans fournir d'utilisateur et de mot de passe ssh?

Je veux dire juste avec "- H localhost"?

Merci, Alex A.

39
demandé sur alexarsh 2011-07-17 20:35:28

6 réponses

Oui, vous pouvez exécuter fab localement par l'aide de la méthode local au lieu de exécuter. Ce que je fais généralement, c'est avoir des méthodes pour configurer l'environnement, et appeler ces méthodes d'abord avant d'appeler la tâche réelle. Permettez-moi d'illustrer cela avec un exemple pour votre question spécifique

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

Et en fonction de l'environnement, vous pouvez effectuer les opérations suivantes

Installer sur localhost:

    fab localhost install

Installer sur la machine distante:

    fab remote install
75
répondu Varun Katta 2014-03-23 20:01:11

J'utilise une autre astuce pour exécuter une tâche distante localement:

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")
7
répondu xuhcc 2014-02-06 06:44:27

Légèrement moins élégant que la réponse de Varun, mais peut-être plus pratique en fonctionnant par défaut sur la machine locale à moins qu'un autre sélecteur d'environnement ne soit donné.

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

Puis exécutez localement comme:

fab host_info

, Ou à distance avec:

fab live host_info

PS. Voici le problème Github sur ce sujet.

4
répondu Pieter Ennes 2017-05-23 12:26:08

Tout d'abord, assurez-vous que vous pouvez ssh dans votre localhost sans mot de passe:

$ ssh-copy-id localhost

Et puis exécutez-le comme vous l'avez dit, avec l'option de ligne de commande -H localhost

3
répondu Aníbal Rivero 2015-08-21 11:12:46

Vous pouvez exécuter le serveur SSH sur votre machine locale pour pouvoir ssh à localhost. Et puis exécutez simplement des scripts avec "- H localhost". Fonctionne parfaitement pour moi.

2
répondu Eugene Leonovich 2015-01-07 13:57:36

Une version modifiée de la réponse de Varun {[3] } qui prend en compte local ne pas capturer stdout/stderr. Sans spécifier capture=True, vous ne seriez pas en mesure d'obtenir des résultats à partir de 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')
0
répondu dbainbridge 2017-05-23 11:54:46