Comment gérez-vous et déployez-vous les ports de FreeBSD dans un grand environnement?

19

Je suis curieux de savoir comment les gens déploient les ports de FreeBSD dans leur environnement. Je suppose que la plupart des gens utilisant FreeBSD utilisent en effet des ports (et souvent une mise à niveau de port pour la mise à niveau avec des binaires). Je suis cependant intéressé par la façon dont vous avez cette configuration, car je ne suis pas satisfait du fonctionnement des versions récentes. J'utilise maintenant FreeBSD 9.0 et j'ai des problèmes.

J'ai configuré les choses comme suit:

  • / usr / ports est partagé via NFS à partir d'un nœud (avec une mise à jour nocturne de la récupération des ports).
  • Chaque nœud monte / usr / ports avec lecture-écriture
  • J'ai défini "WRKDIRPREFIX = / usr / tmp" dans /etc/make.conf sur tous les nœuds
  • J'ai configuré le Portsnap pour utiliser un index local en ajoutant ce qui suit à /usr/local/etc/pkgtools.conf:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

Je peux exécuter avec succès portupgrade -p packagepour construire un package puis portupgrade -P packageinstaller le binaire sur les autres nœuds.

Pourtant, je reçois parfois le problème suivant: /var/db/INDEX.local:23265:dbm_store failed

Je ne peux penser à aucune autre optimisation que je puisse faire au système, car l'index réside maintenant localement, et la seule chose vraiment exportée est l'arborescence des ports et rien n'y est jamais écrit depuis les nœuds.

vpetersson
la source
Une option serait d'avoir une arborescence de ports locale complète sur chaque nœud (et peut-être juste de monter des `` fichiers distants '' et des `` packages ''), mais cela ressemble à une énorme perte d'espace (sans parler de nombreuses mises à jour inutiles).
vpetersson
vpeterson: C'est une question qui doit être posée (je suis bloqué à ce sujet en ce moment. Et +5 votes et 3 étoiles suggèrent que nous ne sommes pas seuls). Nettoyez peut-être cette question et énoncez certains problèmes spécifiques que vous essayez de résoudre. (FWIW, quelqu'un a voté pour fermer votre question. Personnellement, j'aimerais beaucoup que cette question, ou une question similaire, soit enregistrée).
Stefan Lasiewski
Je ne sais pas comment clarifier la question. Je ne pense pas non plus que @ voretaq7 réponde réellement aux questions, mais suggère plutôt une méthode alternative. La question est vraiment de savoir ce que le sujet suggère - comment les gens déploient-ils les ports de FreeBSD dans un environnement multi-nœuds.
vpetersson

Réponses:

13

Je n'ai jamais été entièrement satisfait du système de ports dans un grand environnement - Il semble toujours que vous devez lui appliquer une gestion externe afin de le faire fonctionner correctement.

Mes meilleurs conseils (par ordre croissant de préférence, de la «pire» solution à la «meilleure» solution):


Si vous construisez sur chaque hôte, ne le faites pas .
Si vous devez le faire, ne le faites pas sur NFS avec des montages en lecture-écriture comme vous le décrivez: vous pouvez généralement faire confiance aux ports pour faire la bonne chose et ne pas piétiner l'arborescence des ports si vous fournissez des répertoires de travail alternatifs, mais il est toujours préférable de soyez prudent que désolé: exécutez un miroir CVS / csup local et csup tous vos hôtes à partir de cette boîte, puis construisez localement comme vous le feriez s'il s'agissait de machines individuelles.
Oui, je sais que cela signifie avoir plus d'espace disque sur les hôtes et une étape supplémentaire. Il est également presque garanti d'être sans problème.
Caveat: Vous souhaiterez probablement synchroniser les fichiers de configuration du package (rsync ou similaire) à partir d'un "hôte de configuration" désigné pour garantir la cohérence sur chaque machine (vous pouvez même rsync toute l'arborescence des ports si vous le souhaitez, plutôt que d'utiliser csup sur chaque nœud).


Utilisez un hôte de génération, créez des packages et installez-les.
Une bien meilleure solution que de construire sur chaque machine individuelle: utilisez un hôte de build pour créer des packages et pointez vos outils vers ces packages.
Cela signifie garder un hôte de construction pour chaque architecture que vous exécutez (ou compilation croisée), mais c'est finalement plus agréable pour vos machines cibles (pas de gros travaux de compilation, une garantie de cohérence)


