web-dev-qa-db-fra.com

Gestion de la configuration: poussez la topologie basée sur la traction

Les systèmes de gestion de la configuration plus établis (cm) tels que la marionnette et le chef utilisent une approche à la traction: les clients interrogent un maître centralisé périodiquement pour les mises à jour. Certaines d'entre elles offrent un sans maîtrise Approche également (donc, basée sur la poussée), mais indique qu'il n'est pas "pas pour la production" (SaltStack) ou "moins évolutive" (marionnette). Le seul système que je connaisse est basé sur le démarrage à partir du départ est exécuté.

Quel est l'avantage spécifique d'évolutivité d'un système à base de traction? Pourquoi est-il soi-disant plus facile d'ajouter plus de maîtres tirés que des agents push-agents?

Par exemple, AgileTesting.blogspot.nl Écrit:

dans un système "tire", les clients contactent le serveur indépendamment l'un de l'autre, de sorte que le système dans son ensemble est plus évolutif qu'un système "Push"

D'autre part, Rackspace démontre qu'ils peuvent gérer des systèmes 15K avec un modèle à base de poussée.

Infrastructures.org Écrit:

Nous jurons par une méthodologie de tirage pour maintenir des infrastructures, à l'aide d'un outil tel que SUP, CVSUP, un serveur RSYNC ou CFengine. Plutôt que de pousser les changements vers des clients, chaque machine clientèle doit être responsable de l'interrogation du serveur Gold au démarrage et de la périodiquement par la suite, de maintenir son propre niveau de REV. Avant d'adopter ce point de vue, nous avons développé de vastes scripts basés sur des push basés sur SSH, RSH, RCP et RDIST. Le problème que nous avons trouvé avec les commandes R (ou SSH) était ceci: lorsque vous exécutez un script basé sur la commande R pour appuyer sur vos machines cible, les changements sont que si vous avez plus de 30 hôtes cibles, l'un d'entre eux sera être en panne à tout moment. Le maintien de la liste des machines commandées devient un cauchemar. Au cours du code de rédaction pour corriger pour cela, vous vous retrouverez avec un code d'emballage élaboré pour traiter: les délais d'attente d'hôtes morts; enregistrer et réessayer des hôtes morts; Forking et exécution d'emplois parallèles pour essayer de frapper de nombreux hôtes dans un délai raisonnable; et enfin de la détection et de la prévention du cas d'utilisation de toutes les prises disponibles TCP disponibles sur la machine source avec toutes les sessions de RSH sortantes. Ensuite, vous avez toujours le problème d'obtenir ce que vous venez de faire dans les images d'installation de tous les nouveaux hôtes à installer à l'avenir, ainsi que de la répéter pour les hôtes qui meurent et doivent être reconstruits demain. Après la difficulté, nous avons suivi la mise en œuvre de la réplication basée sur la commande R, nous avons constaté que ce n'est tout simplement pas la peine. Nous ne prévoyons à nouveau de gérer une infrastructure avec des commandes R ou avec tout autre mécanisme de poussée à ce sujet. Ils ne font pas échelle ainsi que des méthodes à base de tirage.

N'est-ce pas un problème de mise en œuvre au lieu d'un architectural? Pourquoi est-il plus difficile d'écrire un client-poussoir fileté qu'un serveur de traction fileté?

22
Willem

Au cas où il est intéressant d'intéresser à quiconque, je suppose que, au minimum, je peux donner un rapport d'expérience utilisateur ayant mis ma première utilisation de la fonctionnalité de la case de la case dans le contexte de la gestion des correctifs des configurations multi-hôtes des systèmes critiques de mission dans le nuage amazonien. Pour comprendre mes idées préconceptions ou mes préjugés, je devrais expliquer que j'ai une préférence pour Ruby au niveau de la script d'automatisation et j'ai configuré des projets pour utiliser la configuration Master-Agent Puppet PER-Project-VPC dans le passé. Donc, mon expérience est bien que les préjugés précédents, s'il y en avait.

Mon expérience récente a été très favorable à une poussée dynamique sur une succession de dizaines de dizaines à plusieurs centaines de serveurs pouvant augmenter ou descendre, être terminée et rafraîchie. Dans ma situation, une simple commande ansite 1.7 ad hoc était tout ce que je devais faire le patch. Toutefois, compte tenu de l'efficacité de la mise en place d'une ansiblecontroller (sur un T2.Micro) par VPC à cet effet, à l'avenir, je souhaite élargir la technique d'exigences plus complexes.

Alors laissez-moi revenir à la question posée dans ce fil: des avantages et des inconvénients d'une succession de manière dynamique.

Les hypothèses du type de domaine de serveur que j'ai ciblé étaient:

  • Aucune hypothèse selon laquelle les adresses IP ou les noms d'hôtes locaux générés par Amazonien seront durables - ils peuvent tous les deux venir
  • Toutes les instances ont été créées à partir d'images de la machine qui ont déjà eu la possibilité de rendre l'accès SSH possible à partir d'un seul utilisateur administratif privilégié.
  • Pour individualiser les serveurs et les partitionnez potentiellement en groupes, en fonction de la fonction ou en fonction du stade du développement (E.G. Test ou produit), cela se ferait via des balises Amazon spécifiques des noms conventionnels convenus convenus.
  • Que je corrigerais des serveurs Linux et Windows séparément, avec différentes commandes ad hoc, permettant donc simplement de définir des connexions spécifiques à Linux d'échec lorsque la mise en contact d'un serveur Windows était parfaitement acceptable.

Avec ces conditions à l'esprit, créez une image de machine d'un ansiblecontroller pour déposer dans de nombreux VPCS et configurer (avec des informations d'identification) in situ dans les comptes serveur existants est très simple. Automatisé dans chaque instance créée à partir de l'image est

  1. Un travail cron pour pousser le patch pour exécuter des serveurs à intervalles réguliers afin que le domaine requis soit accessible continuellement à des intervalles.
  2. Un moyen de calculer l'inventaire ansible à chaque intervalle de ce type.

Le deuxième élément peut être fait relativement sophistiqué si nécessaire (via la structure d'information de l'inventaire ansible). Mais si la sophistication n'est pas nécessaire, voici un exemple très simple d'un script pour calculer toutes les instances d'Amazon EC2 à chaque intervalle de cron et diriger les résultats dans un fichier d'inventaire approprié (par exemple/etc/ansi/ansible/hôte) ...

#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.Amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of Host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute 
# path, to which the list is written

function list-of-ips {
    /usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk  '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
 }

if [ -n "$1" ]; then
   list-of-ips > "$1"
else
   list-of-ips
fi

La seule mise en garde pour le cas d'utilisation est que la commande patch doit être idempotente. Il est souhaitable de pré-tester pour faire parfaitement sûr que cela est satisfait, dans le but de veiller à ce que le patch fait exactement ce qui est destiné.

Donc, pour résumer, j'ai illustré un cas d'utilisation où la pousse dynamique est efficace contre les objectifs que j'ai définis. C'est une solution reproductible (dans le sens d'être encapsulé dans une image pouvant être déployée dans plusieurs comptes et régions). Dans mon expérience à ce jour, la technique de poussée dynamique est beaucoup plus facile de fournir --- et d'entrer dans l'action - que les alternatives disponibles des outils à part disponibles pour le moment.

11
johnz