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