Utilisez un outil de gestion de configuration / système.
C'est la solution avec laquelle je me suis retrouvé - je crée une image de serveur standard et la déploie autour de mon environnement à l'aide radmind. Vous pouvez faire des choses similaires avec Puppet ou Chef . Cela présente tous les avantages de l'utilisation d'un hôte de génération (cohérence, moins de charge sur les serveurs individuels) et ajoute l'avantage de la gestion de la configuration.

Avertissement: cela ne fonctionne vraiment bien que si vos machines sont «identiques» - c'est-à-dire que vous pouvez installer le même ensemble de ports sur chacun d'eux. Cela peut fonctionner si vous avez différents ensembles de ports, mais cela augmente considérablement les frais administratifs.

Avertissement: je suis le responsable du port pour sysutils/radmind. Ouais, je l'aime tellement que je l'ai adopté.


Tout cela est basé sur mon expérience dans la gestion d'environnements FreeBSD de différentes tailles (allant de 1 à 2 machines à plus de 100). Les outils de configuration / gestion du système qui poussent et maintiennent une image standardisée sont vraiment le meilleur moyen de gérer cela selon mon expérience.

voretaq7
la source
Bons pointeurs. J'ai joué avec Puppet un peu dans le passé et je l'adore sur Ubuntu. Pourtant, je ne sais pas à quel point il fonctionne avec FreeBSD. Je n'ai pas encore essayé. Quoi qu'il en soit, même avec Puppet, je pense qu'il fait appel à Portupgrade, ce qui nous ramène à la case départ. Je ne vois pas d'autre moyen de fonctionner, car il faudrait alors faire pkg_delete / pkg_add ou 'pkg_add -f' ce qui ne serait pas une bonne idée. En ce qui concerne le matériel, ils sont tous identiques car ils fonctionnent dans un cloud public (KVM / Qemu).
vpetersson
Si votre configuration matérielle et logicielle de base est identique, je suggérerais quelque chose comme radmind, qui gère toute l'image du système. Puppet et Chef sont d'excellents outils, cependant, comme vous l'avez souligné, ils appellent les binaires OS sous-jacents, ce qui vous permet d'utiliser un hôte de génération et de distribuer des packages. radmind évite cela en prenant en charge la gestion au niveau du système de fichiers ("Si ce n'est pas ce qui est censé être ici, remplacez-le ou supprimez-le") plutôt qu'en essayant d'être un administrateur système de substitution ("Exécutez ces commandes / modifiez ces fichiers pour moi afin de configurer le boîte").
voretaq7
Eh bien, les systèmes ont un matériel identique, mais pas des configurations identiques. Je vais devoir me pencher sur Radmind, mais je ne sais pas si c'est la meilleure approche. L'utilisation des outils intégrés devrait fonctionner à mon humble avis, c'est pourquoi je contacte la communauté pour voir si j'ai oublié quelque chose d'évident. Je peux difficilement être le seul à essayer de le faire.
vpetersson
Intégré dans les outils vraiment DO travail, ils ont juste besoin de beaucoup d'aide (serveurs de construction, la distribution locale des emballages, etc.) - Ils sont vraiment orientés vers la gestion d' une machine, et n'échelle pas aussi bien que possible. Notez que j'ai laissé de côté l'option de lancer votre propre serveur de mise à jour freebsd - je n'ai jamais essayé cela pour plus que le système de base, mais c'est théoriquement possible. Je suis juste resté
fidèle
Oui, c'est une idée intéressante en fait. Je ne suis simplement pas sûr que cela fonctionnerait avec la distribution de packages de ports sans beaucoup de modifications. Je suis vraiment curieux de savoir comment les administrateurs système de grands systèmes gèrent cela, car il existe de nombreux déploiements importants de FreeBSD. Est-ce que tous roulent leur propre solution? Si c'est le cas, cela semble assez étrange et pas très Open Source.
vpetersson
6

Étrange que personne n'ait mentionné ports-mgmt / tinderbox :

Tinderbox est un système de construction de paquets pour les ports FreeBSD, basé sur des scripts Portbuild officiels utilisés sur le cluster de construction pointyhat. Tinderbox a été écrit par Joe Marcus Clarke.

Vous pouvez définir plusieurs prisons (versions du système de base) et plusieurs portstrees. La combinaison de prison et de portstree est appelée build. Une prison Tinderbox n'est pas ce que l'on entend comme une prison dans FreeBSD, c'est en fait un monde donné dans un chroot. Tinderbox prend en charge le suivi automatique des dépendances et reconstruit uniquement les packages modifiés depuis la dernière exécution. Tinderbox prend en charge la notification par e-mail des builds ayant échoué. Tinderbox s'intègre également bien avec ccache.

