Meilleure pratique pour les mises à jour Linux automatisées

11

Nous travaillons sur un moyen d'effectuer des mises à jour automatiques pour nos serveurs RHEL / RHEL.

Idée initiale: à l' aide de Puppet, nous désactivons les référentiels par défaut et pointons les nôtres. Ensuite, nous utilisons ensure => latestpour les packages que nous voulons mettre à jour automatiquement.

Problème: nous constatons que certains services redémarrent après une mise à jour (duh).

Question: Quelqu'un a-t-il des conseils sur la meilleure façon d'automatiser les mises à jour Linux et les stratégies pour atténuer le redémarrage automatique des services? Nous préférerions une solution qui inclut Puppet mais, si nous devons utiliser un autre service, ce n'est pas une rupture.

Éditer

Solution possible: j'ai soumis une solution qui implémente bon nombre des suggestions de @ voretaq7 et @ewwhite. On dirait que c'est la voie que je prends pour le moment. Si vous avez d'autres suggestions, veuillez commenter ou soumettre une réponse.

Belmin Fernandez
la source

Réponses:

14

Votre stratégie de mise à jour générale est saine: vous avez un dépôt local (que je suppose que vous testez dans un environnement de développement), et vous mettez à jour tout en fonction de ce dépôt (je suppose bien connu).

Le redémarrage du service est inévitable: si le code sous-jacent a changé, vous devez redémarrer le service pour que cette modification prenne effet. Ne pas le faire peut entraîner des conséquences plus graves (l'exécution de code désynchronisé avec une bibliothèque partagée conduisant à un blocage de l'application).
Dans mon environnement, je considère que les fenêtres de patch trimestrielles sont trimestrielles "REDÉMARREZ TOUTES LES CHOSES!" fenêtres aussi. L'avantage d'une telle politique est que vous savez que vos serveurs reviendront après un redémarrage, et vous savez qu'ils fonctionneront correctement (car vous les testez régulièrement).


Mon meilleur conseil est de planifier les versions du logiciel (cela signifie peut-être que vous devrez les déclencher "manuellement" avec une marionnette) et d'informer vos utilisateurs de la maintenance / du temps d'arrêt prévu.
Alternativement (ou dans le cadre de cela), vous pouvez configurer la redondance dans votre environnement de sorte que vous puissiez redémarrer quelques machines ou services tout en fournissant des services aux utilisateurs finaux. Cela peut ne pas éliminer complètement les perturbations, mais cela peut aider à les minimiser.

La redondance supplémentaire vous protège également en cas de pannes matérielles, qui sont inévitables sur une échelle de temps suffisamment longue.

voretaq7
la source
4
+1 pour Redémarrer toutes les choses.
Tom O'Connor
2
@ TomO'Connor, j'ai appris à la dure. Je me sens très à l'aise jusqu'à environ 3 mois entre les redémarrages, après quoi je commence à me demander ce que j'ai fait qui va disparaître. Lors du dernier redémarrage, nous avons en fait perdu un tunnel VPN (le tunnel était codé en dur et est apparu, mais l'itinéraire n'a pas été ajouté, alors ... oui.)
voretaq7
Publié une solution possible inspirée par vous @ voretaq7
Belmin Fernandez
@ BeamingMel-Bin Vous devriez poster cela comme une réponse - cela ressemble à une approche raisonnable.
voretaq7
Je vous remercie. Posté avec quelques modifications au flux de travail par certains pensant que j'ai fait sur le chemin du retour.
Belmin Fernandez
5

Y a-t-il nécessairement un problème avec le redémarrage d'un service après une mise à jour de package? Testez à petite échelle avant de déployer pour voir s'il y a des problèmes. J'ai récemment eu un vilain problème avec le package rpmforge de DenyHosts . Il a en fait changé l'emplacement de sa configuration et de ses répertoires de travail entre les révisions d'une mise à jour yum. C'est un comportement totalement indésirable. En règle générale, dans la même révision de RHEL, il n'y a pas trop de problèmes, mais vous ne pouvez jamais en être sûr sans tester et surveiller les effets de près.

