Nous économisons du temps, des nerfs et des heures de travail

Nos projets sont généralement régionaux et les clients sont généralement des ministères. Mais outre le secteur public, des organisations privées utilisent également nos systèmes. Avec eux, il n'y a pratiquement aucun problème.

Ainsi, les principaux projets sont régionaux et posent parfois des problèmes. Par exemple, en matière de performances, lorsque dans les régions, il y a plus de 20 XNUMX de nos précieux utilisateurs pendant la période de déploiement de nouvelles fonctionnalités sur les serveurs de produits. C'est une douleur…

Je m'appelle Ruslan et je supporte les systèmes d'information du groupe BARS et développer un robot tueur pour les administrateurs de base de données en série violents. Cet article n'est pas pour les âmes sensibles - il contient beaucoup de lettres et d'images.

Nous économisons du temps, des nerfs et des heures de travail

/awr

Certaines de nos applications fonctionnent sur Oracle DBMS. Il existe également des projets sur le SGBD PostgreSQL. Oracle a quelque chose de merveilleux : collecter des statistiques sur la charge du SGBD, qui mettent en évidence les problèmes existants et font même des recommandations pour leur élimination - le référentiel de charge de travail automatique (AWR). À un moment donné (c'est-à-dire au moment de la douleur), les développeurs ont constamment demandé de collecter Rapports AWR pour l'analyse des performances. Nous sommes honnêtement allés sur le serveur du SGBD, avons collecté des rapports, nous les avons apportés et les avons envoyés en production pour analyse. Après la 5ème fois, c'est devenu ennuyeux... après la 10ème, c'est devenu irritant...

Un de mes collègues a un jour exprimé l’idée que tout ce qui est fait plus d’une fois devrait être automatisé. Jusqu'au moment d'irritation, pour être honnête, je n'y ai pas pensé et j'ai essayé d'automatiser tout ce qui pouvait être automatisé, mais souvent ce n'était pas demandé et il s'agissait plus d'une recherche que d'un caractère appliqué.

Et puis j'ai pensé : "Les administrateurs ne sont pas nécessaires pour générer un rapport...". Après tout, collecter un rapport signifie exécuter le script SQL @$ORACLE_HOME/rdbms/admin/awrrpt.sql et transférer le rapport du serveur vers chez vous... Oh oui, nous n'autorisons pas le développement pour la production.

Ensuite, j'ai recherché les informations nécessaires sur Google, créé la fonction à partir de l'article sur la base de test, exécuté le script et miracle - le rapport a été compilé et peut être enregistré localement. Création de fonctions où les rapports AWR étaient souvent nécessaires et explication aux développeurs comment les utiliser.

À cette époque, pendant mon temps libre, après avoir discuté avec @BotFather, j'ai créé un bot Telegram pour moi-même, juste pour m'amuser. J'y ai installé une fonctionnalité simple : afficher l'heure actuelle, les taux de change, la météo, lui apprendre à envoyer des compliments à ma femme (alors petite amie) selon un horaire. Peut-être qu’à cette époque, envoyer des compliments était la fonctionnalité la plus populaire de mon bot, et ma femme l’appréciait.

Donc. Les développeurs nous écrivent dans Telegram, nous leur envoyons un rapport dans Telegram... Et s'ils n'écrivaient pas à nous, mais à un bot ? Après tout, ce sera mieux pour tout le monde, le rapport sera reçu plus rapidement et, surtout, nous contournera. C'est ainsi qu'est née l'idée de la première fonctionnalité populaire pour mon bot.

J'ai commencé la mise en œuvre. Je l'ai fait du mieux que j'ai pu en PHP (notre application elle-même est en PHP, je m'y connais mieux qu'en Python). Je ne suis pas un bon codeur, donc je ne vous montrerai pas mon code :)

Le bot vit sur notre réseau d'entreprise et a accès à certains projets, notamment aux bases de données cibles. Afin de ne pas me soucier des paramètres de l'équipe ou du menu, j'ai ajouté cette fonctionnalité au chat de groupe avec des notifications de surveillance. De cette façon, le robot sait immédiatement à partir de quelle base de données collecter le rapport.

Ayant reçu une commande comme /awr SUBST, où N est le nombre d'heures complètes pour lesquelles un rapport est nécessaire (par défaut - 1 heure), même pendant une semaine, si la base de données n'a pas été redémarrée, le bot commence immédiatement à travailler, récupère le rapport, le publie sous forme de page Web et fournit immédiatement (presque là) un lien vers le rapport indispensable.

Suivez le lien et le voici, le rapport AWR :

Nous économisons du temps, des nerfs et des heures de travail

Comme prévu, les développeurs ont géré cette génération de rapports et certains nous ont même remerciés.

Ayant apprécié la commodité de l'équipe, les chefs de projet d'autres régions souhaitaient la même chose, car ils tirent le meilleur parti du client et s'inquiètent des performances et de la disponibilité des systèmes. J'ai ajouté le bot à d'autres discussions. Ils l'utilisent toujours et j'en suis content.

Plus tard, des collègues du CIT ont découvert comment nous collections les rapports et ont voulu le faire également. Je ne les ai pas ajoutés à nos chats, j'ai créé un chat séparé avec génération de rapports selon un planning et sur demande.

/pgBadger

Nous avons également d'autres applications en PHP en collaboration avec PostgreSQL. J'ai implémenté la collecte de rapports pgBadger pour ceux qui en ont besoin en utilisant le même principe : dans des discussions de groupe. Au début, ils l’ont utilisé, puis ils ont arrêté. La fonctionnalité a été supprimée car inutile.

/devoir

Notre service a des équipes de nuit et, par conséquent, a un horaire. C'est dans Google Sheets. Ce n'est pas toujours pratique de chercher un lien, d'ouvrir un graphique, de chercher par soi-même... Un de mes anciens collègues a également joué avec son bot Telegram et l'a introduit dans le chat de notre service notifications du début du quart de travail pour les employés du service. Le robot analyse l'horaire, détermine la personne de service à la date du jour et, selon l'horaire ou sur demande, signale qui est de service aujourd'hui. Cela s'est avéré génial et pratique. C’est vrai, je n’ai pas vraiment aimé le format des messages. De plus, pour les employés d'un autre département (par exemple, BC « Médecine »), les informations sur les personnes de service dans d'autres directions ne sont pas vraiment nécessaires, mais vous devez savoir qui est de service dans « Médecine » en cas de problème. J'ai décidé d'emprunter la fonctionnalité, mais de changer ce qui ne me plaisait pas. J'ai créé un format de message pratique pour moi et pour les autres, en supprimant les informations inutiles.

/tnls

Après avoir essayé l’automatisation à l’aide d’un bot Telegram, de nombreuses idées différentes sont apparues, mais je voulais faire des choses strictement nécessaires. J'ai décidé de diriger statistiques sur les demandes. Pour accéder aux projets de nos clients, nous avons mis en place ce que l’on appelle un « jump server » ou serveur de transfert. Les connexions VPN y sont établies, puis les ports d'application, bases de données et autres redirections auxiliaires sont redirigés vers notre réseau local via ssh, pour un accès facile aux projets de nos collaborateurs, sans problèmes de connexions VPN. Tout ce que vous avez à faire est de configurer une connexion VPN à notre réseau d'entreprise.

Les statistiques de requêtes ont montré que souvent, après une panne d'un des tunnels (en cas de problèmes de réseau, dus à un timeout par exemple), des personnes nous contactent pour restaurer l'accès au projet. Dans la plupart des cas, il suffit de redémarrer la connexion et tout va bien. Faisons-le vous-même. Voici la commande :
Nous économisons du temps, des nerfs et des heures de travail

Vous « tombez » sur l'élément de menu souhaité, sélectionnez votre projet, attendez une minute et tout le monde est heureux et satisfait...

Dès réception d'une commande, avec un léger mouvement des octets et des bits, le bot se connecte au serveur de transfert, sachant à l'avance quel transfert doit être redémarré, et fait son travail - rétablit la connexion au projet. J'ai écrit des instructions afin que vous puissiez résoudre ces problèmes vous-même. Et les gens nous contactaient uniquement si l'outil fourni ne fonctionnait pas...

/ecp_to_pem

D'autres statistiques ont montré qu'il est souvent nécessaire de convertir EDS Crypto Pro au format pem(Base64) pour diverses intégrations, et nous en avons beaucoup. Tâche : prenez un conteneur, copiez-le sur un ordinateur Windows avec l'utilitaire P12FromGostCSP installé (payant, d'ailleurs), convertissez-le en pfx, puis convertissez-le en utilisant OpenSSL (avec prise en charge du cryptage GOST) en pem. Ce n’est pas très pratique, mais vous le voulez en un claquement de doigts.