Tinderbox est conçu pour fournir facilement des ensembles de ports dont vous avez besoin, pour les plates-formes et les architectures dont vous avez besoin. Tinderbox est également un excellent outil pour tester de nouveaux ports et des mises à niveau de ports, en particulier pour tester les dépendances et les listes de colisage. Il est également utile pour tester les ports sur différentes versions de FreeBSD, car vous pouvez exécuter le monde FreeBSD 6.X en tant que prison sur l'hôte FreeBSD 7.X / 8.X.

Le passage à pkgng simplifie également considérablement les déploiements de packages.
Découvrez-le sur github: https://github.com/pkgng/pkgng

SaveTheRbtz
la source
1
Bien que cela puisse certainement être utile pour construire les packages réels dans un environnement diversifié (plusieurs versions, architectures, etc.), cela ne résout pas vraiment le problème du déploiement des packages.
vpetersson
Tinderbox rend les packages disponibles sur HTTP, vous pouvez donc combiner cela avec les commentaires sur la réponse de voretaq7 pour obtenir votre solution de déploiement (par exemple, définir PACKAGEROOT/ PACKAGESITEet utiliser radmind ou Puppet / Chef).
James O'Gorman
Oui, mais la construction et la distribution de packages ne sont pas le problème. Je peux utiliser portupgrade (-p) pour construire le paquet et les distribuer via NFS (avec ou sans arborescence de ports). Le problème est que ce modèle nécessite toujours a) une arborescence complète des ports localement, ou b) une arborescence des ports exportée via NFS, ce qui nous ramène au problème actuel.
vpetersson
2
Portupgrade fera exactement ce que vous auriez à faire si vous construisiez à partir de la source ou utilisez des packages binaires - pkg_deletedoit être exécuté en premier, puis installer la nouvelle version. OpenBSD a mieux géré cela en incluant une option de mise à niveau dans pkg_add. Pas sûr de Portupgrade mais portmaster peut fonctionner simplement en utilisant INDEX et non une arborescence complète de ports.
James O'Gorman
1
D'accord, mais pkg_delete n'est pas une approche raisonnable. Supposons que vous souhaitiez mettre à niveau Ruby, Python ou tout autre package qui est une condition préalable pour un grand nombre d'autres packages. pkg_delete vous obligerait alors à supprimer toutes les dépendances, ce qui n'est guère une option pour un système de production. Portupgrade fait un bien meilleur travail avec cela, mais encore une fois, il ne semble pas évoluer .
vpetersson
3

J'ai géré plus de 100 serveurs FreeBSD en partageant simplement / usr en lecture seule sur NFS bien réglé, en déplaçant les bases de données de paquets de / var vers / usr et en y associant des liens symboliques (pas strictement nécessaire mais permettant pkg_info et autres). Il y avait peut-être un ou deux autres fichiers qui devaient être déplacés dans une direction ou dans l'autre et liés par un lien symbolique, mais la configuration entière m'a pris environ une heure pour comprendre. Cela a très bien fonctionné. Si j'avais rencontré des problèmes de mise à l'échelle, j'aurais ajouté des serveurs NFS supplémentaires et divisé la charge de travail, mais cela ne s'est jamais produit. Les performances n'ont jamais été un problème pour moi (en fait, c'était génial) mais je suppose que vous pouvez mettre / usr du serveur NFS (ou une copie de celui-ci) sur un md.

duvet
la source
Le partage des fichiers de package construits sur NFS (ce dont on dirait que vous parlez?) Est certainement une autre approche raisonnable - vous pouvez ensuite utiliser quelque chose comme marionnette (ou même des scripts SSH et shell maison) pour installer / mettre à niveau des packages à partir du partage NFS.
voretaq7
1

Il semble que personne n'ait malheureusement trouvé de bonne solution. Cela est probablement dû aux limitations des outils de sous-jacents.

Voici ce que j'ai trouvé: j'ai abandonné l'idée d'exporter la totalité de l'arborescence des ports. Au lieu de cela, j'ai cédé et mis une arborescence complète de ports sur chaque nœud. J'ai ensuite monté des «packages» sur NFS (pour permettre la distribution des packages).

J'ai également l'intention d'utiliser un proxy de mise en cache (probablement Squid) pour accélérer le processus de portnap. J'ai écrit un court article sur la façon de configurer cela sur mon blog.

Les références:

vpetersson
la source