Comment gérer votre cluster avec Chef et Knife sous Ubuntu

introduction

Chef est un système de gestion de la configuration conçu pour vous fournir un ensemble répétable de recettes pour la construction de votre infrastructure, ce qui vous permet d’automatiser, de mettre à jour et de tester votre infrastructure de la même manière que le code de votre application.

Il s’agit du sixième tutoriel de la série Démarrage de votre infrastructure à l’aide de Chef. Dans ce guide, nous supposerons que vous avez terminé les cinq autres didacticiels. Vous disposez donc d’un serveur Chef, d’un poste de travail et d’un ou plusieurs nœuds opérationnels.

Notre objectif

  • couteau * est un outil en ligne de commande fourni avec Chef. Vous avez probablement déjà utilisé un couteau pour créer et gérer des livres de cuisine, des poches de données ou des rôles Chef. Lorsque vous lancez une commande avec un couteau, vous tapez habituellement quelque chose comme:

knife cookbook create

L’exemple de commande ci-dessus utilise la sous-commande + cookbook + knife. Ce guide vous présente quelques nouvelles sous-commandes de couteau permettant d’émettre des commandes et d’obtenir des informations sur votre cluster Chef.

Nous couvrirons:

  • + statut du couteau

  • + couteau ssh +

  • + nœud de couteau +

Conditions préalables

Ce tutoriel suppose que vous avez suivi jusqu’au cinquième guide, https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-plugin-for-knife-to-manage-droplets-in -chef [Comment utiliser le plug-in DigitalOcean pour Knife afin de gérer les Droplets dans Chef], dans la page Getting Started Gestion de votre infrastructure à l’aide de la série Chef.

Créer des exemples de rôles et de serveurs

Si vous ne possédez pas de cluster Chef établi ou si vous souhaitez suivre ce guide de près et voir le même résultat, nous pouvons configurer des exemples de rôles et de serveurs.

Tout d’abord, sur votre * workstation *, accédez au répertoire + chef-repo +:

cd ~/chef-repo

Nous allons ajouter un rôle * backend * à notre rôle * web_server * existant. Pour le moment, ce sera vide, mais plus tard, vous pourrez le transformer en base de données ou en serveur d’applications.

nano roles/backend.rb

Ajoutez ce contenu au fichier + backend.rb +:

name "backend"
description "Backend for application servers"

Téléchargez ensuite le nouveau rôle sur votre serveur Chef.

knife role from file roles/backend.rb

Une fois que vous avez terminé, nous pouvons créer des exemples de nœuds à l’aide du plug-in DigitalOcean Knife.

(Remarque: This plugin n’a plus été maintenu en octobre 2014. C’est à vous de décider si vous voulez commencer à l’utiliser.)

knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

knife digital_ocean droplet create --server-name backend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

Remarque: Si les noms de domaine des différents hôtes de votre cluster Chef ne sont pas résolus en externe et que vous les connectez les uns aux autres à l’aide de fichiers + / etc / hosts + modifiés, le provisioning ne fonctionnera pas. Le fichier + / etc / hosts + par défaut sera attribué à l’instance de serveur.

Il se peut que vous ayez encore des nœuds actifs que vous avez créés au cours de la série de didacticiels Chef. Cela signifie que certaines des commandes que nous allons exécuter au cours de ce tutoriel auront des lignes ou des informations supplémentaires. Si vous souhaitez suivre de près, vous pouvez toujours supprimer ces nœuds en cliquant sur * Nodes> Delete * dans l’interface Web de votre serveur Chef.

Affichage du statut avec le statut du couteau

La sous-commande + status + est conçue pour afficher des informations sur l’état de vos nœuds. Pour utiliser + status de couteau +, il suffit de passer à votre répertoire + chef-repo + et de taper:

knife status

Vous verrez une liste des noeuds connus de votre serveur Chef, y compris l’heure de leurs derniers lancements + chef-client +, leurs noms, leurs noms de domaine, leurs adresses IP et leurs plateformes.

3 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
3 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
20 hours ago,  backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
3 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.

Nous pouvons immédiatement constater que nous devons examiner de plus près * backend01 * - il n’a pas réussi à lancer + chef-client + («enregistré» dans le jargon du chef) depuis environ 20 heures.