Google est encore une fois venu à la rescousse. Trouvé l'utilité d'une personne gentille. Je l'ai assemblé comme écrit dans le README - cela a fonctionné. J'ai appris au bot à travailler avec l'utilitaire et j'ai obtenu une conversion presque instantanée.
Nous économisons du temps, des nerfs et des heures de travail

Au moment de la mise en œuvre finale, une ordonnance a été émise pour passer à un nouveau format de cryptage - gost-2012. Pour autant que je me souvienne, l'utilitaire ne fonctionnait à ce moment-là qu'avec l'ancien GOST (2001), c'était peut-être un autre utilitaire similaire d'une autre personne aimable, je ne me souviens pas exactement.
Après la transition vers le nouveau GOST, la fonctionnalité du bot a été supprimée pour des raisons de sécurité. Je l'ai implémenté dans un conteneur Docker.

Dockerfile, au cas où quelqu'un en aurait besoin :

FROM ubuntu:16.04                                                                                                                                                                        
RUN apt update && apt -y install git sudo wget unzip gcc g++ make &&                        
   cd /srv/ && git clone https://github.com/kov-serg/get-cpcert.git &&                     
   cd get-cpcert && chmod +x *.sh && ./prepare.sh && ./build.sh &&                         
   mkdir -p /srv/{in,out} &&                                                               
   echo '#!/bin/bash' > /srv/getpem.sh &&                                                  
   echo 'cd /srv/get-cpcert' >> /srv/getpem.sh &&                                          
   echo './get-cpcert /srv/in/$CONT.000 $PASS > /srv/out/$CONT.pem' >> /srv/getpem.sh &&   
   chmod +x /srv/getpem.sh                                                                  ENTRYPOINT /srv/getpem.sh

