{"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\/it\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","title":{"rendered":"Automazione della sostituzione dei dischi tramite Ansible","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c60a2326ab13e7766eafda3ae5ac39c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCiao a tutti. Lavoro come amministratore di sistema senior in OK e mi occupo del funzionamento stabile del portale. Voglio raccontarvi come abbiamo organizzato il processo di sostituzione automatica dei dischi e come abbiamo escluso l'amministratore da questo processo, sostituendolo con un bot.<\/p>\n<p>Questo articolo \u00e8 una sorta di traslitterazione <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=5WhbG3FQveE&amp;list=FLKN7KW1sxju7fWJvKuyKxEQ\">dell'esibizione<\/a><\/noindex> a HighLoad+ 2018<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Costruzione del processo di sostituzione dei dischi<\/h2>\n<p><\/p>\n<h3>Iniziamo con qualche numero<\/h3>\n<p>\nOK \u00e8 un gigantesco servizio utilizzato da milioni di persone. \u00c8 supportato da circa 7.000 server situati in 4 diversi data center. I server ospitano oltre 70.000 dischi. Se impilati, formerebbero una torre alta oltre 1 km. <\/p>\n<p>I dischi rigidi sono il componente del server che si guasta pi\u00f9 spesso. Con questi volumi, dobbiamo sostituire circa 30 dischi a settimana, e questa procedura \u00e8 diventata una routine piuttosto spiacevole.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5e915e9077994efcc4e74a26fc6286fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Incidenti<\/h3>\n<p>\nNella nostra azienda \u00e8 stato implementato un completo sistema di gestione degli incidenti. Ogni incidente viene registrato in Jira e poi risolto e analizzato. Se l'incidente ha avuto un impatto sugli utenti, ci riuniamo per riflettere su come reagire pi\u00f9 rapidamente in tali situazioni, ridurre l'impatto e, naturalmente, prevenire ripetizioni.<\/p>\n<p>I drive non fanno eccezione. Il loro stato \u00e8 monitorato da Zabbix. Controlliamo i messaggi nel Syslog per errori di scrittura\/lettura, analizziamo lo stato dei RAID HW\/SW e monitoriamo il valore SMART; per gli SSD calcoliamo l'usura. <\/p>\n<h3>Come cambiavano i dischi in passato<\/h3>\n<p>\nQuando in Zabbix si attiva un trigger, viene creato un incidente in Jira e automaticamente assegnato agli ingegneri pertinenti nei data center. Facciamo cos\u00ec con tutti gli incidenti HW, cio\u00e8 quelli che richiedono qualche lavoro fisico con l'attrezzatura nel data center. <br \/>\nL'ingegnere del data center \u00e8 la persona che si occupa delle questioni relative all'hardware, responsabile dell'installazione, della manutenzione e della rimozione dei server. Appena riceve un ticket, l'ingegnere inizia a lavorare. Nelle unit\u00e0 di disco, sostituisce i dischi da solo. Se non ha accesso al dispositivo necessario, si rivolge agli amministratori di sistema di turno per ricevere aiuto. In primo luogo, \u00e8 necessario rimuovere il disco dalla rotazione. Per fare ci\u00f2, \u00e8 necessario apportare le modifiche necessarie al server, fermare le applicazioni e smontare il disco.<\/p>\n<p>L'amministratore di sistema di turno, durante il proprio turno di lavoro, \u00e8 responsabile del funzionamento dell'intero portale. Indaga sugli incidenti, si occupa delle riparazioni e aiuta gli sviluppatori a completare piccole attivit\u00e0. Non si occupa solo dei dischi rigidi.<\/p>\n<p>In passato, gli ingegneri dei data center comunicavano con gli amministratori di sistema tramite chat. Gli ingegneri inviavano link ai ticket Jira, l'amministratore li esaminava e teneva un registro del lavoro in un blocco note. Tuttavia, per tali compiti le chat sono scomode: le informazioni non sono strutturate e si perdono rapidamente. Inoltre, l'amministratore poteva semplicemente allontanarsi dal computer e non rispondere alle richieste per un certo periodo, mentre l'ingegnere aspettava accanto al server con un pacco di dischi.<\/p>\n<p>Ma la cosa peggiore era che gli amministratori non vedevano il quadro generale: quali incidenti relativi ai dischi esistevano e dove potevano potenzialmente sorgere problemi. Questo \u00e8 dovuto al fatto che tutti gli incidenti HW vengono gestiti dagli ingegneri. S\u00ec, sarebbe stato possibile visualizzare tutti gli incidenti nella dashboard dell'amministratore. Ma ce ne sono troppi, e l'amministratore veniva coinvolto solo in alcuni di essi.<\/p>\n<p>Inoltre, l'ingegnere non poteva stabilire correttamente le priorit\u00e0, perch\u00e9 non sapeva nulla riguardo allo scopo dei singoli server e alla distribuzione delle informazioni sui dischi.<\/p>\n<h3>Nuova procedura di sostituzione<\/h3>\n<p>\nLa prima cosa che abbiamo fatto \u00e8 stata separare tutti gli incidenti relativi ai disco in un tipo specifico chiamato \u00abHW-disco\u00bb e aggiungere i campi \u00abnome del dispositivo a blocchi\u00bb, \u00abdimensione\u00bb e \u00abtipo di disco\u00bb, in modo che queste informazioni vengano conservate nel ticket, evitando di doverle continuamente scambiare in chat. <\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/c4526bf668e31d90e0fbd061de44f1a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nInoltre, abbiamo concordato che all'interno di un singolo incidente verr\u00e0 sostituito solo un disco. Questo ha semplificato notevolmente in seguito il processo di automazione, la raccolta di statistiche e il lavoro. <\/p>\n<p>In aggiunta, abbiamo aggiunto il campo \u00abamministratore responsabile\u00bb. In questo campo viene automaticamente inserito il sistemista di turno. \u00c8 molto comodo, perch\u00e9 ora l'ingegnere vede sempre chi \u00e8 responsabile. Non \u00e8 necessario controllare il calendario alla ricerca. Proprio questo campo ha permesso di portare nella dashboard dell'amministratore i ticket in cui potrebbe essere necessaria la sua assistenza.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5097e5dcca1fddd68d1e5f296c09f60a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPer garantire che tutti i partecipanti possano trarre il massimo beneficio dalle innovazioni, abbiamo creato filtri e dashboard, e li abbiamo presentati ai ragazzi. Quando le persone comprendono i cambiamenti, non si allontanano da essi come da qualcosa di superfluo. Per un ingegnere \u00e8 importante sapere il numero del rack in cui si trova il server, le dimensioni e il tipo di disco. Un amministratore deve prima di tutto capire di che gruppo di server si tratta e quale pu\u00f2 essere l'effetto della sostituzione del disco.<\/p>\n<p>Avere dei campi e la loro visualizzazione \u00e8 comodo, ma non ci ha liberato dalla necessit\u00e0 di utilizzare le chat. Per questo abbiamo dovuto modificare il flusso di lavoro. <\/p>\n<p>Prima era cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/2b79cdb7ec88b5ae3d2917ad8b164c6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOggi gli ingegneri continuano a lavorare in questo modo, quando non hanno bisogno dell'aiuto di un amministratore.<\/p>\n<p>La prima cosa che abbiamo fatto \u00e8 stata introdurre un nuovo stato <b>Investigate<\/b>. In questo stato il ticket si trova Quando l'ingegnere non ha ancora deciso se avr\u00e0 bisogno di un amministratore o meno. Attraverso questo stato, l'ingegnere pu\u00f2 trasferire il ticket all'amministratore. Inoltre, usiamo questo stato per contrassegnare i ticket quando \u00e8 necessaria la sostituzione del disco, ma il disco stesso non \u00e8 disponibile in sede. Questo accade nel caso di CDN e sites remoti.<\/p>\n<p>Abbiamo anche aggiunto uno stato <b>Pronto<\/b>. Il ticket viene trasferito dopo la sostituzione del disco. Cio\u00e8, tutto \u00e8 gi\u00e0 stato fatto, ma il RAID HW\/SW \u00e8 in sincronizzazione sul server. Questo pu\u00f2 richiedere parecchio tempo.<\/p>\n<p>Se \u00e8 coinvolto un amministratore, lo schema diventa un po' pi\u00f9 complesso.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/5b6aacbb0d4049e62e7cb9ee28eb6498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDallo stato <b>Aperto<\/b> il ticket pu\u00f2 essere trasferito sia da un amministratore di sistema che da un ingegnere. Nell stato <b>In corso<\/b> l'amministratore estrae il disco dalla rotazione in modo che l'ingegnere possa semplicemente rimuoverlo: attiva l'illuminazione, smonta il disco, ferma le applicazioni, a seconda del particolare gruppo di server.<\/p>\n<p>Poi il ticket viene trasferito in <b>Pronto per la sostituzione<\/b>: questo \u00e8 un segnale per l'ingegnere che il disco pu\u00f2 essere estratto. Tutti i campi in Jira sono gi\u00e0 compilati, e l'ingegnere sa quale tipo e dimensione di disco. Questi dati vengono inseriti automaticamente nello stato precedente o dall'amministratore.<\/p>\n<p>Dopo la sostituzione del disco, il ticket viene trasferito nello stato <b>Modificato<\/b>. Si verifica che sia stato inserito il disco corretto, vengono effettuate le etichette, viene avviata l'applicazione e alcune attivit\u00e0 di ripristino dei dati. Inoltre, il ticket pu\u00f2 essere trasferito nello stato <b>Pronto<\/b>, in questo caso l'amministratore rimarr\u00e0 responsabile, poich\u00e9 \u00e8 stato lui a inserire il disco nella rotazione. Lo schema completo appare cos\u00ec.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/32f8d488e2ff6a28a3341114b66de0a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nL'aggiunta di nuovi campi ha reso la nostra vita molto pi\u00f9 facile. I ragazzi ora lavorano con informazioni strutturate, ed \u00e8 chiaro cosa e in quale fase deve essere fatto. Le priorit\u00e0 sono diventate molto pi\u00f9 rilevanti, poich\u00e9 ora vengono stabilite dall'amministratore.<\/p>\n<p>Non c'\u00e8 pi\u00f9 bisogno di chat. Certo, l'amministratore pu\u00f2 chiedere all'ingegnere \"qui bisogna sostituire pi\u00f9 rapidamente\" o \"\u00e8 gi\u00e0 sera, riesci a sostituire?\". Ma non ci comunichiamo pi\u00f9 quotidianamente su queste questioni nelle chat.<\/p>\n<p>I dischi sono stati sostituiti in blocchi. Se l'amministratore arriva al lavoro un po' prima, ha del tempo libero e non \u00e8 successo nulla, pu\u00f2 preparare una serie di server per la sostituzione: impostare i campi, rimuovere i dischi dalla rotazione e trasferire il compito all'ingegnere. L'ingegnere arriva un po' dopo nel data center, vede il compito, prende i necessari dispositivi dal magazzino e li sostituisce immediatamente. Di conseguenza, la velocit\u00e0 della sostituzione \u00e8 aumentata.<\/p>\n<h3>Le esperienze acquisite nella costruzione del Workflow<\/h3>\n<p><\/p>\n<ul>\n<li><b>Nella costruzione della procedura \u00e8 necessario raccogliere informazioni da fonti diverse.<\/b><br \/>\nAlcuni dei nostri amministratori non sapevano che l'ingegnere cambiava i dischi da solo. Alcuni pensavano che la sincronizzazione del RAID MD fosse monitorata dagli ingegneri, anche se alcuni di loro non avevano nemmeno accesso a questo. Alcuni ingegneri senior lo facevano, ma non sempre, perch\u00e9 il processo non era documentato da nessuna parte.<\/li>\n<li><b>La procedura deve essere semplice e comprensibile.<\/b><br \/>\n\u00c8 difficile per una persona tenere a mente molti passaggi. Gli stati pi\u00f9 importanti e vicini in Jira devono essere visualizzati sulla schermata principale. Possono essere rinominati, ad esempio, In progress lo chiamiamo Pronto per cambiare. Gli altri stati possono essere nascosti in un menu a discesa, in modo che non siano di disturbo. Ma \u00e8 meglio non limitare le persone e dare loro la possibilit\u00e0 di fare transizioni.<br \/>\nSpiegate il valore delle innovazioni. Quando le persone capiscono, accettano meglio la nuova procedura. Per noi era molto importante che le persone non cliccassero tutto il processo, ma lo seguissero. Poi abbiamo costruito l'automazione su questo.<\/li>\n<li><b>Aspettare, analizzare, capire.<\/b><br \/>\nCi sono voluti circa un mese per costruire la procedura, realizzare l'implementazione tecnica, incontrarci e discutere. L'implementazione ha richiesto pi\u00f9 di tre mesi. Ho visto come le persone hanno iniziato lentamente a utilizzare la novit\u00e0. All'inizio c'era molta negativit\u00e0. Ma ci\u00f2 non dipendeva affatto dalla procedura stessa o dalla sua implementazione tecnica. Ad esempio, un amministratore utilizzava non Jira, ma un plugin di Jira in Confluence, e alcune funzionalit\u00e0 non gli erano accessibili. Gli abbiamo mostrato Jira, e la produttivit\u00e0 dell'amministratore \u00e8 aumentata sia nei compiti generali che nella sostituzione dei dischi.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Automazione della sostituzione dei dischi<\/h2>\n<p>\nCi siamo avvicinati all'automazione della sostituzione dei dischi diverse volte. Avevamo gi\u00e0 delle bozze, degli script, ma tutti lavoravano in modalit\u00e0 interattiva o manuale, richiedevano un avvio. Solo dopo aver implementato la nuova procedura abbiamo capito che proprio quella ci mancava.<\/p>\n<p>Poich\u00e9 il processo di sostituzione \u00e8 ora suddiviso in fasi, ciascuna con un responsabile e un elenco di azioni, possiamo implementare l'automazione gradualmente invece di farlo tutto in una volta. Ad esempio, la fase pi\u00f9 semplice \u2014 Ready (verifica della sincronizzazione RAID\/dati) pu\u00f2 facilmente essere delegata a un bot. Quando il bot avr\u00e0 qualche esperienza, potr\u00e0 affrontare un compito pi\u00f9 responsabilizzante \u2014 l'introduzione di un disco in rotazione, ecc.<\/p>\n<h3>Zoo delle configurazioni<\/h3>\n<p>\nPrima di parlare del bot, facciamo una breve escursione nel nostro zoo delle installazioni. In primo luogo, ci\u00f2 \u00e8 dovuto all'enorme dimensione della nostra infrastruttura. In secondo luogo, cerchiamo di selezionare la configurazione hardware ottimale per ciascun servizio. Abbiamo circa 20 modelli di hardware RAID, principalmente LSI e Adaptec, ma ci sono anche HP e DELL di diverse versioni. Ogni controller RAID ha il proprio strumento di gestione. L'insieme dei comandi e le relative uscite possono variare da versione a versione per ogni controller RAID. Dove non vengono utilizzati HW-RAID, potrebbe esserci mdraid.<\/p>\n<p>Praticamente tutte le nuove installazioni vengono realizzate senza riserva disco. Cerchiamo di non utilizzare pi\u00f9 RAID hardware e software, poich\u00e9 riserviamo i nostri sistemi a livello di data center, non di server. Tuttavia, ci sono molti server legacy che devono essere supportati.<\/p>\n<p>In alcuni casi, i dischi nei controller RAID vengono utilizzati come dispositivi raw, in altri si utilizza JBOD. Ci sono configurazioni con un solo disco di sistema nel server, e se deve essere sostituito, \u00e8 necessario reinstallare il server con l'installazione del sistema operativo e delle applicazioni, utilizzando le stesse versioni, poi aggiungere i file di configurazione e avviare le applicazioni. Ci sono anche molti gruppi di server dove la riserva viene effettuata non a livello del subsistema disco, ma direttamente all'interno delle applicazioni stesse.<\/p>\n<p>In totale, abbiamo oltre 400 gruppi unici di server, su cui operano circa 100 applicazioni diverse. Per coprire un numero cos\u00ec enorme di varianti, avevamo bisogno di uno strumento di automazione multifunzionale. Preferibilmente con un DSL semplice, in modo che potesse essere mantenuto non solo da chi lo ha scritto.<\/p>\n<p>Abbiamo scelto Ansible perch\u00e9 \u00e8 senza agenti: non \u00e8 stato necessario preparare l'infrastruttura, avvio veloce. Inoltre, \u00e8 scritto in Python, che \u00e8 considerato lo standard nel team.<\/p>\n<h3>Schema generale<\/h3>\n<p>\nEsaminiamo lo schema generale di automazione attraverso un esempio di un incidente. Zabbix rileva che il disco sdb \u00e8 guasto, si attiva il trigger e viene creato un ticket in Jira. L'amministratore lo controlla, capisce che non \u00e8 un duplicato n\u00e9 un falso positivo, quindi \u00e8 necessario sostituire il disco e sposta il ticket in In progress.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/673df0fe9600bc65633841222f436d37.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nL'applicazione DiskoBot, scritta in Python, interroga periodicamente Jira per nuovi ticket. Nota che \u00e8 stato creato un nuovo ticket In progress, si attiva il thread corrispondente che avvia il playbook in Ansible (questo \u00e8 fatto per ogni stato in Jira). In questo caso, viene avviato Prepare2change.<\/p>\n<p>Ansible viene inviato all'host, rimuove il disco dalla rotazione e riporta lo stato all'applicazione tramite Callback. <\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/8bfc13129f8deca640eb63ea81f616c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn base ai risultati, il bot sposta automaticamente il ticket in Ready to change. L'ingegnere riceve una notifica e va a sostituire il disco, dopo di che sposta il ticket in Changed. <\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/eeda06b6966f435e2172d3f9c61b341e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSecondo lo schema descritto sopra, il ticket torna al bot, che avvia un altro playbook, accede all'host e inserisce il disco in rotazione. Il bot chiude il ticket. Evviva!<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/51b8c7050b0c10c16ad6a6d4974c3ebf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOra parliamo di alcuni componenti del sistema.<\/p>\n<h3>Diskobot<\/h3>\n<p>\nQuesta applicazione \u00e8 scritta in Python. Seleziona i ticket da Jira in base a JQL. A seconda dello stato del ticket, quest'ultimo viene assegnato al gestore corrispondente, il quale avvia il playbook Ansible adeguato allo stato.<\/p>\n<p>JQL e gli intervalli di polling sono definiti nel file di configurazione dell'applicazione.<\/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>\nAd esempio, tra i ticket nello stato In progress, vengono selezionati solo quelli in cui i campi Disk size e Device name sono compilati. Device name \u00e8 il nome del dispositivo di blocco necessario per l'esecuzione del playbook. Disk size \u00e8 necessario affinch\u00e9 l'ingegnere sappia quale dimensione di disco \u00e8 necessaria.<\/p>\n<p>E tra i ticket con stato Ready, vengono filtrati i ticket con l'etichetta dbot_ignore. A proposito, utilizziamo le etichette di Jira sia per questa filtrazione che per contrassegnare i duplicati dei ticket e raccogliere statistiche.<\/p>\n<p>In caso di fallimento del playbook, Jira assegna l'etichetta dbot_failed, per poter esaminare successivamente il problema. <\/p>\n<h3>Interazione con Ansible<\/h3>\n<p>\nL'applicazione interagisce con Ansible tramite <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/dev_guide\/developing_api.html\">Ansible Python API<\/a><\/noindex>. Nel playbook_executor passiamo il nome del file e un insieme di variabili. Questo consente di mantenere il progetto Ansible sotto forma di normali file yml, anzich\u00e9 descriverlo nel codice Python. <\/p>\n<p>Inoltre, in Ansible tramite *extra_vars* vengono passati il nome del dispositivo di blocco, lo stato del ticket e anche callback_url, che contiene la chiave del problema \u2014 utilizzata per il callback in HTTP.<\/p>\n<p>Per ogni esecuzione viene generato un inventario temporaneo, costituito da un singolo host e da un gruppo che include questo host, affinch\u00e9 vengano applicati group_vars.<\/p>\n<p>Ecco un esempio di task in cui \u00e8 implementato un callback HTTP.<\/p>\n<p>Riceviamo i risultati dell'esecuzione dei playbook tramite callback(-s). Ce ne sono di due tipi:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/plugins\/callback.html\">Plugin di callback Ansible<\/a><\/noindex>, che fornisce i dati sui risultati dell'esecuzione del playbook. Qui sono descritte le attivit\u00e0 che sono state avviate, completate con successo o fallite. Questo callback viene chiamato alla fine dell'esecuzione del playbook.<\/li>\n<li>Callback HTTP per ricevere informazioni durante l'esecuzione del playbook. Nel task Ansible eseguiamo una richiesta POST\/GET verso la nostra applicazione.<\/li>\n<\/ul>\n<p>\nCon il callback HTTP vengono trasmessi delle variabili definite durante l'esecuzione del playbook che vogliamo mantenere e utilizzare nei successivi avvii. Questi dati vengono scritti in sqlite.<\/p>\n<p>Anche attraverso il callback HTTP possiamo lasciare commenti e cambiare lo stato del ticket.<\/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>Come molte attivit\u00e0 simili, l'abbiamo estratta in un file comune e la includiamo all'occorrenza, per evitare di ripeterci continuamente nei playbook. Qui \u00e8 presente il callback_url, che include il codice del problema e il nome host. Quando Ansible esegue questa richiesta POST, il bot comprende che \u00e8 stata ricevuta nell'ambito di un certo incidente.<\/p>\n<p>Ecco un esempio dal playbook in cui abbiamo rimosso un disco da un dispositivo 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>\nQuesta attivit\u00e0 cambia lo stato del ticket Jira in \"Pronto per la modifica\" e aggiunge un commento. Inoltre, nella variabile mdam_data viene salvato un elenco dei dispositivi md da cui \u00e8 stato rimosso il disco, mentre in parted_info si trova un dump della partizione da parted. <\/p>\n<p>Quando l'ingegnere inserir\u00e0 un nuovo disco, potremo utilizzare queste variabili per ripristinare il dump delle partizioni e anche reinserire il disco nei dispositivi md da cui \u00e8 stato rimosso.<\/p>\n<h3>Modalit\u00e0 di controllo Ansible<\/h3>\n<p>\nEra spaventoso attivare l'automazione. Pertanto, abbiamo deciso di eseguire tutti i playbook in modalit\u00e0 <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_checkmode.html\">dry run<\/a><\/noindex>, in cui Ansible non esegue alcuna azione sui server, ma li emula soltanto. <\/p>\n<p>Tale avvio viene eseguito tramite un modulo di callback separato e il risultato dell'esecuzione del playbook viene salvato in Jira come commento.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/b02d7f1dc428f2797ae8556cd496b115.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn primo luogo, questo ha permesso di validare il funzionamento del bot e dei playbook. In secondo luogo, ha aumentato la fiducia degli amministratori nel bot. <\/p>\n<p>Quando abbiamo completato la validazione e compreso che era possibile eseguire Ansible non solo in modalit\u00e0 dry run, abbiamo creato in Jira il pulsante 'Run Diskobot' per l'esecuzione dello stesso playbook con le stesse variabili sullo stesso host, ma in modalit\u00e0 normale. <\/p>\n<p>Inoltre, il pulsante viene utilizzato per riavviare il playbook in caso di fallimento.<\/p>\n<h3>Struttura dei Playbooks<\/h3>\n<p>\nHo gi\u00e0 menzionato che, a seconda dello stato del ticket Jira, il bot esegue diversi playbook.<\/p>\n<p>In primo luogo, \u00e8 molto pi\u00f9 semplice organizzare l\u2019input. <br \/>\nIn secondo luogo, in alcuni casi \u00e8 semplicemente necessario. <\/p>\n<p>Ad esempio, quando si sostituisce il disco di sistema, \u00e8 necessario prima accedere al sistema di distribuzione, creare un'attivit\u00e0 e, dopo una corretta distribuzione, il server sar\u00e0 accessibile tramite ssh, e sar\u00e0 possibile installarvi l'applicazione. Se avessimo fatto tutto ci\u00f2 in un unico playbook, Ansible non sarebbe stato in grado di eseguirlo a causa dell'indisponibilit\u00e0 dell'host.<\/p>\n<p>Utilizziamo ruoli Ansible per ogni gruppo di server. Qui si pu\u00f2 vedere come sono organizzati i playbook in uno di essi. <\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/7a14035392b33f01d3182d5fff779321.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuesto \u00e8 comodo, perch\u00e9 \u00e8 immediatamente chiaro dove si trovano quali attivit\u00e0. Nel main.yml, che funge da ingresso per il ruolo Ansible, possiamo semplicemente includere in base allo stato del ticket o attivit\u00e0 generali necessarie per tutti, come ad esempio il passaggio dell'identificazione o l'ottenimento del token.<\/p>\n<h4>Investigation.yml<\/h4>\n<p>\nViene eseguito per i ticket nello stato Investigation e Open. La cosa pi\u00f9 importante per questo playbook \u00e8 il nome del dispositivo a blocchi. Queste informazioni non sono sempre disponibili. <\/p>\n<p>Per ottenerlo, analizziamo il riassunto di Jira e l'ultimo valore dal trigger Zabbix. Potrebbe contenere il nome del dispositivo a blocchi \u2014 che fortuna. Oppure potrebbe contenere il mount point, in tal caso dobbiamo andare sul server, eseguire il parsing e calcolare il disco necessario. Inoltre, il trigger potrebbe trasmettere l'indirizzo SCSI o qualche altra informazione. Ma a volte non ci sono indizi e dobbiamo analizzare.<\/p>\n<p>Una volta scoperto il nome del dispositivo a blocchi, raccogliamo informazioni sul tipo e sulla dimensione del disco per riempire i campi in Jira. Raccolta anche delle informazioni sul fornitore, modello, firmware, ID, SMART, e tutto ci\u00f2 viene inserito nei commenti del ticket Jira. Ora l'amministratore e l'ingegnere non devono pi\u00f9 cercare questi dati. \ud83d\ude42<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/259bf8712c013ee00d238f111b4280fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>prepare2change.yml<\/h4>\n<p>\nRimozione del disco dalla rotazione, preparazione alla sostituzione. Fase la pi\u00f9 complessa e delicata. \u00c8 proprio qui che \u00e8 possibile fermare l'app quando non pu\u00f2 essere arrestata. Oppure rimuovere un disco che mancava di repliche, influenzando cos\u00ec gli utenti e perdendo dati. Qui abbiamo pi\u00f9 controlli e notifiche in chat.<\/p>\n<p>Nel caso pi\u00f9 semplice, si tratta di rimuovere il disco da HW\/MD RAID. <\/p>\n<p>In situazioni pi\u00f9 complesse (nei nostri sistemi di archiviazione), quando il backup viene eseguito a livello di applicazione, \u00e8 necessario accedere all'applicazione tramite API, segnalare l'uscita del disco, disattivarlo e avviare il ripristino.<\/p>\n<p>Stiamo attualmente migrando in massa a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/odnoklassniki\/blog\/346868\">cloud<\/a><\/noindex>, e se il server \u00e8 cloud, Diskobot si rivolge all'API del cloud, comunica che intende lavorare con questo minion \u2014 il server su cui sono in esecuzione i container \u2014 e richiede \"migra tutti i container da questo minion\". E accende anche l'illuminazione del disco affinch\u00e9 l'ingegnere possa vedere subito quale deve essere rimosso.<\/p>\n<h4>changed.yml<\/h4>\n<p>\nDopo la sostituzione del disco, controlliamo innanzitutto la sua disponibilit\u00e0. <\/p>\n<p>Gli ingegneri non installano sempre dischi nuovi, quindi abbiamo aggiunto un controllo dei valori SMART che ci soddisfano.<\/p>\n<p><b class=\"spoiler_title\">Quali attributi controlliamo<\/b>Reallocated Sectors Count (5) &lt; 100<br \/>\nCurrent Pending Sector Count (107) == 0<\/p>\n<p>Se il disco non supera il controllo, viene comunicato all'ingegnere di procedere con una nuova sostituzione. Se tutto \u00e8 in ordine, l'illuminazione si spegne, viene applicata la marcatura e il disco viene inserito in rotazione.<\/p>\n<h4>ready.yml<\/h4>\n<p>\nIl caso pi\u00f9 semplice: controllo della sincronizzazione HW\/SW raid o completamento della sincronizzazione dei dati nell'applicazione.<\/p>\n<h3>API delle applicazioni<\/h3>\n<p>\nHo menzionato diverse volte che spesso il bot interagisce con le API delle applicazioni. Certo, non tutte le applicazioni avevano i metodi necessari, quindi \u00e8 stato necessario implementarli. Ecco i metodi pi\u00f9 importanti che utilizziamo:<\/p>\n<ul>\n<li>Status. Stato del cluster o del disco per capire se \u00e8 possibile lavorarci;\n<\/li>\n<li>Start\/stop. Attivazione\/disattivazione del disco;\n<\/li>\n<li>Migrate\/restore. Migrazione e ripristino dei dati durante e dopo la sostituzione.\n<\/li>\n<\/ul>\n<p><\/p>\n<h3>Esperienza condivisa su Ansible<\/h3>\n<p>\nAmo molto Ansible. Ma spesso, quando guardo diversi progetti open-source e vedo come le persone scrivono i playbook, mi sento un po' spaventato. Complicati intrecci logici tra when\/loop, mancanza di flessibilit\u00e0 e idempotenza a causa dell'uso frequente di shell\/command.<\/p>\n<p>Abbiamo deciso di semplificare il tutto al massimo, sfruttando il vantaggio di Ansible: la modularit\u00e0. Ai livelli pi\u00f9 alti ci sono i playbook, che possono essere scritti da qualsiasi amministratore o sviluppatore esterno che ha una minima conoscenza di Ansible.<\/p>\n<pre><code class=\"plaintext\">- name: Blink disk\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>Se una logica \u00e8 difficile da realizzare nei playbook, la spostiamo in un modulo o in un filtro Ansible. Gli script possono essere scritti sia in Python che in qualsiasi altro linguaggio. <\/p>\n<p>Sono facili e veloci da scrivere. Ad esempio, il modulo di evidenziazione del disco, di cui abbiamo fornito un esempio d'uso, \u00e8 composto da 265 righe.<\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/08e0384bfad24f3ee61e0643ca087852.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAlla base c'\u00e8 una libreria. Per questo progetto abbiamo scritto un'applicazione separata, una sorta di astrazione su RAID hardware e software, che esegue le richieste corrispondenti. <\/p>\n<p><img decoding=\"async\" alt=\"Automazione della sostituzione dei dischi tramite Ansible\" src=\"\/wp-content\/uploads\/2019\/06\/0edda3182026ce6279bd84c99613e3d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI punti di forza di Ansible sono la semplicit\u00e0 e i playbook chiari. Credo che sia importante sfruttarli e non generare terribili file yaml, con un'enorme quantit\u00e0 di condizioni, codice shell e loop.<\/p>\n<p>Se desiderate replicare la nostra esperienza con l'API Ansible, tenete a mente due cose:<\/p>\n<ul>\n<li>A playbook_executor e in generale a un playbook non \u00e8 possibile passare un timeout. Esiste un timeout per le sessioni ssh, ma non per il playbook. Se tentiamo di smontare un disco che non esiste pi\u00f9 nel sistema, il playbook verr\u00e0 eseguito indefinitamente, quindi abbiamo dovuto avvolgere l'esecuzione in un wrapper separato e terminarlo per timeout.\n<\/li>\n<li>Ansible opera su base di processi fork, quindi la sua API non \u00e8 thread-safe. Eseguiamo tutti i nostri playbook in modo singolo.\n<\/li>\n<\/ul>\n<p>\nSiamo riusciti ad automatizzare la sostituzione di circa l'80% dei dischi. In generale, la velocit\u00e0 di sostituzione \u00e8 raddoppiata. Oggi l'amministratore deve solo guardare l'incidente e decidere se sostituire il disco o meno, e poi fa un clic.<\/p>\n<p>Ma ora iniziamo a affrontare un altro problema: alcuni nuovi amministratori non sanno come sostituire i dischi. \ud83d\ude42<br \/>\n<br \/>Fonte: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/it\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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\udd47Automazione della sostituzione dei dischi con Ansible | ProHoster","description":"Ciao a tutti. Lavoro come amministratore di sistema senior in OK e sono responsabile del funzionamento stabile del portale. Voglio raccontarvi come abbiamo strutturato il processo di sostituzione automatica dei dischi, per poi escludere l'amministratore da questo processo e sostituirlo con un bot. Questo articolo \u00e8 una sorta di traslitterazione del mio intervento a HighLoad+ 2018 sulla costruzione del processo di sostituzione dei dischi. Iniziamo con un po' di contesto.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/avtomatizatsiya-zameny-diskov-s-pomoshhyu-ansible","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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. \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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=34841"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/34841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/26233"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=34841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=34841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=34841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}