Si vous rencontrez un nœud dans une situation similaire, consultez les journaux d’erreur + chef-client + ou utilisez * Rapports> Exécuter l’historique * à partir de l’interface Web du serveur Chef.

Émettre des commandes avec un couteau ssh

Nous pouvons utiliser + couteau ssh + pour envoyer des commandes à nos nœuds (ou à un sous-ensemble de nœuds) en même temps. Par exemple, nous pouvons utiliser + knife ssh + pour redémarrer Nginx sur tous nos nœuds avec le rôle * frontend *.

Vous aurez besoin d’un utilisateur autorisé à SSH sur le serveur (c’est-à-dire que vous pouvez exécuter + ssh votre nom d’utilisateur @ fe1.votredomaine.com + et obtenir un shell). Si vous n’avez pas de clé SSH configurée, vous pouvez utiliser l’option + -P + pour demander un mot de passe.

knife ssh "role:web_server" "service nginx restart" -x  -a

Vous devriez obtenir une sortie qui ressemble à:

111.111.111.111  * Restarting nginx nginx      [ OK ]
222.222.222.222  * Restarting nginx nginx      [ OK ]

Nous venons d’exécuter une commande sur tous nos serveurs * frontend * en émettant une commande unique. Séparons les arguments et apprenons un peu plus sur le fonctionnement de + couteau ssh +.

knife ssh "web_server" "service nginx restart" -x  -a

Le premier argument de + couteau ssh + est une requête de recherche de chef. En général, vous voudrez utiliser quelque chose comme + role: YOUR_ROLE_NAME +, mais vous pouvez également effectuer une recherche via de nombreux autres attributs (et les combiner avec des opérateurs booléens). Par exemple, pour exécuter une commande uniquement sur les nœuds avec * ubuntu * dans leur attribut * platform *, vous pouvez exécuter:

knife ssh "platform:ubuntu*" "service nginx restart" -x  -a

Le * dans ce qui précède est un caractère générique. Cela correspondra à zéro ou plusieurs caractères dans la valeur d’attribut. Dans ce cas, cela nous permettra de faire correspondre la valeur * ubuntu 14.04 * telle qu’elle est affichée dans la sortie + couteau état + que nous avons examinée précédemment.

knife ssh "role:web_server" "service nginx restart" -x  -a

Le deuxième argument de + couteau ssh + est la commande que vous voulez exécuter sur les serveurs (qui correspond à la requête de recherche). Cela peut être presque tout ce que vous tapez dans une coquille. Vous pouvez même joindre des commandes avec un point-virgule (*; *).

knife ssh "role:web_server" "uptime;date" -x  -a

Ce qui donnerait quelque chose comme:

111.111.111.111  12:53:36 up 2 days, 15:25,  1 user,  load average: 0.08, 0.03, 0.05
111.111.111.111 Wed Oct 22 12:53:36 UTC 2014
222.222.222.222  12:53:30 up 2 days, 15:21,  1 user,  load average: 0.00, 0.01, 0.05
222.222.222.222 Wed Oct 22 12:53:30 UTC 2014

L’argument + -x + que nous avons déjà traité - c’est le nom d’utilisateur SSH à utiliser pour la connexion.

L’argument + -a + spécifie l’attribut de nœud à utiliser comme adresse pour SSH. Par défaut, il s’agit du nom de domaine complet de votre nœud (rappelez-vous que vous pouvez le trouver à l’aide de la commande + couteau status + indiquée précédemment). Par conséquent, si vous pouvez résoudre vos serveurs en visitant * http: //fe1.votredomaine.com*, vous pouvez omettre l’option + -a +.

Couteau interactif ssh

+ knife ssh + a également la capacité de vous mettre dans un shell interactif, où vous pouvez émettre une série de commandes et voir les résultats très rapidement. Vous pouvez démarrer un shell + knife ssh + avec un couteau interactif en utilisant + interactive + à la place de votre commande SSH.

knife ssh "role:web_server" interactive -x  -a

Cela va nous montrer:

Connected to 111.111.111.111 and 222.222.222.222

