Je souhaite utiliser Fabric pour déployer le code de mon application Web sur des serveurs de développement, de préparation et de production. Mon fabfile:
def deploy_2_dev():
deploy('dev')
def deploy_2_staging():
deploy('staging')
def deploy_2_prod():
deploy('prod')
def deploy(server):
print 'env.hosts:', env.hosts
env.hosts = [server]
print 'env.hosts:', env.hosts
Exemple de sortie:
host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:
Lorsque je crée une set_hosts()
tâche comme indiqué dans la documentation Fabric , env.hosts est correctement défini. Cependant, ce n'est pas une option viable, pas plus qu'un décorateur. Passer des hôtes sur la ligne de commande aboutirait finalement à une sorte de script shell qui appelle le fabfile, je préférerais qu'un seul outil fasse le travail correctement.
Il dit dans la documentation Fabric que «env.hosts est simplement un objet de liste Python». D'après mes observations, ce n'est tout simplement pas vrai.
Quelqu'un peut-il expliquer ce qui se passe ici? Comment puis-je configurer l'hôte sur lequel effectuer le déploiement?
Réponses:
Je fais cela en déclarant une fonction réelle pour chaque environnement. Par exemple:
En utilisant les fonctions ci-dessus, je taperais ce qui suit pour le déployer dans mon environnement de test:
... et les éléments suivants à déployer en production:
La bonne chose à faire de cette façon est que les fonctions
test
etprod
peuvent être utilisées avant toute fonction fab, pas seulement déployer. C'est incroyablement utile.la source
code.fabfile.org
domaine ont des réponses comme ça.fab A B C
style sans qu'elles soient définies comme des tâches.Utiliser des roledefs
Choisissez le rôle avec -R:
la source
roledef
? Une autre entrée de dictionnaire'password': 'some_password'
semble être ignorée et conduit à une invite au moment de l'exécution.Voici une version plus simple de la réponse de serverhorror :
la source
env
variables, pas à les définir initialement. Je pense que l'utilisation de roledefs , comme l'a suggéré Thomie, est plus appropriée pour définir des hôtes tels que stage, dev et test.J'étais coincé moi-même, mais je l'ai finalement compris. Vous ne pouvez pas définir la configuration de env.hosts de l' intérieur d' une tâche. Chaque tâche est exécutée N fois, une fois pour chaque hôte spécifié, de sorte que le paramètre est fondamentalement en dehors de la portée de la tâche.
En regardant votre code ci-dessus, vous pouvez simplement faire ceci:
Ce qui semble faire ce que vous avez l'intention.
Ou vous pouvez écrire du code personnalisé dans la portée globale qui analyse les arguments manuellement et définit env.hosts avant que votre fonction de tâche ne soit définie. Pour plusieurs raisons, c'est en fait ainsi que j'ai mis en place le mien.
la source
from fabric.api import env
:;env.host_string = "dev"
Depuis fab 1.5, c'est un moyen documenté de définir dynamiquement des hôtes.
http://docs.fabfile.org/en/1.7/usage/execution.html#dynamic-hosts
Citation du doc ci-dessous.
la source
Contrairement à certaines autres réponses, il est possible de modifier les
env
variables d'environnement au sein d'une tâche. Cependant, celaenv
ne sera utilisé que pour les tâches suivantes exécutées à l'aide de lafabric.tasks.execute
fonction.Sans encapsuler les sous-tâches dans
execute(...)
, vosenv
paramètres au niveau du module ou tout ce qui est transmis par l'fab
interface de ligne de commande seront utilisés.la source
Vous devez donner
host_string
un exemple:la source
Pour expliquer pourquoi c'est même un problème. La commande fab utilise la bibliothèque de fabric pour exécuter les tâches sur les listes d'hôtes. Si vous essayez de modifier la liste d'hôtes dans une tâche, vous essayez essentiellement de modifier une liste tout en l'itérant. Ou dans le cas où vous n'avez pas d'hôte défini, bouclez sur une liste vide où le code sur lequel vous définissez la liste pour boucler n'est jamais exécuté.
L'utilisation d'env.host_string est une solution de contournement pour ce comportement uniquement en ce sens qu'elle spécifie directement aux fonctions les hôtes avec lesquels se connecter. Cela pose certains problèmes dans la mesure où vous allez refaire la boucle d'exécution si vous souhaitez avoir un certain nombre d'hôtes sur lesquels exécuter.
Le moyen le plus simple pour les utilisateurs de définir les hôtes au moment de l'exécution est de conserver l'environnement en tant que tâche distincte, qui configure toutes les chaînes d'hôte, les utilisateurs, etc. Ensuite, ils exécutent la tâche de déploiement. Cela ressemble à ceci:
ou
Où la mise en scène et la production sont comme les tâches que vous avez données, mais elles n'appellent pas la tâche suivante elles-mêmes. La raison pour laquelle cela doit fonctionner comme ça, c'est que la tâche doit se terminer, et sortir de la boucle (des hôtes, dans le cas env None, mais c'est une boucle d'un à ce point), puis avoir la boucle sur les hôtes (maintenant définis par la tâche précédente) à nouveau.
la source
Vous devez modifier env.hosts au niveau du module, pas dans une fonction de tâche. J'ai fait la même erreur.
la source
C'est très simple. Initialisez simplement la variable env.host_string et toutes les commandes suivantes seront exécutées sur cet hôte.
la source
Je suis totalement nouveau dans Fabric, mais pour que Fabric exécute les mêmes commandes sur plusieurs hôtes (par exemple pour déployer sur plusieurs serveurs, en une seule commande), vous pouvez exécuter:
où staging-server et production-server sont 2 serveurs sur lesquels vous souhaitez exécuter l'action de déploiement. Voici un fabfile.py simple qui affichera le nom du système d'exploitation. Notez que fabfile.py doit être dans le même répertoire que celui où vous exécutez la commande fab.
Cela fonctionne au moins avec le tissu 1.8.1.
la source
Donc, pour définir les hôtes et faire exécuter les commandes sur tous les hôtes, vous devez commencer par:
Une fois ceux-ci définis, exécutez la commande sur la ligne de commande:
Qu'est-ce qui exécutera la tâche de déploiement sur tous les serveurs répertoriés dans la fonction PROD, car elle définit les hôtes env. Avant d'exécuter la tâche.
la source
Vous pouvez affecter à
env.hoststring
avant d'exécuter une sous-tâche. Affectez à cette variable globale dans une boucle si vous souhaitez effectuer une itération sur plusieurs hôtes.Malheureusement pour vous et moi, le tissu n'est pas conçu pour ce cas d'utilisation. Découvrez la
main
fonction sur http://github.com/bitprophet/fabric/blob/master/fabric/main.py pour voir comment cela fonctionne.la source
Voici un autre modèle "summersault" qui permet l'
fab my_env_1 my_command
utilisation:Avec ce modèle, nous n'avons à définir les environnements qu'une seule fois à l'aide d'un dictionnaire.
env_factory
crée des fonctions basées sur les noms clés deENVS
. J'ai misENVS
dans son propre répertoire et fichiersecrets.config.py
pour séparer la configuration du code du fabric.L'inconvénient est que, comme écrit, l'ajout du
@task
décorateur le cassera .Remarques: Nous utilisons à la
def func(k=k):
place dedef func():
l'usine en raison d' une liaison tardive . Nous obtenons le module en cours d'exécution avec cette solution et le corrigeons pour définir la fonction.secrets.config.py
fabfile.py
la source
L'utilisation des rôles est actuellement considérée comme la manière «appropriée» et «correcte» de le faire et c'est ce que vous «devriez» faire.
Cela dit, si vous êtes comme la plupart de ce que vous «voudriez» ou «désirez», c'est la possibilité d'effectuer un «système tordu» ou de changer de système cible à la volée.
Donc, à des fins de divertissement uniquement (!), L'exemple suivant illustre ce que beaucoup pourraient considérer comme une manœuvre risquée, mais en quelque sorte totalement satisfaisante, qui ressemble à ceci:
Puis en cours d'exécution:
la source