{"id":34841,"date":"2019-10-31T22:00:43","date_gmt":"2019-10-31T19:00:43","guid":{"rendered":"https:\/\/prohoster.info\/blog\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\/"},"modified":"2019-10-31T22:00:43","modified_gmt":"2019-10-31T19:00:43","slug":"avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automatisation du remplacement des disques avec Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBonjour \u00e0 tous. Je suis administrateur syst\u00e8me senior chez OK et je suis responsable du bon fonctionnement du portail. Je souhaite expliquer comment nous avons mis en place un processus de remplacement automatique des disques, puis comment nous avons \u00e9limin\u00e9 l'intervention de l'administrateur de ce processus en le rempla\u00e7ant par un bot.<\/p>\n<p>Cet article est une sorte de translit\u00e9ration <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">de la pr\u00e9sentation<\/a><\/noindex> \u00e0 HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mise en place du processus de remplacement des disques<\/h2>\n<p><\/p>\n<h3>D'abord, quelques chiffres<\/h3>\n<p>\nOK est un service g\u00e9ant utilis\u00e9 par des millions de personnes. Il est g\u00e9r\u00e9 par environ 7000 serveurs situ\u00e9s dans 4 centres de donn\u00e9es diff\u00e9rents. Les serveurs contiennent plus de 70 000 disques. Si on les empile, on obtient une tour de plus d'un kilom\u00e8tre de haut. <\/p>\n<p>Les disques durs sont le composant du serveur qui tombe le plus souvent en panne. \u00c0 ce niveau, nous devons remplacer environ 30 disques par semaine, et cette proc\u00e9dure est devenue une routine assez d\u00e9sagr\u00e9able.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Incidents<\/h3>\n<p>\nDans notre entreprise, un syst\u00e8me complet de gestion des incidents a \u00e9t\u00e9 mis en place. Chaque incident est enregistr\u00e9 dans Jira, puis r\u00e9solu et analys\u00e9. Si un incident a eu un impact sur les utilisateurs, nous nous r\u00e9unissons forc\u00e9ment pour r\u00e9fl\u00e9chir \u00e0 la mani\u00e8re de r\u00e9agir plus rapidement dans de tels cas, de minimiser l'impact et bien s\u00fbr de pr\u00e9venir toute r\u00e9currence.<\/p>\n<p>Les unit\u00e9s de stockage ne font pas exception. Leur \u00e9tat est surveill\u00e9 par Zabbix. Nous surveillons les messages dans Syslog pour d\u00e9tecter les erreurs d'\u00e9criture\/lecture, analysons l'\u00e9tat des RAID HW\/SW, et surveillons les informations SMART, en calculant l'usure pour les SSD. <\/p>\n<h3>Comment les disques \u00e9taient remplac\u00e9s auparavant<\/h3>\n<p>\nLorsque Zabbix d\u00e9clenche un certain avertissement, un incident est cr\u00e9\u00e9 dans Jira et attribu\u00e9 automatiquement aux ing\u00e9nieurs concern\u00e9s dans les centres de donn\u00e9es. Nous faisons cela pour tous les incidents mat\u00e9riels, c'est-\u00e0-dire ceux qui n\u00e9cessitent un travail physique sur l'\u00e9quipement dans le centre de donn\u00e9es. <br \/>\nL'ing\u00e9nieur du centre de donn\u00e9es est la personne qui s'occupe des probl\u00e8mes li\u00e9s au mat\u00e9riel, responsable de l'installation, de la maintenance et du d\u00e9montage des serveurs. D\u00e8s qu'il re\u00e7oit un ticket, l'ing\u00e9nieur commence \u00e0 travailler. Dans les baies de disques, il remplace les disques lui-m\u00eame. Mais s'il n'a pas acc\u00e8s \u00e0 l'appareil n\u00e9cessaire, l'ing\u00e9nieur demande de l'aide aux administrateurs syst\u00e8mes de garde. Dans un premier temps, il faut retirer le disque de la rotation. Pour cela, des modifications doivent \u00eatre apport\u00e9es au serveur, arr\u00eater les applications et d\u00e9monter le disque.<\/p>\n<p>L'administrateur syst\u00e8me de garde est responsable du bon fonctionnement de l'ensemble du portail pendant son service. Il enqu\u00eate sur les incidents, effectue des r\u00e9parations et aide les d\u00e9veloppeurs \u00e0 accomplir de petites t\u00e2ches. Il ne s'occupe pas uniquement des disques durs.<\/p>\n<p>Auparavant, les ing\u00e9nieurs des centres de donn\u00e9es communiquaient avec l'administrateur syst\u00e8me via un chat. Les ing\u00e9nieurs envoyaient des liens vers des tickets Jira, l'administrateur les consultait et tenait un journal des travaux dans un bloc-notes. Mais pour ce genre de t\u00e2ches, les chats sont peu pratiques : l'information y est non structur\u00e9e et se perd rapidement. De plus, l'administrateur pouvait simplement s'\u00e9loigner de l'ordinateur et ne pas r\u00e9pondre aux demandes pendant un certain temps, tandis que l'ing\u00e9nieur se tenait devant le serveur avec une pile de disques en attendant.<\/p>\n<p>Mais le pire, c'est que les administrateurs ne voyaient pas l'ensemble de la situation : quels incidents de disque existaient, o\u00f9 des probl\u00e8mes pourraient potentiellement survenir. Cela s'explique par le fait que nous confions tous les incidents HW aux ing\u00e9nieurs. Oui, il \u00e9tait possible d'afficher tous les incidents sur le tableau de bord de l'administrateur. Mais il y en avait tellement, et l'administrateur n'\u00e9tait impliqu\u00e9 que pour certains d'entre eux.<\/p>\n<p>De plus, l'ing\u00e9nieur ne pouvait pas correctement \u00e9tablir des priorit\u00e9s, car il ne savait rien sur la destination pr\u00e9cise des serveurs, ni sur la r\u00e9partition des informations sur les supports.<\/p>\n<h3>Nouvelle proc\u00e9dure de remplacement<\/h3>\n<p>\nLa premi\u00e8re chose que nous avons faite, c'est de cr\u00e9er un nouveau type d'incident pour les disques, \u00ab HW-disk \u00bb, et d'y ajouter des champs \u00ab nom du p\u00e9riph\u00e9rique de bloc \u00bb, \u00ab taille \u00bb et \u00ab type de disque \u00bb, afin que cette information soit conserv\u00e9e dans le ticket et que nous n'ayons pas \u00e0 l'\u00e9changer constamment dans le chat. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNous avons \u00e9galement convenu que dans le cadre d'un seul incident, nous ne remplacerions qu'un seul disque. Cela a consid\u00e9rablement simplifi\u00e9 le processus d'automatisation, la collecte de statistiques et le travail par la suite. <\/p>\n<p>En plus de cela, nous avons ajout\u00e9 un champ \u00ab administrateur responsable \u00bb. L'administrateur de garde y est automatiquement d\u00e9sign\u00e9. C'est tr\u00e8s pratique, car l'ing\u00e9nieur voit toujours qui est responsable. Il n'est pas n\u00e9cessaire d'aller dans le calendrier pour chercher. C'est ce champ qui a permis de mettre en avant sur le tableau de bord de l'administrateur les tickets pour lesquels son aide pourrait \u00eatre n\u00e9cessaire.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPour que tous les participants tirent le maximum de b\u00e9n\u00e9fices des innovations, nous avons cr\u00e9\u00e9 des filtres et des tableaux de bord, et en avons parl\u00e9 aux \u00e9quipes. Lorsque les gens comprennent les changements, ils ne s'en \u00e9loignent pas comme d'une chose inutile. Il est important pour l'ing\u00e9nieur de conna\u00eetre le num\u00e9ro de rack o\u00f9 se trouve le serveur, la taille et le type de disque. L'administrateur doit, avant tout, comprendre ce qu'est ce groupe de serveurs et quel pourrait \u00eatre l'effet d'un remplacement de disque.<\/p>\n<p>Avoir des champs et leur affichage est pratique, mais cela ne nous a pas lib\u00e9r\u00e9s de la n\u00e9cessit\u00e9 d'utiliser des chats. Nous avons d\u00fb changer le flux de travail pour cela. <\/p>\n<p>Auparavant, il \u00e9tait comme \u00e7a :<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAujourd'hui, c'est ainsi que continuent de travailler les ing\u00e9nieurs lorsqu'ils n'ont pas besoin de l'aide de l'administrateur.<\/p>\n<p>La premi\u00e8re chose que nous avons faite est d'avoir introduit un nouveau statut <b>Investigate<\/b>. Ce statut est celui dans lequel le ticket est situ\u00e9 lorsque l'ing\u00e9nieur n'a pas encore d\u00e9cid\u00e9 s'il aura besoin d'un administrateur ou non. \u00c0 travers ce statut, l'ing\u00e9nieur peut transmettre le ticket \u00e0 l'administrateur. De plus, nous marquons les tickets dans ce statut lorsque le remplacement du disque est n\u00e9cessaire, mais que le disque lui-m\u00eame n'est pas disponible sur le site. Cela peut se produire dans le cas de CDN et de sites distants.<\/p>\n<p>Nous avons \u00e9galement ajout\u00e9 le statut <b>Pr\u00eat<\/b>. Le ticket passe \u00e0 ce statut apr\u00e8s le remplacement du disque. Cela signifie que tout est d\u00e9j\u00e0 fait, mais le HW\/SW RAID sur le serveur est en cours de synchronisation. Cela peut prendre assez de temps.<\/p>\n<p>Si un administrateur est impliqu\u00e9 dans le travail, le sch\u00e9ma devient un peu plus compliqu\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c0 partir du statut <b>Ouvrir<\/b> , le ticket peut \u00eatre transf\u00e9r\u00e9 \u00e0 la fois par l'administrateur syst\u00e8me et par l'ing\u00e9nieur. Dans le statut <b>In progress<\/b> , l'administrateur retire le disque de la rotation pour que l'ing\u00e9nieur puisse simplement le retirer : il active le voyant, d\u00e9monte le disque, arr\u00eate les applications, en fonction du groupe de serveurs sp\u00e9cifique.<\/p>\n<p>Ensuite, le ticket est transf\u00e9r\u00e9 \u00e0 <b>Ready to change<\/b>: c'est un signal pour l'ing\u00e9nieur qu'il peut retirer le disque. Tous les champs dans Jira sont d\u00e9j\u00e0 remplis, l'ing\u00e9nieur sait quel type et quelle taille de disque sont n\u00e9cessaires. Ces donn\u00e9es sont renseign\u00e9es soit automatiquement dans le statut pr\u00e9c\u00e9dent, soit par l'administrateur.<\/p>\n<p>Apr\u00e8s le remplacement du disque, le ticket est transf\u00e9r\u00e9 au statut <b>Changed<\/b>. On v\u00e9rifie que le disque appropri\u00e9 a \u00e9t\u00e9 ins\u00e9r\u00e9, une sch\u00e9matisation est effectu\u00e9e, l'application est lanc\u00e9e et certaines t\u00e2ches de r\u00e9cup\u00e9ration de donn\u00e9es sont r\u00e9alis\u00e9es. Le ticket peut \u00e9galement \u00eatre transf\u00e9r\u00e9 au statut <b>Pr\u00eat<\/b>, dans ce cas, l'administrateur reste responsable, car c'est lui qui a mis le disque dans la rotation. Le sch\u00e9ma complet ressemble \u00e0 cela.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nL'ajout de nouveaux champs a consid\u00e9rablement simplifi\u00e9 notre travail. Les \u00e9quipes commencent \u00e0 travailler avec des informations structur\u00e9es, il est devenu clair ce qui doit \u00eatre fait et \u00e0 quelle \u00e9tape. Les priorit\u00e9s sont devenues beaucoup plus pertinentes, car maintenant elles sont d\u00e9finies par l'administrateur.<\/p>\n<p>Nous n'avons plus besoin de discuter dans les chats. Bien s\u00fbr, l'administrateur peut envoyer un message \u00e0 l'ing\u00e9nieur en disant \"il faut remplacer plus rapidement ici\", ou \"c'est d\u00e9j\u00e0 le soir, vas-tu pouvoir remplacer ?\". Mais nous ne discutons plus quotidiennement dans les chats \u00e0 ce sujet.<\/p>\n<p>Les disques sont d\u00e9sormais remplac\u00e9s par lots. Si l'administrateur arrive un peu plus t\u00f4t au travail et qu'il a du temps libre, et qu'aucun incident ne s'est produit, il peut pr\u00e9parer plusieurs serveurs pour le remplacement : marquer les champs, retirer les disques de la rotation et passer la t\u00e2che \u00e0 l'ing\u00e9nieur. Plus tard, l'ing\u00e9nieur arrive au centre de donn\u00e9es, voit la t\u00e2che, prend les disques n\u00e9cessaires dans le stock et les remplace imm\u00e9diatement. En cons\u00e9quence, la vitesse de remplacement a augment\u00e9.<\/p>\n<h3>L'exp\u00e9rience acquise lors de la construction du Workflow<\/h3>\n<p><\/p>\n<ul>\n<li><b>Lors de l'\u00e9tablissement de la proc\u00e9dure, il est n\u00e9cessaire de collecter des informations provenant de diff\u00e9rentes sources.<\/b><br \/>\nCertains de nos administrateurs ne savaient pas que les ing\u00e9nieurs remplacent les disques eux-m\u00eames. Certains pensaient que la synchronisation du RAID MD \u00e9tait surveill\u00e9e par les ing\u00e9nieurs, bien que certains d'entre eux n'avaient m\u00eame pas acc\u00e8s \u00e0 cela. Certains ing\u00e9nieurs principaux le faisaient, mais pas toujours, car le processus n'\u00e9tait d\u00e9crit nulle part.<\/li>\n<li><b>La proc\u00e9dure doit \u00eatre simple et compr\u00e9hensible.<\/b><br \/>\nIl est difficile pour une personne de garder \u00e0 l'esprit de nombreuses \u00e9tapes. Les statuts les plus importants dans Jira doivent \u00eatre affich\u00e9s sur l'\u00e9cran principal. On peut les renommer, par exemple, \"In progress\" peut \u00eatre appel\u00e9 \"Pr\u00eat \u00e0 changer\". Les autres statuts peuvent \u00eatre cach\u00e9s dans un menu d\u00e9roulant pour ne pas \u00eatre visibles. Mais il est pr\u00e9f\u00e9rable de ne pas restreindre les gens, de leur donner la possibilit\u00e9 de faire la transition.<br \/>\nExpliquez la valeur des innovations. Lorsque les gens comprennent, ils acceptent mieux la nouvelle proc\u00e9dure. Il \u00e9tait tr\u00e8s important pour nous que les gens ne cliquent pas sur tout le processus, mais le suivent. Ensuite, nous avons construit l'automatisation sur cette base.<\/li>\n<li><b>Attendre, analyser, comprendre.<\/b><br \/>\nNous avons mis environ un mois \u00e0 \u00e9tablir la proc\u00e9dure, la mise en \u0153uvre technique, les r\u00e9unions et les discussions. Et pour l'impl\u00e9mentation, cela a pris plus de trois mois. J'ai vu comment les gens commencent progressivement \u00e0 utiliser cette innovation. Au d\u00e9but, il y avait beaucoup de n\u00e9gativit\u00e9. Mais cela ne d\u00e9pendait pas du tout de la proc\u00e9dure elle-m\u00eame, ni de sa mise en \u0153uvre technique. Par exemple, un administrateur utilisait non pas Jira, mais un plugin Jira dans Confluence, et certaines fonctionnalit\u00e9s lui \u00e9taient donc inaccessibles. Nous lui avons montr\u00e9 Jira, ce qui a augment\u00e9 sa productivit\u00e9 tant sur les t\u00e2ches g\u00e9n\u00e9rales que sur les remplacements de disques.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automatisation du remplacement des disques<\/h2>\n<p>\nNous avons abord\u00e9 l'automatisation du remplacement des disques plusieurs fois. Nous avions d\u00e9j\u00e0 des d\u00e9veloppements et des scripts, mais ils fonctionnaient soit en mode interactif, soit en mode manuel, n\u00e9cessitant un d\u00e9marrage. Ce n'est qu'apr\u00e8s l'impl\u00e9mentation de la nouvelle proc\u00e9dure que nous avons compris qu'elle nous manquait vraiment.<\/p>\n<p>Avec le processus de remplacement d\u00e9sormais divis\u00e9 en \u00e9tapes, chacune ayant un responsable et une liste d'actions, nous pouvons introduire l'automatisation \u00e9tape par \u00e9tape, et non pas en une seule fois. Par exemple, la premi\u00e8re \u00e9tape la plus simple \u2014 Ready (v\u00e9rification de la synchronisation RAID\/donn\u00e9es) \u2014 peut \u00eatre facilement d\u00e9l\u00e9gu\u00e9e \u00e0 un bot. Une fois que le bot sera un peu form\u00e9, nous pourrons lui confier des t\u00e2ches plus importantes \u2014 l'introduction du disque en rotation, etc.<\/p>\n<h3>Zoo des configurations<\/h3>\n<p>\nAvant de parler du bot, faisons un petit tour d'horizon de notre zoo d'installations. Tout d'abord, cela est d\u00fb \u00e0 la taille gigantesque de notre infrastructure. Deuxi\u00e8mement, pour chaque service, nous essayons de choisir la configuration mat\u00e9rielle optimale. Nous avons environ 20 mod\u00e8les de RAID mat\u00e9riels, principalement LSI et Adaptec, mais on trouve \u00e9galement des mod\u00e8les HP et DELL de diff\u00e9rentes versions. Chaque contr\u00f4leur RAID a sa propre utilit\u00e9 de gestion. L'ensemble des commandes et leur sortie peuvent varier de version en version pour chaque contr\u00f4leur RAID. L\u00e0 o\u00f9 le HW-RAID n'est pas utilis\u00e9, il peut y avoir du mdraid.<\/p>\n<p>Pratiquement toutes les nouvelles installations sont faites sans redondance de disque. Nous essayons de ne plus utiliser de RAID mat\u00e9riels ou logiciels, car nous sauvegardons nos syst\u00e8mes au niveau des centres de donn\u00e9es, et non des serveurs. Mais bien s\u00fbr, il y a beaucoup de serveurs h\u00e9rit\u00e9s qui doivent \u00eatre pris en charge.<\/p>\n<p>Dans certains cas, les disques dans les contr\u00f4leurs RAID sont connect\u00e9s en tant que dispositifs bruts, tandis que dans d'autres, le JBOD est utilis\u00e9. Il existe des configurations avec un seul disque syst\u00e8me dans le serveur, et lorsque celui-ci doit \u00eatre remplac\u00e9, il est n\u00e9cessaire de red\u00e9ployer le serveur en installant le syst\u00e8me d'exploitation et les applications, et ce avec les m\u00eames versions. Ensuite, il faut rajouter les fichiers de configuration et lancer les applications. De plus, il y a de nombreux groupes de serveurs o\u00f9 la redondance est effectu\u00e9e non pas au niveau du syst\u00e8me de disques, mais directement dans les applications elles-m\u00eames.<\/p>\n<p>En tout, nous avons plus de 400 groupes uniques de serveurs, sur lesquels s'ex\u00e9cutent environ 100 applications diff\u00e9rentes. Pour couvrir un si grand nombre de variantes, nous avions besoin d'un outil d'automatisation multifonctionnel. Id\u00e9alement, avec un DSL simple, afin que m\u00eame quelqu'un qui ne l'a pas \u00e9crit puisse l'utiliser.<\/p>\n<p>Nous avons choisi Ansible car il est sans agent : aucune pr\u00e9paration d'infrastructure n'\u00e9tait n\u00e9cessaire, ce qui permet un d\u00e9marrage rapide. De plus, il est \u00e9crit en Python, qui est devenu le standard dans l'\u00e9quipe.<\/p>\n<h3>Sch\u00e9ma g\u00e9n\u00e9ral<\/h3>\n<p>\nExaminons le sch\u00e9ma g\u00e9n\u00e9ral d'automatisation \u00e0 travers l'exemple d'un incident. Zabbix d\u00e9tecte qu'un disque sdb est d\u00e9faillant, un d\u00e9clencheur s'active et un ticket est cr\u00e9\u00e9 dans Jira. L'administrateur le consulte, comprend qu'il ne s'agit ni d'un doublon ni d'un faux positif, et qu'il faut changer le disque, et il fait passer le ticket \u00e0 l'\u00e9tat \"En cours\".<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nL'application DiskoBot, \u00e9crite en Python, interroge p\u00e9riodiquement Jira \u00e0 la recherche de nouveaux tickets. Elle remarque qu'un nouveau ticket 'En cours' est apparu, un thread correspondant s'active et lance un playbook dans Ansible (cette op\u00e9ration est r\u00e9alis\u00e9e pour chaque statut dans Jira). Dans ce cas, le playbook Prepare2change est lanc\u00e9.<\/p>\n<p>Ansible se connecte \u00e0 l'h\u00f4te, retire le disque de la rotation et rapporte le statut \u00e0 l'application via des callbacks. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSuite aux r\u00e9sultats, le bot change automatiquement le ticket en \"Pr\u00eat \u00e0 changer\". L'ing\u00e9nieur re\u00e7oit une notification et se rend au remplacement du disque, puis passe le ticket \u00e0 l'\u00e9tat \"Chang\u00e9\". <\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelon le sch\u00e9ma d\u00e9crit ci-dessus, le ticket revient au bot, qui lance un autre playbook, acc\u00e8de \u00e0 l'h\u00f4te et r\u00e9introduit le disque dans la rotation. Le bot ferme le ticket. Hourra !<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nParlons maintenant de certains composants du syst\u00e8me.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nCette application est \u00e9crite en Python. Elle s\u00e9lectionne les tickets de Jira selon le JQL. En fonction du statut du ticket, ce dernier est dirig\u00e9 vers le gestionnaire appropri\u00e9, qui \u00e0 son tour lance le playbook Ansible correspondant au statut.<\/p>\n<p>Le JQL et les intervalles d'interrogation sont d\u00e9finis dans le fichier de configuration de l'application.<\/p>\n<pre><code class=\"plaintext\">jira_states:\n  investigate:\n    jql: '\u2026 status = Open and \"Disk Size\" is EMPTY'\n    interval: 180\n\n  inprogress:\n    jql: '\u2026  and \"Disk Size\" is not EMPTY and \"Device Name\" is not EMPTY'\n \n  ready:\n    jql: '\u2026 and (labels not in (\"dbot_ignore\") or labels is EMPTY)'\n    interval: 7200\n<\/code><\/pre>\n<p>\nPar exemple, parmi les tickets dans le statut In progress, seuls ceux dont les champs Disk size et Device name sont remplis sont s\u00e9lectionn\u00e9s. Device name est le nom de l'appareil de stockage n\u00e9cessaire pour ex\u00e9cuter le playbook. Disk size est n\u00e9cessaire pour que l'ing\u00e9nieur sache quelle taille de disque est requise.<\/p>\n<p>De m\u00eame, parmi les tickets avec le statut Ready, ceux ayant le label dbot_ignore sont filtr\u00e9s. D'ailleurs, nous utilisons les labels Jira \u00e0 la fois pour ce genre de filtrage, et pour marquer les tickets en double, ainsi que pour collecter des statistiques.<\/p>\n<p>En cas d'\u00e9chec du playbook, Jira attribue le label dbot_failed, afin que nous puissions examiner cela ult\u00e9rieurement. <\/p>\n<h3>Interaction avec Ansible<\/h3>\n<p>\nL'application interagit avec Ansible via <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Ansible Python API<\/a><\/noindex>. Dans playbook_executor, nous passons le nom du fichier et un ensemble de variables. Cela permet de maintenir le projet Ansible sous forme de fichiers yml ordinaires, plut\u00f4t que de le d\u00e9crire dans du code Python. <\/p>\n<p>\u00c9galement dans Ansible, gr\u00e2ce \u00e0 *extra_vars*, nous faisons passer le nom de l'appareil de stockage, le statut du ticket, ainsi que l'URL de callback, dans laquelle est cach\u00e9e la cl\u00e9 de l'incident \u2014 elle est utilis\u00e9e pour le callback en HTTP.<\/p>\n<p>Pour chaque ex\u00e9cution, un inventaire temporaire est g\u00e9n\u00e9r\u00e9, compos\u00e9 d'un h\u00f4te et d'un groupe auquel cet h\u00f4te appartient, afin que les group_vars soient appliqu\u00e9s.<\/p>\n<p>Voici un exemple de t\u00e2che, dans laquelle le callback HTTP est impl\u00e9ment\u00e9.<\/p>\n<p>Le r\u00e9sultat de l'ex\u00e9cution des playbooks est obtenu gr\u00e2ce \u00e0 des callbacks. Ils sont de deux types :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Ansible callback plugin<\/a><\/noindex>, il fournit des donn\u00e9es sur les r\u00e9sultats de l'ex\u00e9cution du playbook. Il d\u00e9crivit les t\u00e2ches qui ont \u00e9t\u00e9 lanc\u00e9es, ex\u00e9cut\u00e9es avec succ\u00e8s ou \u00e9chou\u00e9es. Ce callback est appel\u00e9 \u00e0 la fin de l'ex\u00e9cution du playbook.<\/li>\n<li>Callback HTTP pour obtenir des informations pendant l'ex\u00e9cution du playbook. Dans la t\u00e2che Ansible, nous effectuons une requ\u00eate POST\/GET vers notre application.<\/li>\n<\/ul>\n<p>\n\u00c0 travers les callbacks HTTP, des variables d\u00e9finies lors de l'ex\u00e9cution du playbook, que nous souhaitons conserver et utiliser lors de futurs lancements, sont transmises. Ces donn\u00e9es sont enregistr\u00e9es dans sqlite.<\/p>\n<p>Nous laissons \u00e9galement des commentaires et modifions le statut du ticket via le callback HTTP.<\/p>\n<p><b class=\"spoiler_title\">Callback HTTP<\/b><\/p>\n<pre><code class=\"plaintext\"># Make callback to Diskobot App\n# Variables:\n#    callback_post_body: # A dict with follow keys. All keys are optional\n#       msg: If exist it would be posted to Jira as comment\n#       data: If exist it would be saved in Incident.variables\n#       desire_state: Set desire_state for incident\n#       status: If exist Proceed issue to that status\n\n  - name: Callback to Diskobot app (jira comment\/status)\n    uri:\n      url: \"{{ callback_url }}\/{{ devname }}\"\n      user: \"{{ diskobot_user }}\"\n      password: \"{{ diskobot_pass }}\"\n      force_basic_auth: True\n      method: POST\n      body: \"{{ callback_post_body | to_json }}\"\n      body_format: json\n    delegate_to: 127.0.0.1\n<\/code><\/pre>\n<p>Comme beaucoup de t\u00e2ches similaires, nous l'avons extrait dans un fichier commun et l'incluons au besoin, afin de ne pas le r\u00e9p\u00e9ter constamment dans les playbooks. Ici, on trouve un callback_url, dans lequel sont int\u00e9gr\u00e9s la cl\u00e9 de l'incident et le nom de l'h\u00f4te. Lorsque Ansible ex\u00e9cute cette requ\u00eate POST, le bot comprend qu'elle fait partie d'un tel incident.<\/p>\n<p>Voici un exemple tir\u00e9 du playbook, o\u00f9 nous avons retir\u00e9 un disque d'un p\u00e9riph\u00e9rique MD :<\/p>\n<pre><code class=\"plaintext\">  # Save mdadm configuration\n  - include: common\/callback.yml\n    vars:\n      callback_post_body:\n        status: 'Ready to change'\n        msg: \"Removed disk from mdraid {{ mdadm_remove_disk.msg | comment_jira }}\"\n        data:\n          mdadm_data: \"{{ mdadm_remove_disk.removed }}\"\n          parted_info: \"{{ parted_info | default() }}\"\n    when:\n      - mdadm_remove_disk | changed\n      - mdadm_remove_disk.removed\n<\/code><\/pre>\n<p>\nCette t\u00e2che change le statut du ticket Jira en \u00ab Pr\u00eat \u00e0 changer \u00bb et ajoute un commentaire. De plus, la variable mdam_data conserve la liste des p\u00e9riph\u00e9riques md dont le disque a \u00e9t\u00e9 retir\u00e9, tandis que parted_info contient un dump de la partition depuis parted. <\/p>\n<p>Lorsque l'ing\u00e9nieur ins\u00e9rera un nouveau disque, nous pourrons utiliser ces variables pour restaurer le dump des partitions et \u00e9galement r\u00e9introduire le disque dans les p\u00e9riph\u00e9riques md d'o\u00f9 il a \u00e9t\u00e9 retir\u00e9.<\/p>\n<h3>Mode de v\u00e9rification Ansible<\/h3>\n<p>\nActiver l'automatisation \u00e9tait intimidant. Nous avons donc d\u00e9cid\u00e9 d'ex\u00e9cuter tous les playbooks en mode <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">dry run<\/a><\/noindex>, dans lequel Ansible n'effectue aucune action sur les serveurs, mais les simule seulement. <\/p>\n<p>Cette ex\u00e9cution passe par un module de callback distinct, et le r\u00e9sultat de l'ex\u00e9cution du playbook est enregistr\u00e9 dans Jira sous forme de commentaire.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTout d'abord, cela a permis de valider le fonctionnement du bot et des playbooks. Deuxi\u00e8mement, cela a accru la confiance des administrateurs envers le bot. <\/p>\n<p>Une fois que nous avons effectu\u00e9 la validation et compris que nous pouvions ex\u00e9cuter Ansible non seulement en mode dry run, nous avons cr\u00e9\u00e9 dans Jira un bouton Ex\u00e9cuter Diskobot pour ex\u00e9cuter le m\u00eame playbook avec les m\u00eames variables sur le m\u00eame h\u00f4te, mais en mode normal. <\/p>\n<p>De plus, le bouton est utilis\u00e9 pour relancer le playbook en cas d'\u00e9chec.<\/p>\n<h3>Structure des Playbooks<\/h3>\n<p>\nJ'ai d\u00e9j\u00e0 mentionn\u00e9 qu'en fonction du statut du ticket Jira, le bot ex\u00e9cute diff\u00e9rents playbooks.<\/p>\n<p>Tout d'abord, cela permet d'organiser beaucoup plus facilement l'entr\u00e9e. <br \/>\nDeuxi\u00e8mement, dans certains cas, c'est tout simplement n\u00e9cessaire. <\/p>\n<p>Par exemple, lors du remplacement d'un disque syst\u00e8me, il faut d'abord aller dans le syst\u00e8me de d\u00e9ploiement, cr\u00e9er une t\u00e2che, et apr\u00e8s un d\u00e9ploiement r\u00e9ussi, le serveur sera accessible par ssh, et il sera possible d'y installer l'application. Si nous devions faire tout cela dans un seul playbook, Ansible ne pourrait pas l'ex\u00e9cuter en raison de l'inaccessibilit\u00e9 de l'h\u00f4te.<\/p>\n<p>Nous utilisons des r\u00f4les Ansible pour chaque groupe de serveurs. On voit ici comment les playbooks sont organis\u00e9s dans l'un d'eux. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nC'est pratique car il est imm\u00e9diatement clair o\u00f9 se trouvent les diff\u00e9rentes t\u00e2ches. Dans le fichier main.yml, qui sert de point d'entr\u00e9e pour le r\u00f4le Ansible, nous pouvons simplement inclure en fonction du statut du ticket ou des t\u00e2ches g\u00e9n\u00e9rales n\u00e9cessaires pour tous, comme le passage par l'identification ou l'obtention d'un jeton.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nLancement pour les tickets ayant le statut Investigation et Open. Le plus important pour ce playbook est le nom du dispositif de stockage. Cette information n'est pas toujours disponible. <\/p>\n<p>Pour l'obtenir, nous analysons le r\u00e9sum\u00e9 Jira, la derni\u00e8re valeur du d\u00e9clencheur Zabbix. Il peut contenir le nom du dispositif de stockage - par chance. Sinon, il peut contenir le point de montage, et dans ce cas, il faut aller sur le serveur, le parser et calculer le disque n\u00e9cessaire. Le d\u00e9clencheur peut \u00e9galement transmettre une adresse scsi ou une autre information. Mais parfois, il n'y a pas d'indices, et nous devons analyser.<\/p>\n<p>Apr\u00e8s avoir identifi\u00e9 le nom du dispositif de stockage, nous collectons des informations sur le type et la taille du disque pour remplir les champs dans Jira. Nous extrayons \u00e9galement les informations sur le fournisseur, le mod\u00e8le, le firmware, l'ID, SMART, et nous ins\u00e9rons tout cela dans le commentaire du ticket Jira. L'administrateur et l'ing\u00e9nieur n'ont d\u00e9sormais plus besoin de chercher ces donn\u00e9es. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nRetrait du disque de la rotation, pr\u00e9paration au remplacement. C'est l'\u00e9tape la plus complexe et la plus critique. C'est ici que l'on peut arr\u00eater une application quand elle ne doit pas l'\u00eatre. Ou retirer un disque qui manquait de r\u00e9plicas, ce qui affecterait les utilisateurs et entra\u00eenerait la perte de donn\u00e9es. Ici, nous avons le plus de v\u00e9rifications et de notifications dans le chat.<\/p>\n<p>Dans le cas le plus simple, il s'agit de retirer un disque d'un RAID HW\/MD. <\/p>\n<p>Dans des situations plus complexes (dans nos syst\u00e8mes de stockage), o\u00f9 la redondance est effectu\u00e9e au niveau de l'application, il est n\u00e9cessaire d'acc\u00e9der \u00e0 l'application via API, de signaler le retrait du disque, de le d\u00e9sactiver et de lancer la restauration.<\/p>\n<p>Nous sommes actuellement en train de migrer massivement vers <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">le cloud<\/a><\/noindex>, et si le serveur est dans le cloud, Diskobot acc\u00e8de \u00e0 l'API du cloud, indique qu'il va travailler avec ce minion - le serveur sur lequel les conteneurs sont en cours d'ex\u00e9cution - et demande \"migre tous les conteneurs de ce minion\". Il active \u00e9galement la mise en surbrillance du disque, afin que l'ing\u00e9nieur voie imm\u00e9diatement lequel il doit retirer.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nApr\u00e8s le remplacement du disque, nous v\u00e9rifions d'abord sa disponibilit\u00e9. <\/p>\n<p>Les ing\u00e9nieurs ne remplacent pas toujours les nouveaux disques, c'est pourquoi nous avons ajout\u00e9 une v\u00e9rification des valeurs SMART qui nous conviennent.<\/p>\n<p><b class=\"spoiler_title\">Quels attributs examinons-nous<\/b>Nombre de secteurs r\u00e9allou\u00e9s (5) &lt; 100<br \/>\nNombre de secteurs en attente actuel (107) == 0<\/p>\n<p>Si le disque ne r\u00e9ussit pas le test, l'ing\u00e9nieur est inform\u00e9 pour un remplacement. Si tout est en ordre, le r\u00e9tro\u00e9clairage s'\u00e9teint, le marquage est appliqu\u00e9 et le disque est mis en rotation.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nLe cas le plus simple: v\u00e9rification de la synchronisation HW\/SW raid ou fin de la synchronisation des donn\u00e9es dans l'application.<\/p>\n<h3>API des applications<\/h3>\n<p>\nJ'ai mentionn\u00e9 plusieurs fois que le bot acc\u00e8de souvent \u00e0 l'API des applications. Bien s\u00fbr, toutes les applications n'avaient pas les m\u00e9thodes n\u00e9cessaires, donc il a fallu les am\u00e9liorer. Voici les m\u00e9thodes les plus importantes que nous utilisons:<\/p>\n<ul>\n<li>Status. Statut du cluster ou du disque pour comprendre s'il peut \u00eatre utilis\u00e9;\n<\/li>\n<li>Start\/stop. Activation et d\u00e9sactivation du disque;\n<\/li>\n<li>Migrate\/restore. Migration et restauration des donn\u00e9es pendant et apr\u00e8s le remplacement.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Le\u00e7ons tir\u00e9es d'Ansible<\/h3>\n<p>\nJ'aime beaucoup Ansible. Mais souvent, lorsque je regarde diff\u00e9rents projets open source et vois comment les gens \u00e9crivent des playbooks, cela me fait un peu peur. Des enchev\u00eatrements logiques compliqu\u00e9s de when\/loop, manque de flexibilit\u00e9 et d'idempotence en raison d'un usage fr\u00e9quent de shell\/command.<\/p>\n<p>Nous avons d\u00e9cid\u00e9 de simplifier au maximum en tirant parti de la modularit\u00e9 d'Ansible. Au plus haut niveau se trouvent les playbooks, qui peuvent \u00eatre \u00e9crits par n'importe quel administrateur ou d\u00e9veloppeur tiers qui conna\u00eet un peu Ansible.<\/p>\n<pre><code class=\"plaintext\">- name: Faites clignoter le disque\n  become: True\n  register: locate_action\n  disk_locate:\n      locate: '{{ locate }}'\n      devname: '{{ devname }}'\n      ids: '{{ locate_ids | default(pd_id) | default(omit) }}'\n<\/code><\/pre>\n<p>Si une certaine logique est difficile \u00e0 r\u00e9aliser dans les playbooks, nous la sortons dans un module ou un filtre Ansible. Les scripts peuvent \u00eatre \u00e9crits en Python ou dans n'importe quel autre langage. <\/p>\n<p>Ils sont faciles et rapides \u00e0 \u00e9crire. Par exemple, le module de clignotement du disque, dont l'exemple d'utilisation est donn\u00e9 ci-dessus, se compose de 265 lignes.<\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAu niveau le plus bas se trouve la biblioth\u00e8que. Pour ce projet, nous avons \u00e9crit une application distincte, une sorte d'abstraction sur les RAID mat\u00e9riels et logiciels, qui effectuent les demandes appropri\u00e9es. <\/p>\n<p><img decoding=\"async\" alt=\"Automatisation du remplacement des disques avec Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes points forts d'Ansible sont sa simplicit\u00e9 et ses playbooks clairs. Je pense qu'il faut en profiter et ne pas g\u00e9n\u00e9rer de terribles fichiers yaml avec une \u00e9norme quantit\u00e9 de conditions, de code shell et de boucles.<\/p>\n<p>Si vous souhaitez reproduire notre exp\u00e9rience avec l'API Ansible, gardez \u00e0 l'esprit deux choses:<\/p>\n<ul>\n<li>Il n'est pas possible de passer un timeout au playbook_executor et au playbook en g\u00e9n\u00e9ral. Il existe un timeout pour les sessions ssh, mais pas pour le playbook. Si nous essayons de d\u00e9monter un disque qui n'existe plus dans le syst\u00e8me, le playbook s'ex\u00e9cutera ind\u00e9finiment, c'est pourquoi nous avons d\u00fb envelopper son lancement dans un wrapper s\u00e9par\u00e9 et le terminer par un timeout.\n<\/li>\n<li>Ansible fonctionne sur la base de processus fork, donc son API n'est pas thread-safe. Nous ex\u00e9cutons tous nos playbooks en mode mono-thread.\n<\/li>\n<\/ul>\n<p>\nEn fin de compte, nous avons r\u00e9ussi \u00e0 automatiser le remplacement d'environ 80 % des disques. En g\u00e9n\u00e9ral, la vitesse de remplacement a doubl\u00e9. Aujourd'hui, l'administrateur se contente de regarder l'incident et de d\u00e9cider s'il faut remplacer le disque ou non, puis il effectue un seul clic.<\/p>\n<p>Mais maintenant, nous commen\u00e7ons \u00e0 rencontrer un autre probl\u00e8me : certains nouveaux administrateurs ne savent pas comment remplacer les disques. \ud83d\ude42<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/odnoklassniki\/blog\/452110\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432\u0435\u0434\u0443\u0449\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u041e\u041a \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0437\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0440\u0442\u0430\u043b\u0430. \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432, \u0430 \u0437\u0430\u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0431\u043e\u0442\u043e\u043c. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 HighLoad+ 2018 \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e \u0437\u0430\u043c\u0435\u043d\u0435 \u0434\u0438\u0441\u043a\u043e\u0432 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26233,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:43+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:43+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Automatisation du remplacement des disques avec Ansible | ProHoster","description":"Bonjour \u00e0 tous.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u0434\u0438\u0441\u043a\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Ansible | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:43+00:00","article:modified_time":"2019-10-31T19:00:43+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34841","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 20:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:14:05","updated":"2026-01-21 20:48:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/34841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}