Une autre option consiste à mettre à jour les services de manière sélective. Avez-vous toujours besoin des derniers packages, par exemple? Cela revient à comprendre vos raisons pour exécuter des mises à jour. Quel est le vrai but?

L'avantage de l'exécution de votre propre référentiel est que vous pouvez organiser des versions ou des déploiements et gérer le calendrier. Que se passe-t-il si vous avez un périphérique matériel ou un fournisseur de logiciels qui nécessite RHEL 5.6 et tomberait en dessous de 5.7? C'est l'un des avantages de la gestion de vos propres packages.

ewwhite
la source
Je dirais que si l'ensemble de mises à jour déclenche un redémarrage du service, vous voulez vraiment le faire. Bien sûr, si vous n'avez PAS BESOIN de faire cette mise à jour (cela ne vous achète pas une fonctionnalité, une amélioration de la sécurité ou autre chose dont vous avez besoin), je ne le ferais pas, ou j'attendrais de pouvoir planifier être pratique pour moi et mes utilisateurs.
voretaq7
2

@Beaming Mel-Bin

La simplification éliminera le besoin d'utiliser ssh pour les outils de boucle, pour démarrer / arrêter la marionnette.

Tout d'abord, vous devrez modifier vos manifestes pour inclure une variable appelée "noop" dont la valeur provient de l'ENC.

Vous auriez donc quelque chose comme ça dans une classe:

noop => $noop_status

noop_statusest défini dans votre ENC. Lorsque vous définissez la valeur de noop_statussur true, le manifeste s'exécutera uniquement en mode noop.

Si vous avez des centaines ou des milliers d'hôtes, vous pouvez utiliser une ENC comme Dashboard ou Foreman qui vous permet de modifier en masse les paramètres de nombreux hôtes, en les héritant au niveau "Hostgroup" ou "Domain". Vous pouvez ensuite définir la valeur "false" pour un petit nombre d'hôtes de test, en remplaçant la valeur du groupe d'hôtes.

Avec cela, toutes les modifications sont appliquées aux hôtes sélectionnés uniquement.

La modification d'un paramètre dans un emplacement central peut affecter n'importe quel nombre d'hôtes, sans qu'il soit nécessaire d'activer / désactiver la marionnette avec ssh pour les outils de boucle. Vous pouvez diviser vos hôtes en plusieurs groupes pour des raisons de sécurité / gestion.

Notez également qu'au lieu de coder en dur les numéros de version des packages dans les manifestes, vous pouvez les mettre dans l'ENC. Et comme ci-dessus, vous pouvez appliquer de manière sélective les modifications et gérer les déploiements.

Si vous voulez plus de granularité (et de complexité), vous pouvez même avoir des paramètres par classe, comme noop_status_apacheClasset ainsi de suite.

Cela peut être plus difficile à gérer si vous includeclasse dans d'autres classes.

Pas maintenant
la source
1

Solution possible basée sur la réponse de @ voretaq7:

  1. Coder en dur les numéros de version des packages dans les puppetmanifestes et maintenir les packages dans notre propre référentiel.

  2. Lorsque nous avons besoin d'une nouvelle version d'un package pour faire quelque chose qu'il offre (par exemple, des améliorations de sécurité, des fonctionnalités requises par nos clients, etc.), nous téléchargeons le package dans le référentiel.

  3. Testez le package mis à jour sur un serveur de test.

  4. Une fois la mise à jour testée, utilisez quelque chose comme funcou psshpour arrêter l' puppetagent sur les nœuds affectés.

  5. Mettez à jour les puppetmanifestes pour vous assurer que la nouvelle version du package est installée sur les nœuds concernés.

  6. Enfin, exécutez puppet agent --onetime && rebootsur le serveur en utilisant funcoupssh

Veuillez commenter et faites-moi savoir si vous repérez des lacunes dans cette solution ou quoi que ce soit qui pourrait être simplifié.

Belmin Fernandez
la source
1
Il est possible de simplifier cela en utilisant une ENC et des paramètres. Cela nécessitera une certaine réorganisation des manifestes, ce qui peut ne pas être possible pour tous.
Pas maintenant
Veuillez élaborer @NotNow et publier une réponse. Intrigué de savoir.
Belmin Fernandez