To run a command on a list of servers, do:
 on SERVER1 SERVER2 SERVER3; COMMAND
 Example: on latte foamy; echo foobar

To exit interactive mode, use 'quit!'

knife-ssh>

Vous pouvez donner des commandes à tous les serveurs du résultat de votre recherche en tapant simplement la commande et en appuyant sur * Entrée *.

knife-ssh> uptime
111.111.111.111  18:43:55 up 2 days, 21:16,  1 user,  load average: 0.01, 0.03, 0.05
222.222.222.222  18:43:49 up 2 days, 21:11,  1 user,  load average: 0.00, 0.01, 0.05

Si vous souhaitez affiner votre liste de serveurs, utilisez simplement + on +, comme le suggère le message d’aide. Notez que vous devez remplacer SERVER1 dans l’exemple de commande par l’attribut que vous avez utilisé sous la forme + -a +; pour nous, c’est l’adresse IP du nœud.

knife-ssh> on 111.111.111.111; echo hello digitalocean
111.111.111.111 hello digitalocean

Une utilisation vraiment intéressante d’interactive + knife ssh + est de l’utiliser pour afficher les journaux du serveur. Par exemple, si votre journal d’accès pour Nginx se trouve à l’emplacement par défaut (+ / var / log / nginx / access.log +), vous pouvez aligner les journaux avec l’option + -f + (suivez) et les résultats obtenus. sera continuellement imprimer sur votre console.

knife-ssh> tail -f /var/log/nginx/access.log

(Selon la configuration de Nginx, vous devrez peut-être utiliser + sudo + devant cette commande.)

Si vous visitez l’adresse IP de l’un de vos nœuds dans un navigateur Web, une entrée apparaît dans le journal d’accès de Nginx, sans rien faire à faire!

Gestion des nœuds avec un nœud couteau

Si vous avez suivi la procédure suivante: Comment créer des livres de recettes de chef simples à gérer Infrastructure sur Ubuntu], vous avez déjà utilisé + couteau nœud + pour répertorier tous les nœuds de votre serveur Chef et modifier les attributs de nœud.

knife node list
knife node edit frontend01

Vous pouvez également utiliser + knife node + pour supprimer des nœuds.

knife node delete frontend01

Ou, affichez des attributs de noeud plus détaillés:

knife node show frontend01
*******
Node Name:   frontend01
Environment: _default
FQDN:        fe01.yourdomain.com
IP:          111.111.111.111
Run List:    role[frontend]
Roles:       web_server
Recipes:     apt, nginx, apt::default, nginx::default
Platform:    ubuntu 14.04
Tags:

Vous pouvez obtenir une liste complète des attributs de votre noeud en utilisant l’option + -l +:

knife node show -l frontend01

Cela retournera une très longue liste d’attributs, la plupart d’entre eux automatiquement renseignés par * Ohai *, un outil Chef qui transmet automatiquement les attributs à + ​​chef-client + à chaque exécution.

Une longue liste d’attributs imprimée ne nous est pas forcément très utile. Cependant, le couteau nous a couverts là aussi. Nous pouvons spécifier l’option + - format + afin d’obtenir une représentation JSON ou YAML des attributs d’un nœud.

knife node show frontend01 --format json
*******

{
 "name": "frontend01",
 "chef_environment": "_default",
 "run_list": [
 "role[web_server]"
]
,
 "normal": {
   "tags": [

   ]
 }
}

Vous pouvez également récupérer un attribut de noeud unique avec + -a +.

knife node show frontend01 --format json -a ipaddress
*******
{
 "frontend01": {
   "ipaddress": "111.111.111.111"
 }
}

La sortie JSON ou YAML peut s’avérer très utile si vous souhaitez créer des scripts plus complexes impliquant un couteau, ou même pour afficher des tableaux de bord et des métriques.

Conclusion

couteau est un outil puissant, non seulement pour créer et mettre à jour les divers objets de votre cluster Chef, mais également pour afficher et gérer l’état de votre cluster.

Avec + knife ssh +, vous pouvez écrire une commande et la faire fonctionner simultanément sur plusieurs nœuds - un outil très puissant pour tout ingénieur devops.