Comment définir les hôtes de la cible dans le Tissu de fichier
Je veux utiliser le Tissu pour déployer mon code d'application web pour le développement, la mise en scène et les serveurs 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:
Quand je crée un set_hosts()
tâche comme indiqué dans le Tissu docs, env.hôtes est correctement réglé. Cependant, ce n'est pas une option viable, ni un décorateur. En passant hôtes sur la ligne de commande, cela aboutirait à une sorte de script shell qui appelle la fabfile, je préfère avoir un seul outil faire le travail correctement.
Il est dit dans le Tissu docs que " env.hôtes est simplement une liste Python objet". À partir de mes observations, ce n'est tout simplement pas vrai.
Quelqu'un peut-il expliquer ce qui se passe ici ? Comment puis-je régler l'hôte à se déployer ?
- J'ai le même problème, avez vous trouvé une solution à cela?
- pour exécuter la même tâche sur plusieurs serveurs, utilisez "fab-H mise en scène-serveur,la production de serveur de déployer"... de plus dans ma réponse ci-dessous: stackoverflow.com/a/21458231/26510
- Essayez ceci: docs.fabfile.org/en/1.13/usage/env.html#passwords
- Cette réponse ne s'applique pas à la matrice 2+. Si quelqu'un de plus familier avec Stackoverflow conventions pourraient modifier la question ou la question du titre de se référer à la matrice 1 il pourrait être utile.
Vous devez vous connecter pour publier un commentaire.
Je fais cela par la déclaration d'une fonction réelle pour chaque environnement. Par exemple:
En utilisant les fonctions ci-dessus, je voudrais tapez la commande suivante pour déployer à mon environnement de test:
...et les suivantes pour déployer de production:
La bonne chose à propos de cette façon de faire est que le
test
etprod
fonctions peuvent être utilisées avant tout fab fonction, non seulement de déployer. Il est incroyablement utile.code.fabfile.org
domaine des réponses comme ça.fab A B C
style sans être définis comme des tâches.Utilisation roledefs
Choisir rôle avec l'option-R:
roledef
? Une nouvelle entrée dans le dictionnaire'password': 'some_password'
semble être ignoré et conduit à une invite de commandes au moment de l'exécution.Voici une version simplifiée de serverhorrors répondre:
env
variables, pas de réglage de eux d'abord. Je pense que l'aide de roledefs, comme thomie suggéré, est plus approprié pour la définition d'hôtes comme la scène, de développement et de test.A été collé sur moi-même, mais enfin compris. Il vous suffit de ne peut pas ensemble de l'env.configuration des hôtes de dans une tâche. Chaque tâche est exécutée N fois, une fois pour chaque Hôte, de sorte que le réglage est fondamentalement à l'extérieur du périmètre de la tâche.
En regardant ton code ci-dessus, vous pouvez simplement faire ceci:
Qui semble comme il ferait de ce que vous avez l'intention.
Ou vous pouvez écrire du code personnalisé dans la portée globale qui analyse les paramètres manuellement, et définit env.les hôtes avant votre tâche la fonction est définie. Pour quelques raisons, c'est en fait la façon dont j'ai mis la mienne en place.
from fabric.api import env
;env.host_string = "dev"
Depuis fab 1.5 c'est documentée de façon à définir de façon dynamique des hôtes.
http://docs.fabfile.org/en/1.7/usage/execution.html#dynamic-hosts
Citation de la doc ci-dessous.
Contrairement à certaines autres réponses, il est possible de modifier la
env
variables d'environnement au sein d'une tâche. Cependant, cetteenv
sera uniquement utilisée pour les tâches exécutées à l'aide de lafabric.tasks.execute
fonction.Sans emballage sous-tâches en
execute(...)
, votre niveau moduleenv
paramètres ou tout ce qui est passé de lafab
CLI sera utilisé.Vous devez définir
host_string
un exemple serait:D'expliquer pourquoi elle est même un problème. La commande fab est en tirant parti de tissu de la bibliothèque pour exécuter les tâches sur les listes d'hôtes. Si vous essayez de modifier la liste des hôtes à l'intérieur d'une tâche, vous êtes esentially de tenter de modifier une liste lors de l'itération sur elle. Ou, dans le cas où vous n'avez pas les hôtes définis, une boucle sur une liste vide où le code où vous définissez la liste en boucle n'est jamais exécutée.
L'utilisation de l'env.host_string est une solution de contournement pour ce problème seulement en ce qu'il est en spécifiant directement aux fonctions les hôtes à se connecter avec. Cela provoque quelques questions que vous allez refaire l'exécution de la boucle si vous souhaitez avoir un numéro d'hôtes à exécuter sur.
La façon la plus simple les gens font de la possibilité de définir des hôtes au moment de l'exécution, est de garder l'env populatiing en tant que distincte de la tâche, qui met en place toute l'armée, des chaînes, des utilisateurs, etc. Puis ils exécutent la tâche de déploiement. Il ressemble à ceci:
ou
Où la mise en scène et la production sont comme les tâches que vous avez donné, mais ils n'appellent pas la tâche suivante eux-mêmes. La raison qu'il a à travailler comme ça, c'est que la tâche est à la fin, et de sortir de la boucle (des armées, dans les env cas Aucun, mais c'est une boucle de un à ce point), et alors la boucle sur les hôtes (maintenant défini par le précédent de la tâche) de nouveau.
Vous avez besoin de modifier env.les hôtes au niveau du module, pas dans une tâche de fonction. J'ai fait la même erreur.
C'est très simple. Initialiser l'env.host_string variable et toutes les commandes suivantes seront exécutées sur cet hôte.
Je suis totalement nouveau pour le tissu, mais pour obtenir de tissu pour exécuter les mêmes commandes sur plusieurs hôtes (par exemple, pour la déployer sur plusieurs serveurs, en une seule commande), vous pouvez exécuter:
où mise en scène-serveur et production-serveur sont 2 serveurs que vous souhaitez exécuter le déploiement de l'action contre le. Voici un simple fabfile.py qui permettra d'afficher le nom du système d'exploitation. Notez que l'fabfile.py doit être dans le même répertoire que celui où vous exécutez le fab commande.
Cela fonctionne avec le tissu 1.8.1 au moins.
Afin de définir les hôtes, et ont les commandes s'exécutent sur tous les hôtes, vous devez commencer avec:
Une fois que ceux-ci sont définis, puis d'exécuter la commande sur la ligne de commande:
Ce sera exécuter la tâche de déploiement sur tous les serveurs répertoriés dans la PROD de la fonction, car il définit l'env.les hôtes avant l'exécution de la tâche.
Vous pouvez attribuer à
env.hoststring
avant l'exécution d'une tâche. Affecter à cette variable globale dans une boucle si vous souhaitez effectuer une itération sur plusieurs hôtes.Malheureusement pour vous et pour moi, le tissu n'est pas conçu pour ce cas d'utilisation. Découvrez la
main
fonction à http://github.com/bitprophet/fabric/blob/master/fabric/main.py pour voir comment il fonctionne.Voici un autre "saut périlleux" pattern qui permet à l'
fab my_env_1 my_command
utilisation:Avec ce modèle, nous n'avons qu'à définir des environnements d'une fois à l'aide d'un dictionnaire.
env_factory
crée des fonctions basées sur la keynames deENVS
. J'ai misENVS
dans son propre répertoire et de fichiersecrets.config.py
pour séparer les config du code tissu.L'inconvénient est que, comme l'écrit, l'ajout de la
@task
décorateur sera casser.Note: Nous utilisons
def func(k=k):
au lieu dedef func():
dans l'usine en raison de la liaison tardive. Nous obtenons le module en cours d'exécution avec cette solution et le patch pour définir la fonction.secrets.config.py
fabfile.py
À l'aide de rôles est actuellement considéré comme le "bon" et de la "bonne" façon de le faire et est ce que vous "devrait" le faire.
Cela dit, si vous êtes comme la plupart de ce que vous "tiens" ou "désir" est la capacité à effectuer un "tordu syster" ou la commutation de systèmes cible à la volée.
Donc, pour fins de divertissement seulement (!) l'exemple suivant illustre ce que beaucoup pourraient considérer comme un risque, et pourtant, d'une certaine manière complètement satisfaisante, la manœuvre qui va quelque chose comme ceci:
Puis en cours d'exécution: