jeanserge-monbailly-initial
Jean-Serge Monbailly
Ninja Devops

Pilotez votre infrastructure depuis votre smartphone

Chatops, Slack, Botkit17/01/2017

Astuces pour piloter une infrastructure via Slack.

L'administration système est un domaine vaste incluant des tâches cruciales pour la maintenance d'une infrastructure :

  • la configuration de machines ;
  • la gestion des logs ;
  • le monitoring de performances ;
  • le déploiement d'applications.

Toutes ces tâches sont indépendantes et il existe aujourd'hui beaucoup d'outils pour les accomplir efficacement. Néanmoins il peut s'avérer complexe de travailler avec un tel nombre d'outils et d'en extraire les informations nécessaires à la maintenance d'une infrastructure.

Dans cet article, je proposerai une manière d'agréger efficacement cette masse d'informations ; puis je présenterai le Chatops, une solution développée et utilisée chez Dernier Cri permettant de gérer efficacement son infrastructure depuis un chat, ce qui permet d'effectuer facilement ces tâches depuis un simple smartphone et donc de gagner grandement en réactivité.

Le cœur de l'infrastructure : le chat

La communication étant très importante au sein des entreprises, celles-ci se doivent de disposer d'un outil de communication performant. Les systèmes de chat répondant parfaitement à ce besoin, des services comme Slack ou HipChat, sont très vite devenus incontournables.

Ces services proposent un vaste panel d'intégrations permettant de collecter des données provenant de différents services. L'utilisation de ces intégrations centralisera les données issues de différents outils en un même endroit.

Une bonne pratique consiste à configurer un channel correspondant à chacune des applications gérées par l'entreprise. Ce channel regroupera à la fois les différents acteurs du projet (chef de projet, développeurs, clients) et l'ensemble des intégrations connectées à l'application en question. De cette manière en cas de panne, toutes les informations nécessaires à sa résolution seront disponibles au même endroit :

  • les logs d'erreur ;
  • l'état de la machine ;
  • les rapports d'analyse de code (ex : Code Climate) ;
  • l'état de l'intégration continue.

Exemple de notification *NewRelic*

Cette méthode permet également à davantage de personnes de participer à la résolution d'une panne puisqu'il n'y a aucun pré-requis technique à la collecte d'informations. De cette manière, le chef de projet et le client sont plus à même de suivre les étapes de résolution du problème.

Il faut maintenant être capable d'utiliser cette masse d'informations, pour cela je vais vous présenter un outil très pratique qui permettra même à un chef de projet stressé de participer à la résolution d'une panne.

Le chatops

*Yolops*, le chatops de Dernier Cri

Ayant accès à une collection d'informations utiles, il est maintenant intéressant de disposer d'un outil capable de les manipuler et d'automatiser certaines tâches d'administration système.

Nous avons créé Yolops, un bot Slack, pour répondre à ce besoin. Il est maintenant possible de réaliser une partie de la maintenance de serveurs directement via le channel associé. Il n'est plus nécessaire de disposer de compétences techniques pour gérer une panne. Une commande simple et intuitive suffira à interagir avec le bot.

Yolops est capable, entre autres, de : - redémarrer des serveurs ; - manipuler des dynos heroku ; - surveiller des machines ; - déployer...

Exemple de déploiement d'application via le *Chatops*

Le Chatops permet de faire du Développement dirigé par la conversation, il aidera étape par étape à la réalisation des tâches d'administration système.

Botkit et NodeJS comme base pour construire notre chatops

Le Chatops est une application Node.JS connectée à l'API temps réel de Slack afin d'être notifié de l'activité des channels desquels il fait partie. Cette application est basée sur le module Botkit permettant de créer facilement un bot Slack et auquel nous avons ajouté une couche d'abstraction pour rendre le Chatops plus extensible.

En effet, nous avons souhaité rendre le code aussi modulaire que possible, de manière à pouvoir l'utiliser et l'étendre très simplement. Les fonctionnalités de Yolops sont implémentées au sein de différents plugins spécialisés permettant au bot de s'adapter à l'évolution de notre infrastructure.

Voici un exemple montrant la construction d'une commande du Chatops :

const helloCommand = {
  sampleCommand: "hello",
  shortDescription: "say hello !",
  hears: "Hello",
  onMention: true,
  command: (bot, message) => {
    bot.api.users.info({ user: message.user }, (_, response) =>
      bot.reply(message,`Hello ${response.user.name} !`)
    )
  }
}

La construction est très simple : - sampleCommand et shortDescription sont utilisés pour décrire la commande dans l'aide du Chatops - hears correspond à une expression régulière reconnue par le bot comme évènement déclencheur de la commande - command correspond à la fonction à exécuter au déclenchement de celle-ci.

Ansible comme orchestrateur pour nos serveurs

Pour accroitre la puissance du Chatops, nous avons décidé de le coupler à Ansible, un logiciel d'orchestration Open-Source permettant de gérer et d'organiser efficacement un ensemble de machines.

Les tâches exécutées par Ansible se présentent sous la forme de playbooks. Il s'agit de fichiers YAML permettant de chainer plusieurs appels à des modules Ansible pour réaliser des tâches plus complexes.

Par exemple, le script suivant peut être utilisé pour supprimer une clé SSH spécifique de toutes les machines auxquelles Ansible a accès. Pour ce faire le script va simplement lire la clé publique à supprimer et vérifier qu'elle est bien absente du fichier ~/.ssh/authorized_keys du serveur.

# remove-key.yml

---
- hosts: all
  tasks:
  -  name: Remove the public key of the remote host
     authorized_key: user={{ ansible_ssh_user }}
                     key="{{ lookup('file', '/tmp/id_rsa.pub') }}"
                     state=absent
  -  name: Check if the key has been removed
     shell: cat ~/.ssh/authorized_keys | awk '{ print $3 }'
     register: new_ssh_keys
  -  debug: var=new_ssh_keys.stdout_lines

Ansible s'intègre parfaitement au Chatops pour 2 raisons : - il s'agit d'un client léger donc facilement empaquetable avec le bot - il apporte une solide bibliothèque de modules adaptés à un grand nombre d'outils et technologies

Ainsi, l'exécution des tâches d'administration est déléguée à Ansible tandis que le Chatops interface celles-ci au sein de commandes plus accessibles à l'utilisateur. Ce découpage permet également de garnir l'exécution des playbooks d'appels à diverses API pour fournir davantage d'informations.

Chatops : un outil devops simple et aux possibilités infinies

Que vous soyez développeur, administrateur système ou chef de projet, la centralisation des informations de votre infrastructure représente un gain de temps non négligeable. Cette méthode facilite également la gestion des équipes, chaque projet disposera d'un channel dédié au sein duquel seront présents les différents acteurs de ce projet.

L'intégration d'un Chatops est très intuitive et vise à être la plus extensible possible via de nouveaux plugins adaptés à vos technologies. Ceux-ci pourront être associés à une solution d'orchestration telle qu'Ansible pour entretenir votre infrastructre de manière uniforme, qu'elle repose sur une ou plusieurs plateformes.

Sur le long terme, vous pourriez également créer des plugins permettant au Chatops d'être autonome. Par exemple en le connectant à votre outil de monitoring, le bot pourrait automatiquement diagnostiquer une panne dès qu'elle survient, fournir un rapport sur Slack et tenter de résoudre le problème.

Liens utiles