Pour convertir, vous devez placer le conteneur d'origine (répertoire comme xxx.000) dans le répertoire /srv/in et transférer le pem fini dans /srv/out.

Convertir:

 docker run -t -i -e CONT='<имя директории с контейнером(без ".000")>' -e PASS='<пароль для контейнера>' -v /srv/in:/srv/in -v /srv/out:/srv/out --name ecptopem <адрес нашего репозитория>/med/ecptopem:latest 

/emstop et /emstart

Un jour, un DBA Oracle très cool, avec beaucoup d'expérience dans l'administration et le développement de SGBD, a trouvé un emploi dans notre entreprise. Et il a immédiatement eu du mal à se connecter aux serveurs du SGBD avec ssh : il ne sait pas où ni comment se connecter, l’accès n’est pas clairement décrit ou encore il ne peut pas se transmettre quelque chose dont il a besoin. Eh bien, nous sommes heureux de vous aider, nous lui avons expliqué comment se connecter et lui avons transmis Enterprise Manager. Mais les choses ne fonctionnaient toujours pas avec ssh. Un de mes collègues l'a expliqué simplement : un DBA pur sang :) Nous avons décidé que si nous devions modifier quelque chose sur le serveur, nous le ferions nous-mêmes.

EM plante parfois sous une charge importante, et pour le redémarrer... vous devez vous connecter via ssh et redémarrer via le terminal. « Les administrateurs sont bons dans ce domaine », a décidé notre nouveau collègue. Les lourdes charges sur le SGBD ne sont pas rares pour nous, et les demandes de redémarrage d'EM sont également courantes. Puis le même scénario : tension, irritation et recherche d'une solution au problème. Ainsi, dans les mêmes discussions de groupe, les commandes suivantes sont apparues : /emstop et /emstart.

Nous économisons du temps, des nerfs et des heures de travail

/tuer

S'il existe une forte concurrence sur la base de données, et cela arrive parfois, il est nécessaire de décharger rapidement la base de données. Le moyen le plus rapide est de tuer le processus problématique... Pour ce faire, connectez-vous via ssh, kill -9... Le bot vous aidera !

Nous économisons du temps, des nerfs et des heures de travail

Alexey a apprécié l'équipe et lui a donné un nom affectueux - "Kilyalka" ou une arme à feu.
Un jour, après avoir observé comment Alexey essayait et souffrait, en entrant /kill xxx à chaque fois pour chacun des processus, j'ai décidé d'ajouter « multi-canon » à notre arme :

Nous économisons du temps, des nerfs et des heures de travail

C'est mieux! Tout est pour toi, Alexey, travaille juste, mon cher !

Naturellement, une équipe aussi importante était limitée accès par user_id - « infaillible ». Voyant comment Lesha tue habilement les processus sur le serveur de base de données, plusieurs personnes ont essayé de saisir une commande avec un numéro de processus aléatoire, mais vous ne pouvez pas tromper mon robot intelligent, il a immédiatement refusé.

/journal d'alerte

Bon, juste au cas où, j'ai fait la commande :
/alertlog <nombre de lignes> - obtenir le nombre spécifié de lignes de journal d'alerte
Le bot extrait un journal d'alerte et l'envoie à notre service, comme Pastebin, appelé pyste, et envoie un lien vers le collage au chat de demande.

/chèques

Vint ensuite une demande de surveiller les performances réelles de notre application. Jusqu'à présent, le support technique du projet collectait ces données manuellement. Peu importe! Nos vaillants testeurs ont développé des cas de test à cet effet. Le journal de test obtenu n'est pas très pratique à lire, un utilisateur inexpérimenté mettra beaucoup de temps à comprendre et n'est pas sûr de mettre en évidence les informations nécessaires. Et nous n’aimons pas faire avec nos mains ce que nous ne pouvons pas faire avec nos mains… Une nouvelle tâche pour le bot !

