32 votes

Quels sont les avantages d'exécuter chef-server au lieu de chef-solo ?

Je cherche des solutions de déploiement automatisé pour mon équipe et je joue avec Chef depuis quelques jours. J'ai réussi à mettre en place une application web simple et à la faire fonctionner à partir d'une VM Red Hat de base en utilisant chef-solo.

Notre objectif final est d'utiliser Chef (ou un autre système) pour déployer automatiquement les topologies d'application sur le cloud au fur et à mesure que nous exécutons les constructions. Notre processus se déroulerait essentiellement comme suit :

  1. Le code de notre application web, les dépendances et les cookbooks de chef sont stockés dans SCM.
  2. Une compilation est exécutée et crée un paquet unique pour les images à acquérir et à tester.
  3. Le moteur de construction déploie ensuite de nouvelles images en nuage qui exécutent un client chef pour installer les paquets.
  4. Les images acquièrent les livres de recettes à partir de SCM ou du serveur Chef et installent tout ce qu'il faut pour être opérationnel.

Quels sont les avantages et/ou les cas d'utilisation pour faire fonctionner un serveur Chef ?

Y a-t-il des avantages majeurs à ce qu'un serveur Chef détienne et acquière les livres de recettes à partir de SCM par rapport à l'utilisation de chef-solo et d'un script qui tirera les livres de recettes de SCM ?

66voto

Goladus Points 906

Je vais orienter cette réponse comme si la question était "quels sont les avantages de chef-solo" car c'est la meilleure façon que je connaisse pour couvrir les différences entre les approches.

En résumé, ma recommandation va dans le sens de celle des autres : utilisez un serveur de chefs si vous devez gérer un environnement dynamique et virtualisé dans lequel vous ajouterez et retirerez souvent des nœuds. Un serveur chef est également un bon CMDB si vous en avez besoin. Utilisez chef-solo si vous avez un environnement moins dynamique où les nœuds ne changeront pas trop souvent mais où les rôles et les recettes changeront. La taille et la complexité de votre environnement sont plus ou moins sans importance. Les deux approches s'adaptent très bien.

Si vous déployez chef-solo, utilisez un cronjob avec rsync, 'git pull', ou tout autre mécanisme de transfert de fichiers idempotent pour maintenir une copie complète du référentiel chef sur chaque nœud. Le cronjob doit être facilement configurable pour (a) ne pas fonctionner du tout et (b) fonctionner, mais sans synchroniser le référentiel local. Ajoutez un répertoire nodes/ dans votre référentiel chef avec un fichier json pour chaque nœud. Votre cronjob peut être aussi sophistiqué que vous le souhaitez en termes d'identification du bon fichier de nœud (bien que je recommande simplement $(hostname -s).json. Vous pouvez également créer un compte opscode et configurer un client avec hosted chef, ne serait-ce que pour pouvoir utiliser knife pour télécharger les cookbooks de la communauté et créer des squelettes.

Il y a plusieurs avantages à cette approche, en plus de l'évident "ne pas avoir à administrer un serveur". Votre contrôle de source sera l'arbitre final de tous les changements de configuration, le référentiel inclura tous les nœuds et les listes d'exécution, et le fait que chaque serveur soit totalement indépendant facilite l'élaboration de scénarios de test pratiques.

Chef-server introduit un trou lorsque vous utilisez le "knife upload" pour mettre à jour un livre de recettes, et vous devez corriger ce trou vous-même (par exemple avec un hook post-commit) ou vous risquez que les modifications du site soient écrasées silencieusement par quelqu'un qui "knife upload "s une recette obsolète à partir du dépôt local obsolète sur son ordinateur portable. Cela risque moins de se produire avec chef-solo, car toutes les modifications seront synchronisées avec les serveurs directement à partir du dépôt principal. Le problème ici est la discipline et le nombre de collaborateurs. Si vous êtes un développeur solo ou une très petite équipe, le téléchargement de livres de recettes via l'API n'est pas très risqué. Dans une équipe plus importante, cela peut l'être si vous ne mettez pas en place de bons contrôles.

En outre, avec chef-solo, vous pouvez stocker tous les rôles, attributs personnalisés et listes d'exécution de vos nœuds sous forme de fichiers node.json dans votre référentiel chef principal. Avec chef-server, les rôles et les listes d'exécution sont modifiés à la volée à l'aide de l'API. Avec chef-solo, vous pouvez suivre ces informations dans le contrôle de révision. C'est ici que l'on voit clairement le conflit entre les environnements statiques et dynamiques. Si votre liste de nœuds (quelle que soit sa longueur) ne change pas souvent, avoir ces données dans le contrôle de révision est très utile. D'un autre côté, si vous créez fréquemment de nouveaux nœuds et détruisez les anciens (pour ne plus jamais voir leur nom d'hôte ou leur fqdn), garder tout cela dans le contrôle de révision est juste un souci inutile, et avoir une API pour faire des changements est très pratique. Chef-server possède également toute une série de fonctionnalités orientées vers la gestion des environnements cloud dynamiques, comme l'option de nom sur "knife bootstrap" qui vous permet de remplacer le fqdn comme moyen par défaut d'identifier un nœud. Mais dans un environnement statique, ces fonctionnalités ont une valeur limitée, surtout si on les compare au fait d'avoir les rôles et les listes d'exécution en contrôle de révision avec tout le reste.