Nous économisons du temps, des nerfs et des heures de travail

La commande /checks affiche un menu simple et sans ambiguïté ; cette fois, nos gars ont appris à utiliser cette commande sans instructions !

Lorsque vous sélectionnez l'élément souhaité, au lieu d'un menu, une notification concernant le début du test apparaît, afin que les utilisateurs impatients n'exécutent pas notre test 100500 XNUMX fois :

Nous économisons du temps, des nerfs et des heures de travail

En fonction de l'élément de menu sélectionné, un test spécifique est lancé depuis notre réseau, à savoir depuis la machine où réside le bot (jmeter y est préconfiguré, les tests nécessaires se trouvent...) ou directement depuis le data center (depuis un machine préparée à côté de l'application), afin d'exclure les connexions réseau lors des tests de retards, ou de les réduire au minimum.

Après avoir terminé le test et reçu le journal, le bot l’analyse et produit le résultat sous une forme « lisible par l’homme » :

Nous économisons du temps, des nerfs et des heures de travail

Collecte de métriques

La fonctionnalité est arrivée et les chefs de projet intéressés ont reçu une telle fonction pour leurs régions. Et un chef de projet compatissant a déclaré : « Je veux avoir des statistiques de temps ! » Quelqu'un du CIT lui a dit qu'il serait pratique de surveiller tout cela dans Zabbix. Zabbix, alors Zabbix...

Je pensais que je devais me préparer à la nécessité de reproduire la solution... J'ai mis l'idée dans un conteneur Docker. Dans le conteneur, jmeter est lancé selon un planning (une fois toutes les 10 minutes), place le journal à un certain endroit, php l'analyse et affiche les données nécessaires sous la forme d'une page Web. Zabbix, à l'aide de la clé web.page.get, reçoit cette page, sélectionne régulièrement les données nécessaires pour certains éléments dépendants et construit un graphique.

Nous économisons du temps, des nerfs et des heures de travail

Je pense que ça s'est pas mal passé. En observant le graphique, nous voyons d'abord la vitesse approximative de l'application, et si des pics sont détectés sur le graphique, nous savons approximativement où se trouve le « bouchon ». C'est simple. Jusqu'à présent, il s'est avéré qu'il n'était demandé que dans une seule région, mais je suis prêt à le reproduire pour ceux qui sont intéressés.

Développement d'applications

Les statistiques sur des tâches similaires ont récemment donné naissance à davantage d'idées pour simplifier et faciliter le travail. Sur certains projets, sur les serveurs d'applications, il est nécessaire d'installer des conteneurs clés Crypto Pro, ils sont nombreux, et la signature numérique expire avec le temps. Parfois, 2 tâches arrivent par jour. Mais j'ai considéré qu'il était dangereux d'utiliser un bot à ces fins et j'ai décidé de créer la fonctionnalité directement dans l'application. Naturellement avec autorisation et vérification des droits d'accès. Si vous disposez des privilèges nécessaires, un élément de menu supplémentaire sera disponible pour travailler avec les signatures numériques, l'installation, la suppression, l'affichage des informations, etc. La fonctionnalité est actuellement en cours de développement. Il s'est avéré que ce n'est pas très difficile, il vous suffit de lire un peu les instructions existantes, de regarder des exemples de code, de demander à des collègues plus expérimentés en développement, puis de le faire. Au cours du processus de recherche, des idées ont émergé et ont été ajoutées à la candidature. Je ne ferai pas de projets napoléoniens - il y a du développement, que chacun s'occupe de ses affaires. Mais même si c’est intéressant, je le fais moi-même.

Plans

Comme je l'ai dit, de nombreuses idées différentes sont nées pour utiliser notre bot et pas seulement - en général, disons, des idées de "points d'automatisation", beaucoup d'entre elles ont été oubliées, car je n'ai pas eu le temps de les écrire. Maintenant, j'essaie d'écrire tout ce qui me vient à l'esprit et je recommande aux autres de faire de même.

Mais Alexey n'oublie pas de faire part de ses vœux. Du dernier :
/kill_sql ID_SQL — tue toutes les sessions avec cette requête SQL_ID
/kill_block - tuer la session de blocage root
/Montre lui — montrer une image de la performance EM
C'est un gars rusé, il veut coudre DBA depuis son téléphone =)

C'est ainsi que nous travaillons pour le bien de la Patrie !

Comment se débarrasser des tâches routinières et sans intérêt ?

J'espère que la lecture s'est avérée intéressante, et peut-être même utile à quelqu'un, et que je n'ai pas eu le temps d'ennuyer le lecteur... Bonne chance à nous tous.

Source: habr.com

Ajouter un commentaire