Enfin, les environnements de test des recettes peuvent être configurés à la volée, sans aucun travail supplémentaire. Vous pouvez désactiver les cronjobs exécutés sur un serveur et apporter des modifications directement à son référentiel local. Vous pouvez tester les changements en exécutant chef-solo et vous verrez exactement comment le serveur se configurera en production. Une fois que tout est testé, vous pouvez enregistrer les changements et réactiver les cronjobs locaux. Lors de l'écriture de recettes, cependant, vous ne pourrez pas utiliser l'API "Search", ce qui signifie que si vous voulez écrire des recettes dynamiques (par exemple des répartiteurs de charge), vous devrez contourner cette limitation, en collectant les données à partir des fichiers json dans votre répertoire nodes/, ce qui sera probablement moins pratique et manquera de certaines des données disponibles dans la CMDB complète. Une fois de plus, les environnements plus dynamiques favoriseront l'approche basée sur la base de données, les environnements moins dynamiques se contenteront de fichiers json sur le disque local. Dans un environnement de serveur où une exécution de chef doit faire des appels API à une base de données centrale, vous devrez gérer tous les environnements de test dans cette base de données.

Ce dernier peut également être utilisé en cas d'urgence. Si vous êtes en train de dépanner un problème critique sur des serveurs de production et que vous le résolvez par un changement de configuration, vous pouvez effectuer le changement immédiatement sur le dépôt du serveur puis le pousser en amont vers le maître.

Ce sont les principaux avantages de chef-solo. Il y en a d'autres, comme le fait de ne pas avoir à administrer un serveur ou à payer pour un chef hébergé, mais ce sont des préoccupations relativement mineures.

En résumé : Si vous êtes dynamique et hautement virtualisé, chef-server offre un certain nombre de fonctionnalités intéressantes (couvertes ailleurs) et la plupart des avantages de chef-solo seront moins perceptibles. Cependant, il existe des avantages certains, souvent non mentionnés, à chef-solo, en particulier dans les environnements plus traditionnels. Notez que le fait d'être déployé sur le cloud ne signifie pas nécessairement que vous disposez d'un environnement dynamique. Si vous ne pouvez pas, par exemple, ajouter des nœuds à votre système sans publier une nouvelle version de votre logiciel, vous n'êtes probablement pas dynamique. Enfin, d'un point de vue général, une CMDB peut être utile pour un certain nombre de choses qui ne sont qu'indirectement liées à l'administration et à la configuration du système, comme la comptabilité et le partage d'informations entre les équipes. L'utilisation de chef-server pourrait valoir la peine pour cette seule fonctionnalité.

0 votes

Comment stocker/distribuer des données sensibles (ex : clés privées/mots de passe) avec chef-solo ? Comment les suivre avec le contrôle de révision sans les stocker en clair ?

0 votes

@LimboPeng Vous pouvez stocker des sacs de données cryptées dans le repo de Chef. Vous devez cependant stocker la clé de chiffrement à l'extérieur.

27voto

Dean Points 3017

Divulgation : Je travaille pour Opscode.

Le principal avantage de Chef Server par rapport à Solo est la possibilité d'utiliser la recherche avec votre infrastructure. L'exemple classique est un équilibreur de charge avec des serveurs Web. L'équilibreur de charge peut automatiquement mettre à jour sa configuration au fur et à mesure que des serveurs web sont ajoutés et supprimés de l'infrastructure, simplement en les recherchant. Solo ne concerne que les machines individuelles, tandis que Chef Server permet de rechercher des éléments tels que "toutes les machines ayant plus de 4 gigas de RAM" ou "le maître de la base de données".

Chef Server vous donne également la possibilité de gérer votre infrastructure sans avoir à copier des tarballs, de visualiser votre infrastructure avec la console de gestion et de gérer quelles machines exécutent quelles versions de cookbooks avec Environments. Il existe d'autres avantages, mais ce sont ceux qui me viennent à l'esprit. Si vous voulez essayer le serveur Chef sans l'installer, il suffit de vous inscrire pour un compte Chef hébergé Opscode, les 5 premiers nœuds sont gratuits.

1 votes

Merci mray, cette information est très utile. Savez-vous comment on peut adopter les philosophies DevOps en utilisant le serveur Chef ? Ce que j'entends par là, c'est que tous nos livres de cuisine vivent dans SCM. Existe-t-il un moyen simple de faire en sorte que le serveur Chef reçoive des livres de cuisine mis à jour à mesure que nous livrons du nouveau code ?

2 votes

@strife25 Vous devriez définitivement avoir vos livres de cuisine dans un système de contrôle de version. Si vous n'êtes pas obligé d'en avoir un, Opscode recommande Git car il est facile de travailler avec des branches et des pierres pour les équipes distribuées. Vous pouvez écrire un postcommit hook qui télécharge les livres de cuisine sur le serveur Chef. Vous ne clonez pas simplement les livres de cuisine sur le serveur Chef parce que vous les téléchargez via une API, et c'est tout à fait intentionnel.

1voto

Andrew Vit Points 229

Chef-server gère les cookbooks et les données de configuration pour vos nœuds.

Vous ajoutez des livres de recettes à chef-server à l'aide de l'outil knife, puis vous donnez à chaque nœud une liste de recettes à exécuter afin qu'il puisse saisir les livres de recettes dont il a besoin lorsque le nœud se configure à l'aide de chef-client. Comme chef-client s'exécute en arrière-plan, vos nœuds vérifieront périodiquement si des livres de recettes ont été mis à jour dans votre chef-serveur.

Le chef-serveur contient également vos données de configuration et vos variables afin que vous puissiez modifier les paramètres pour que vos nœuds les reprennent automatiquement. Ceci est utile pour les paramètres plus dynamiques qui ne doivent ou ne peuvent pas être codés en dur dans vos recettes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X