{"id":98123,"date":"2020-10-24T14:42:52","date_gmt":"2020-10-24T12:42:52","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens"},"modified":"2020-11-18T00:58:49","modified_gmt":"2020-11-17T22:58:49","slug":"patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","title":{"rendered":"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ec13125c702f42863bbe774cd805442b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sembra che gli sviluppatori di Terraform offrano pratiche consigliate piuttosto convenienti per lavorare con l'infrastruttura AWS. Tuttavia, c'\u00e8 un problema. Col passare del tempo, il numero di ambienti aumenta, ognuno con le proprie peculiarit\u00e0. Praticamente appare una copia del stack applicativo in una regione vicina. E il codice Terraform deve essere copiato e modificato con attenzione in base ai nuovi requisiti, oppure si deve creare una configurazione personalizzata.<\/p>\n<p><\/p>\n<p>La mia presentazione riguarda i modelli in Terraform per combattere il caos e la routine manuale in progetti grandi e a lungo termine.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f92845c017bf613f0899d88\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8c67c45e486d6c03793dd08c33a16313.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ho 40 anni, sono 20 anni nel settore IT. Lavoro da 12 anni con l'azienda Ixtens. Ci occupiamo di sviluppo guidato dall'ecommerce. E da 5 anni pratico pratiche DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8b14b3adaa45d69278d76580baa99042.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La mia storia riguarder\u00e0 l'esperienza in un progetto di cui non riveler\u00f2 il nome, in virt\u00f9 di un accordo di riservatezza. <\/p>\n<p><\/p>\n<p>I numeri sullo slide sono indicati per comprendere la scala del progetto. E tutto ci\u00f2 di cui parler\u00f2 in seguito \u00e8 correlato ad Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/3742217a2abaf1fcf2163979d82eac14.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi sono unito a questo progetto 4 anni fa. E proprio mentre avveniva la ristrutturazione dell'infrastruttura, il progetto \u00e8 cresciuto. E i modelli che venivano utilizzati non erano pi\u00f9 adeguati. Considerando tutto il previsto aumento del progetto, era necessario trovare qualcosa di nuovo. <\/p>\n<p><\/p>\n<p>Grazie a Matvey, che ieri ha raccontato cosa stava succedendo in Dodo Pizza. \u00c8 quello che \u00e8 successo da noi quattro anni fa. <\/p>\n<p><\/p>\n<p>Sono arrivati gli sviluppatori e hanno iniziato a scrivere codice infrastrutturale. <\/p>\n<p><\/p>\n<p>I motivi pi\u00f9 evidenti per cui era necessario erano legati al time to market. Era fondamentale fare in modo che il team DevOps non fosse un collo di bottiglia nel rilascio. Inoltre, a livello base, sono stati utilizzati Terraform e Puppet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/13d6df6a324d2e1162acef77ca2ad0dc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform \u00e8 un progetto open source della HashiCorp. E per chi non fosse a conoscenza, i prossimi slide saranno una spiegazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/61726d4205d1f4f8e449fe9d71507508.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'infrastruttura come codice significa che possiamo descrivere la nostra infrastruttura e chiedere a dei robot di creare le risorse che abbiamo descritto.<\/p>\n<p><\/p>\n<p>Ad esempio, abbiamo bisogno di <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/vps\/abuzoustojchivye-vps\/\"   title=\"la macchina virtuale\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">la macchina virtuale<\/a>. Lo descriveremo, aggiungendo alcuni parametri obbligatori. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/eb52c1e458fa092bba8577fffceb864c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dopo di che, nella console configureremo l'accesso ad Amazon. E chiederemo a Terraform di fare un piano. Terraform ci dir\u00e0: \u00abOk, per la vostra risorsa possiamo fare queste cose\u00bb. E, almeno, verr\u00e0 aggiunta una risorsa. Non sono previsti cambiamenti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/879e645596121ee5d05ac247b4be19ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Una volta che tutto \u00e8 a posto, puoi chiedere a Terraform di applicare e Terraform creer\u00e0 un'istanza per te, e avrai una macchina virtuale nel tuo cloud.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/77b7fe4d6abcc9116233f48caa887465.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Successivamente, il nostro progetto si sviluppa. Aggiungiamo alcune modifiche. Richiediamo pi\u00f9 istanze, aggiungiamo una registrazione 53.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/98ce7e1f9d1f85aa5e78c269a0708ac1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ripetiamo. Chiediamo un piano. Vediamo quali modifiche sono previste. Applichiamo. E in questo modo la nostra infrastruttura cresce. <\/p>\n<p><\/p>\n<p>Terraform utilizza qualcosa chiamato file di stato. Vale a dire, tutte le modifiche che vengono inviate ad Amazon vengono salvate in un file, dove per ogni risorsa descritta ci sono le corrispondenti risorse create in Amazon. In questo modo, quando si modifica la descrizione di una risorsa, Terraform sa esattamente cosa deve cambiare in Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6e83efffb7af6ab967b4716be170b47b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questi file di stato erano inizialmente solo file. Li abbiamo conservati in Git, il che era estremamente scomodo. Qualcuno dimenticava costantemente di fare commit delle modifiche e si verificavano molti conflitti. <\/p>\n<p><\/p>\n<p>Ora c'\u00e8 la possibilit\u00e0 di utilizzare un backend, ovvero a Terraform si indica in quale bucket e con quale chiave salvare il file di stato. E Terraform si prender\u00e0 cura di ottenere questo file di stato, fare tutta la magia e restituire il risultato finale.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/e6687463a9fe3cff979f44ac7778b4e8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La nostra infrastruttura \u00e8 in crescita. Ecco il nostro codice. Ora non vogliamo solo creare una macchina virtuale, vogliamo avere un ambiente di test.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/0effb09fa04d3d520c1cdbb34ce97810.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform consente di creare ci\u00f2 che chiamiamo modulo, ovvero descrivere la stessa cosa in una determinata cartella.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/95c8395b10142fe550b0719161211f15.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, ad esempio, durante il test possiamo chiamare questo modulo e ottenere lo stesso risultato come se avessimo eseguito Terraform apply nel modulo stesso. Per i test, ci sar\u00e0 questo codice.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/fa4c16e3835a4507a858d2ddb767daf3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per la produzione possiamo inviare alcune modifiche, perch\u00e9 durante i test non ci servono grandi istanze, mentre in produzione le grandi istanze saranno utili.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/19478de23da2278567e66bacef78a0a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi torner\u00f2 al progetto. C'era un compito complesso, l'infrastruttura era pianificata per essere molto grande. Era necessario organizzare tutto il codice in modo da esserlo per tutti: sia per chi si occupa della manutenzione di questo codice, sia per chi apporta modifiche. Si prevedeva che ogni sviluppatore potesse andare e modificare l'infrastruttura come necessario per la propria parte della piattaforma. <\/p>\n<p><\/p>\n<p>Questo \u00e8 l'albero delle directory raccomandato da HashiCorp, se hai un grande progetto e ha senso suddividere tutta l'infrastruttura in piccoli pezzi, e ogni pezzo descriverlo in una cartella separata. <\/p>\n<p><\/p>\n<p>Avendo una vasta libreria di risorse, \u00e8 possibile chiamare praticamente le stesse cose sia nei test che in produzione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/c30cdc3d3ce5441bc0ae4a485069dacc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel nostro caso, questo non era proprio adatto, perch\u00e9 il stack di test per sviluppatori o per il collaudo doveva essere ottenuto in modo pi\u00f9 semplice. Non volevamo dover girare tra le cartelle e applicare in sequenza, e preoccuparci che il database venisse sollevato, seguito dall'istanza che utilizza quel database. Pertanto, tutto il testing veniva avviato da una sola cartella. L\u00ec venivano chiamati gli stessi moduli, ma tutto avveniva in un'unica esecuzione.<\/p>\n<p><\/p>\n<p>Terraform si occupa di tutte le dipendenze. E crea sempre le risorse nell'ordine tale da poter ottenere un indirizzo IP, ad esempio, da un'istanza appena creata e ricevere quell'indirizzo IP in una registrazione route53. <\/p>\n<p><\/p>\n<p>Inoltre, la piattaforma \u00e8 molto grande. E avviare uno stack di test, anche se per un'ora, anche se per 8 ore, \u00e8 un'operazione piuttosto costosa. <\/p>\n<p><\/p>\n<p>E abbiamo automatizzato tutto questo. Il lavoro di Jenkins permetteva di avviare lo stack. Era necessario eseguire una pull request con le modifiche che lo sviluppatore voleva testare, specificare tutte le opzioni necessarie, i componenti e le dimensioni. Se desiderava eseguire test di performance, poteva prendere pi\u00f9 istanze. Se doveva solo verificare che un certo modulo si aprisse, poteva partire con impostazioni minime. Inoltre, poteva specificare se era necessario un cluster o meno, e cos\u00ec via. <\/p>\n<p><\/p>\n<p>Successivamente, Jenkins eseguiva uno script shell, che modificava leggermente il codice nella cartella Terraform. Rimuoveva file non necessari, aggiungeva file necessari. E poi, con un'unica esecuzione, il comando Terraform apply sollevava lo stack. <\/p>\n<p><\/p>\n<p>E poi seguivano altri passaggi, nei quali non voglio approfondire. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b288c0b320d8cb6e282db994bc1c1f43.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poich\u00e9 per il testing ci servivano alcune opzioni in pi\u00f9 rispetto alla produzione, eravamo costretti a fare copie dei moduli, in modo da poter aggiungere quelle funzionalit\u00e0 necessarie solo per il testing. <\/p>\n<p><\/p>\n<p>E cos\u00ec \u00e8 accaduto che nel testing si desiderava testare quelle modifiche che alla fine sarebbero andate in produzione. Ma in realt\u00e0 si testava una cosa, mentre in produzione veniva applicato qualcosa di leggermente diverso. E c'era una piccola disconnessione, dato che in produzione tutte le modifiche venivano applicate dal team operativo. A volte accadeva che quelle modifiche che avrebbero dovuto passare dal testing alla produzione rimanessero in un'altra versione. <\/p>\n<p><\/p>\n<p>Inoltre, c'era un problema relativo all'aggiunta di un nuovo servizio, che differiva in parte da un servizio gi\u00e0 esistente. Invece di modificare il modulo esistente, era necessario crearne una copia e apportare le modifiche necessarie. <\/p>\n<p><\/p>\n<p>In sostanza, Terraform non \u00e8 un vero linguaggio. \u00c8 una dichiarazione. Se abbiamo bisogno di dichiarare qualcosa, lo facciamo. E tutto questo funziona.<\/p>\n<p><\/p>\n<p>A un certo punto, durante la discussione di una delle mie pull request, uno dei colleghi ha detto che non bisognava creare troppe 'fiocchi di neve'. Mi sono interessato a cosa intendesse. C'\u00e8 un fatto scientifico che afferma che nel mondo non esistono due fiocchi di neve identici, tutti hanno delle piccole differenze. E non appena ho sentito questo, ho subito percepito il peso del codice Terraform. Perch\u00e9 quando era necessario passare da una versione all'altra, Terraform richiedeva modifiche incompatibili, il che significava che il codice non era pi\u00f9 compatibile con la versione successiva. E si doveva fare una pull request che copriva quasi met\u00e0 dei file nell'infrastruttura, per aggiornare l'infrastruttura alla nuova versione di Terraform.<\/p>\n<p><\/p>\n<p>E dopo che \u00e8 apparso un tale fiocco di neve, tutto il codice Terraform che avevamo si trasformava in un'enorme montagna di neve. <\/p>\n<p><\/p>\n<p>Per uno sviluppatore esterno, che non \u00e8 parte delle operazioni, questo non ha molta importanza, perch\u00e9 ha fatto la sua pull request, la sua risorsa \u00e8 stata avviata. E basta, non \u00e8 pi\u00f9 una sua preoccupazione. Ma per il team DevOps, che si assicura che tutto funzioni, \u00e8 necessario apportare tutte queste modifiche. E il costo di queste modifiche aumentava in modo significativo con ogni 'fiocco di neve' aggiuntivo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/d07039414027798861d1424bb2c686b6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'\u00e8 una storia su uno studente che durante un seminario disegna due cerchi perfetti con il gesso sulla lavagna. E il docente si sorprende di come sia riuscito a farli cos\u00ec precisi senza compasso. Lo studente risponde: \u00abMolto semplice, ho passato due anni nell'esercito a girare un tritacarne\u00bb. <\/p>\n<p><\/p>\n<p>Dei quattro anni in cui ho partecipato a questo progetto, circa due anni li ho dedicati a Terraform. E, naturalmente, ho alcune dritte e suggerimenti su come semplificare il codice di Terraform, trattarlo come un linguaggio di programmazione e ridurre il carico sui programmatori che devono mantenerlo aggiornato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9413c6adf1933482dcc822b021773df9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il primo punto da cui vorrei partire \u00e8 Symlinks. Terraform ha molto codice ripetitivo. Ad esempio, la chiamata al provider si ripete praticamente ad ogni punto in cui creiamo un pezzo di infrastruttura. \u00c8 logico quindi estrarlo in una cartella separata. E ovunque ci sia bisogno del provider, creare dei Symlinks a quel file. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6dcf36cc8c94e7a70cf6ab1456cc1215.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ad esempio, se nel tuo ambiente di produzione utilizzi un assume role, che ti consente di ottenere diritti di accesso su un certo account Amazon esterno. Cambiando un file, tutti gli altri nel tuo albero delle risorse avranno i diritti necessari affinch\u00e9 Terraform sappia a quale segmento di Amazon rivolgersi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/6df9a89ef48ae9a7adda7fb1f86b76aa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove non funzionano i Symlinks? Come ho gi\u00e0 detto, in Terraform ci sono file di stato. E sono veramente ottimi. Ma il fatto \u00e8 che Terraform inizializza il backend come primo passaggio. E non pu\u00f2 utilizzare in questi parametri nessuna variabile, devono sempre essere scritte come testo. <\/p>\n<p><\/p>\n<p>E come risultato, quando qualcuno crea una nuova risorsa, copia una parte di codice da altre cartelle. E pu\u00f2 sbagliarsi con la chiave o con il bucket. Ad esempio, pu\u00f2 creare una cosa per sandbox e poi farla in produzione. E pu\u00f2 capitare che il bucket in produzione venga utilizzato da sandbox. Certamente, questo verr\u00e0 scoperto rapidamente. Si potr\u00e0 in qualche modo correggere, ma rimane comunque una perdita di tempo e in qualche misura di risorse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/757294dc6a1a27fc4a5fe174cc4aa7d7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa possiamo fare dopo? Prima di lavorare con Terraform, \u00e8 necessario inizializzarlo. Durante l'inizializzazione, Terraform scarica tutti i plugin. In un certo modo, si \u00e8 passati da un'architettura monolitica a una pi\u00f9 microservizi. Ed \u00e8 sempre necessario eseguire Terraform init, affinch\u00e9 possa scaricare tutti i moduli e tutti i plugin.<\/p>\n<p><\/p>\n<p>\u00c8 possibile utilizzare uno script shell che, da un lato, pu\u00f2 estrarre tutte le variabili. Uno script shell non ha limitazioni. Dall'altro lado, anche i percorsi. Se utilizziamo sempre il percorso presente nel repository come chiave per il file di stato, di conseguenza, l'errore sar\u00e0 escluso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b70dbc6d8edb1b255c64d722a7e40680.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Da dove ottenere i dati? Da un file JSON. Terraform consente di registrare l'infrastruttura non solo in hcl (HashiCorp Configuration Language), ma anche in JSON.<\/p>\n<p><\/p>\n<p>JSON \u00e8 facilmente leggibile da uno script shell. Di conseguenza, \u00e8 possibile posizionare il file di configurazione con il bucket in un determinato posto. E utilizzare questo bucket sia nel codice Terraform che nello script shell per l'inizializzazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/a18b92cac763003ec49af8d4a37e19d9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perch\u00e9 \u00e8 importante avere un bucket per Terraform? Perch\u00e9 esiste qualcosa chiamato file di stato remoto. Cio\u00e8, quando creo una risorsa, per dirle ad Amazon: \"Per favore, avvia un'istanza\", \u00e8 necessario specificare molti parametri obbligatori. <\/p>\n<p><\/p>\n<p>E questi identificatori sono memorizzati in una sorta di altra cartella. Posso dire: \u00abTerraform, per favore vai nel file di stato di quella risorsa e dammi questi identificatori\u00bb. In questo modo si crea una certa unificazione tra diverse regioni o ambienti.<\/p>\n<p><\/p>\n<p>Non sempre \u00e8 possibile utilizzare un file di stato remoto. Ad esempio, hai creato manualmente una VPC. E il codice Terraform che crea la VPC genera una VPC cos\u00ec diversa che ci vorr\u00e0 molto tempo e dovrai adattare l'uno all'altro, perci\u00f2 puoi usare il seguente trucco. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/04ffcd97e2fae323d9b4d81e5f6c751a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cio\u00e8, creare un modulo che crea una VPC e ti restituisce gli identificatori, ma in realt\u00e0 c'\u00e8 solo un file con valori hardcoded che pu\u00f2 essere utilizzato per creare lo stesso instance.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9cd878c459f377caf5af9bf27b026187.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Non \u00e8 sempre necessario salvare il file di stato nel cloud. Ad esempio, quando si testano i moduli, \u00e8 possibile utilizzare l'inizializzazione del backend, in cui il file verr\u00e0 semplicemente salvato su disco durante il periodo di test.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/70fee8d4105cfddacafeec00825127b5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora parliamo un po' dei test. Cosa si pu\u00f2 testare in Terraform? Probabilmente si pu\u00f2 testare molto, ma parler\u00f2 di queste 4 cose.<\/p>\n<p><\/p>\n<p>HashiCorp ha una visione chiara su come formattare il codice Terraform. E Terraform fmt ti consente di formattare il codice che stai modificando in linea con questa visione. Pertanto, i test devono assolutamente verificare se la formattazione rispetta quanto stabilito da HashiCorp, evitando di dover cambiare la posizione delle parentesi, ecc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/bb99ffdd9f963f0f44ea7b5379689737.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il prossimo \u00e8 Terraform validate. Esegue qualcosa in pi\u00f9 di una semplice verifica della sintassi, come controllare se tutte le parentesi sono abbinate. Cosa c'\u00e8 di importante in questo? La nostra infrastruttura \u00e8 piuttosto complessa. Ci sono moltissime cartelle diverse. E in ciascuna di esse, \u00e8 necessario eseguire Terraform validate.<\/p>\n<p><\/p>\n<p>Pertanto, per accelerare i test, eseguiamo pi\u00f9 processi in parallelo, utilizzando la modalit\u00e0 parallelo. <\/p>\n<p><\/p>\n<p>Il parallelo \u00e8 una funzione davvero fantastica, approfittatene.<\/p>\n<p><\/p>\n<p>Ma ogni volta che viene eseguita l'inizializzazione di Terraform, questo si connette a HashiCorp e chiede: \u00abQuali sono le ultime versioni dei plugin? E il plugin che ho nella cache, \u00e8 quello giusto?\u00bb E questo rallenta ogni passo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/836e90327c7a60c493f42f0a055e248b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se Terraform riceve indicazioni su dove si trovano i plugin, dir\u00e0: \u00abVa bene, probabilmente questa \u00e8 la cosa pi\u00f9 recente. Non andr\u00f2 da nessuna parte, inizier\u00f2 subito a convalidare il tuo codice Terraform\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/8ab344cf8de7087d30a1212d44691c20.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Per riempire la cartella con i plugin necessari, abbiamo un codice Terraform molto semplice da inizializzare. Qui, ovviamente, \u00e8 necessario specificare tutti i provider che partecipano in qualche modo al tuo codice, altrimenti Terraform dir\u00e0: \u00abNon conosco alcun provider, perch\u00e9 non \u00e8 nella cache\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/b8130753045624d38bce32ba08b56fb0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il passo successivo \u00e8 Terraform plan. Come gi\u00e0 detto, lo sviluppo \u00e8 ciclico. Creiamo codice con modifiche e poi dobbiamo scoprire quali modifiche sono pianificate per l'infrastruttura. <\/p>\n<p><\/p>\n<p>E quando l'infrastruttura \u00e8 molto, molto grande, \u00e8 possibile cambiare un modulo, riparare un ambiente di test o una specifica regione e rompere qualche altro. Pertanto, Terraform plan deve essere eseguita su tutta l'infrastruttura e mostrare quali modifiche sono pianificate.<\/p>\n<p><\/p>\n<p>Puoi farlo in modo intelligente. Noi, ad esempio, abbiamo scritto uno script in Python che risolve le dipendenze. E a seconda di ci\u00f2 che \u00e8 stato modificato: un modulo Terraform o semplicemente un componente specifico, crea piani per tutte le cartelle dipendenti.<\/p>\n<p><\/p>\n<p>Il piano Terraform dovrebbe essere eseguito su richiesta. Almeno, \u00e8 questo che facciamo noi. <\/p>\n<p><\/p>\n<p>\u00c8 sicuramente utile eseguire test per ogni modifica, per ogni commit, ma i piani sono una cosa piuttosto costosa. E nel pull request diciamo: \u00abPer favore, dammi i piani\u00bb. Si avvia un robot e invia nei commenti o come allegato tutti i piani previsti dai tuoi cambiamenti. <\/p>\n<p><\/p>\n<p>Il piano \u00e8 un elemento piuttosto costoso. Richiede tempo, perch\u00e9 Terraform va su Amazon e chiede: \u00abQuesto instance esiste ancora? Questo autoscale ha esattamente queste impostazioni?\u00bb. E per accelerare questo processo, puoi utilizzare un parametro come refresh=false. Questo significa che Terraform scaricher\u00e0 lo stato da S3 e creder\u00e0 che lo stato corrisponda esattamente a ci\u00f2 che si trova su Amazon.<\/p>\n<p><\/p>\n<p>Questo piano di Terraform \u00e8 molto pi\u00f9 veloce, ma lo stato deve corrispondere alla vostra infrastruttura, cio\u00e8, da qualche parte, in un momento, Terraform refresh deve essere eseguito. Terraform refresh fa proprio questo, affinch\u00e9 lo stato corrisponda a ci\u00f2 che si trova nell'infrastruttura reale. <\/p>\n<p><\/p>\n<p>E dobbiamo parlare della sicurezza. Dovevamo iniziare da qui. L\u00ec dove eseguite Terraform e Terraform interagisce con la vostra infrastruttura, c'\u00e8 una vulnerabilit\u00e0. Cio\u00e8, fondamentalmente, state eseguendo codice. E se la pull request contiene del codice malevolo, potrebbe essere eseguito su un'infrastruttura che ha troppi privilegi. Quindi, fate attenzione a dove eseguite Terraform plan.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/2153cc01acf2b1f46978f837b82b317e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora, vorrei parlare dei test dei dati utente.<\/p>\n<p><\/p>\n<p>Cos'\u00e8 il user-data? In Amazon, quando creiamo un'istanza, possiamo inviare da quell'istanza una sorta di messaggio \u2013 metadati. Quando l'istanza si avvia, generalmente cloud init \u00e8 sempre presente su queste istanze. Cloud init legge questo messaggio e dice: \u00abOk, oggi sono un load balancer\u00bb. E in base a queste istruzioni, esegue alcune azioni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/406ac9341e102f5e0d7ca239d10675cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Purtroppo, quando eseguiamo Terraform plan e Terraform apply, i dati dell'utente appaiono come una confusa sequenza di numeri. Cio\u00e8, ci invia semplicemente un hash. E tutto ci\u00f2 che possiamo vedere nel piano \u00e8 se ci saranno delle modifiche o se l'hash rimarr\u00e0 lo stesso. <\/p>\n<p><\/p>\n<p>E se non ci si fa attenzione, su Amazon, sulla vera infrastruttura, pu\u00f2 finire qualche file di testo danneggiato. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/cd7b56f1149d9cbebb0ad3228c0eeb5f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come alternativa, si pu\u00f2 specificare solo il template durante l'esecuzione, non l'intera infrastruttura. Nel codice si pu\u00f2 dire: \u00abPer favore, stammi questo template\u00bb. Cos\u00ec, alla fine, si pu\u00f2 ottenere una stampa di come appariranno i vostri dati su Amazon.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/86da779cdf7f9cacfd80a196efde47f7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un'altra opzione \u00e8 quella di utilizzare un modulo per generare i dati dell'utente. Applicate questo modulo, ottenete un file sul disco, lo confrontate con quello di riferimento. In questo modo, se qualche junior decide di modificare un po' i dati dell'utente, i vostri test diranno: \u00abVa bene, qui e qui ci sono alcune modifiche \u2013 \u00e8 normale\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/7e69ec1b2c04710066d93ee48f872254.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il prossimo argomento di cui vorrei parlare \u00e8 Automate Terraform apply.<\/p>\n<p><\/p>\n<p>Certo, \u00e8 piuttosto spaventoso eseguire Terraform apply in modo automatico, perch\u00e9 chi sa quali cambiamenti sono stati introdotti e quanto possano essere dannosi per l'infrastruttura live. <\/p>\n<p><\/p>\n<p>Per un ambiente di test va bene. Cio\u00e8, il job che crea un ambiente di test \u00e8 ci\u00f2 di cui tutti gli sviluppatori hanno bisogno. E l\u2019espressione \u00abtutto funzionava\u00bb non \u00e8 un meme divertente, ma la prova che qualcuno si \u00e8 impegnato, ha sollevato un stack, ha eseguito dei test su quello stack e si \u00e8 assicurato che fosse tutto a posto, dicendo: \u00abOk, il codice che sto rilasciando \u00e8 stato testato\u00bb.<\/p>\n<p><\/p>\n<p>In ambienti di produzione, sandbox e altri ambienti importanti per il business, \u00e8 possibile applicare alcuni resource parzialmente in modo relativamente sicuro, perch\u00e9 non porta a situazioni critiche. Questi includono: gruppi di autoscale, gruppi di sicurezza, ruoli, route53 e la lista pu\u00f2 essere piuttosto ampia. Ma fate attenzione a ci\u00f2 che sta accadendo, leggete i report sulle applicazioni automatiche. <\/p>\n<p><\/p>\n<p>Dove \u00e8 pericoloso o ci si sente esitanti, ad esempio, quando si tratta di risorse persistenti, come i database, \u00e8 possibile ricevere report su modifiche non applicate in una certa parte dell'infrastruttura. E l'ingegnere, sotto supervisione, avvia jobs per applicarle o lo fa dalla sua console. <\/p>\n<p><\/p>\n<p>In Amazon c'\u00e8 una funzionalit\u00e0 chiamata Terminate protection. Questa pu\u00f2 proteggere in alcuni casi da modifiche indesiderate per te. Vale a dire, Terraform va su Amazon e dice: \u00abHo bisogno di terminare questo instance per crearne un altro\u00bb. E Amazon risponde: \u00abScusa, non oggi. Abbiamo attivato la Terminate protection\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/9f4258d8688556829586a1e308f5a1e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E la ciliegina sulla torta \u00e8 l'ottimizzazione del codice. Quando lavoriamo con il codice Terraform, dobbiamo passare al modulo un numero molto elevato di parametri. Questi sono i parametri necessari per creare una certa risorsa. E il codice si trasforma in grandi elenchi di parametri da passare da un modulo all'altro, soprattutto se i moduli sono nidificati. <\/p>\n<p><\/p>\n<p>E questo \u00e8 molto difficile da leggere. \u00c8 molto complicato fare una review. Spesso succede che alcuni parametri superano la revisione e non sono esattamente quelli necessari. Questo comporta tempo e denaro per correggerli in seguito.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/ad7e8a91692212fda9f2561854b881c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pertanto, vi consiglio di utilizzare una cosa come un parametro complesso, che include un albero di valori. Cio\u00e8, avete bisogno di una cartella in cui sono specificati tutti i valori che desiderate avere in un determinato ambiente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/909632949eb30057bf86b116239d9077.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Chiamando questo modulo, si pu\u00f2 ottenere un albero che viene generato in un unico modulo generale, cio\u00e8 in un modulo comune che funziona in modo uniforme per tutta l'infrastruttura.<\/p>\n<p><\/p>\n<p>In questo modulo \u00e8 possibile eseguire alcuni calcoli, utilizzando una nuova funzionalit\u00e0 in Terraform, chiamata locals. E poi, con un output, fornire un parametro complesso che pu\u00f2 includere hash, array, ecc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/25c14e0397f8d95c301e0dfe6ae761df.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Queste sono tutte le migliori scoperte che ho. Vorrei raccontarvi una storia su Colombo. Quando cercava fondi per la sua spedizione per scoprire l'India (come pensava allora), nessuno gli credeva e lo considerava impossibile. Allora disse: \u00abFate in modo che l'uovo non cada\u00bb. Tutti i banchieri, persone molto ricche e probabilmente intelligenti, cercarono in ogni modo di mettere l'uovo in piedi, ma continuava a cadere. Poi Colombo prese l'uovo, ci fece un po' di pressione. Il guscio si schiacci\u00f2 e l'uovo rimase immobile. Dissero: \u00abOh, \u00e8 troppo semplice!\u00bb. E Colombo rispose: \u00abS\u00ec, \u00e8 troppo semplice. E quando scoprir\u00f2 l'India, tutti useranno questa via commerciale.\u00bb <\/p>\n<p><\/p>\n<p>E ci\u00f2 che vi ho raccontato ora sono probabilmente cose abbastanza semplici e banali. E quando le conosci e inizi a usarle, diventa del tutto normale. Quindi sfruttateli. E se per voi sono cose del tutto normali, almeno sapete come mettere l'uovo in modo che non cada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/37bf83d04b99f089f2319c8d2e8aaeb4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ricapitolando: <\/p>\n<p><\/p>\n<ul>\n<li>Cercate di evitare le 'palle di neve'. Meno neve ci sono, meno risorse vi serviranno per apportare modifiche alla vostra grande infrastruttura. <\/li>\n<li>Modifiche continue. Quando ci sono state modifiche nel codice, \u00e8 necessario adattare la vostra infrastruttura a queste modifiche il pi\u00f9 rapidamente possibile. Non deve esserci la situazione in cui qualcuno torna dopo due o tre mesi per controllare Elasticsearch, esegue un piano Terraform e si trova di fronte a numerosi cambiamenti inaspettati. Questo comporta un notevole dispendio di tempo per riportare tutto in ordine. <\/li>\n<li>Test e automazione. Pi\u00f9 codice avete coperto da test e funzionalit\u00e0, maggiore sar\u00e0 la vostra fiducia nel fatto che state facendo tutto correttamente. La consegna automatica aumenter\u00e0 notevolmente la vostra fiducia. <\/li>\n<li>Il codice per l'ambiente di test e quello di produzione deve essere praticamente identico. Praticamente, perch\u00e9 l'ambiente di produzione \u00e8 comunque un po' diverso e ci saranno sempre delle particolarit\u00e0 che esulano dall'ambiente di test. Tuttavia, \u00e8 possibile garantire una certa approssimazione. <\/li>\n<li>E se hai molto codice Terraform e richiede tanto tempo mantenerlo aggiornato, non \u00e8 mai troppo tardi per rifattorizzarlo e portarlo in buone condizioni. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/68f3946536f44eed33939b234fb3ca0d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Infrastruttura immutabile. Consegna dell'AMI secondo un programma. <\/li>\n<li>Struttura per Route53, quando hai molte registrazioni e vuoi che siano in ordine coerente. <\/li>\n<li>Affrontare i limiti di richiesta API. \u00c8 quando Amazon dice: \u00abBasta, non posso accettare altre richieste, per favore aspetta\u00bb. E mezza azienda aspetta di poter avviare la propria infrastruttura. <\/li>\n<li>Spot instances. Amazon non \u00e8 economico e gli spot consentono di risparmiare molto. E si potrebbe tenere un intero discorso su questo. <\/li>\n<li>Sicurezza e ruoli IAM. <\/li>\n<li>Ricerca di risorse perse, quando hai in Amazon istanze di origine sconosciuta che consumano denaro. Anche se un'istanza costa 100-150 dollari al mese, in un anno sono pi\u00f9 di 1.000. Trovare tali risorse \u00e8 un'attivit\u00e0 redditizia. <\/li>\n<li>E le istanze riservate. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens)\" src=\"\/wp-content\/uploads\/2020\/10\/69ddbf4c726bcc15aea1a1e2d67a3fc8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 tutto da parte mia. Terraform \u00e8 davvero fantastico, usatelo. Grazie!<\/p>\n<p><\/p>\n<p>Domande<\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Hai il file di stato in S3, ma come risolvi il problema che pi\u00f9 persone possono prendere questo file di stato e cercare di effettuare il deploy?<\/em><\/p>\n<p><\/p>\n<p>In primo luogo, non ci affrettiamo. In secondo luogo, ci sono flag in cui comunichiamo che stiamo lavorando su un certo segmento di codice. Cio\u00e8, anche se l'infrastruttura \u00e8 molto grande, non significa che qualcuno stia sempre applicando qualcosa. Durante la fase attiva, questo era un problema, poich\u00e9 i nostri file di stato erano conservati in Git. Questo era importante, altrimenti qualcuno avrebbe creato un file di stato e dovevamo raccoglierli manualmente per continuare. Ora non ci sono pi\u00f9 problemi di questo tipo. In effetti, Terraform ha risolto questo compito. E se ci sono cambiamenti costanti, si possono utilizzare i lock che prevengono ci\u00f2 che hai menzionato.<\/p>\n<p><\/p>\n<p><em>Stai utilizzando la versione open o enterprise?<\/em><\/p>\n<p><\/p>\n<p>Nessun enterprise, cio\u00e8 tutto ci\u00f2 che si pu\u00f2 scaricare gratuitamente. <\/p>\n<p><\/p>\n<p><em>Mi chiamo Stanislav. Vorrei fare un piccolo aggiunta. Hai parlato della funzionalit\u00e0 di Amazon che consente di rendere un'istanza indistruttibile. Questo esiste anche in Terraform, nel blocco Life Second si pu\u00f2 scrivere un divieto di modifica o di distruzione.<\/em> <\/p>\n<p><\/p>\n<p>Il tempo era limitato. Buona osservazione. <\/p>\n<p><\/p>\n<p><em>Volevo anche chiedere due cose. Prima di tutto, hai parlato dei test. Hai utilizzato qualche strumento per i test? Ho sentito parlare del plugin Test Kitchen. Forse ce n'\u00e8 qualcun altro. E vorrei chiedere anche dei Local Values. In cosa si differenziano fondamentalmente dalle Input Variables? E perch\u00e9 non posso parametrizzare qualcosa solo tramite i Local Values? Ho cercato di capire questo argomento, ma non ci sono riuscito.<\/em><\/p>\n<p><\/p>\n<p>Possiamo parlare pi\u00f9 in dettaglio di questo nel corridoio. Gli strumenti per i test sono completamente homemade. Non c'\u00e8 nulla di specifico da testare. In effetti, ci sono opzioni in cui i test automatici creano l'infrastruttura da qualche parte, verificano che sia a posto e poi distruggono tutto con un report che conferma che la tua infrastruttura \u00e8 ancora in buone condizioni. Noi non abbiamo questo, perch\u00e9 i stack di test vengono avviati ogni giorno. E questo \u00e8 sufficiente. Se qualcosa inizia a rompersi, comincer\u00e0 a rompersi senza che dobbiamo ancora verificarlo da qualche parte. <\/p>\n<p><\/p>\n<p>Per quanto riguarda i Local Values, continuiamo a discuterne nel corridoio. <\/p>\n<p><\/p>\n<p><em>Ciao! Grazie per la presentazione! \u00c8 stato molto interessante. Hai detto che avete molto codice simile per descrivere l'infrastruttura. Non avete mai considerato l'idea di generare questo codice?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda, grazie! Il fatto \u00e8 che, quando utilizziamo l'infrastruttura come codice, presumiamo di guardare il codice e di comprendere quale infrastruttura ci sia dietro di esso. Se il codice viene generato, dobbiamo immaginare quale codice verr\u00e0 creato per capire quale infrastruttura ci sar\u00e0. O generiamo il codice, lo committiamo e, in sostanza, otteniamo lo stesso risultato. Quindi abbiamo seguito il percorso che abbiamo scritto e abbiamo ottenuto questo. In pi\u00f9, i generatori sono emersi un po' pi\u00f9 tardi, quando abbiamo iniziato a lavorare. E ormai era troppo tardi per cambiare.<\/p>\n<p><\/p>\n<p><em>Hai sentito parlare di jsonnet?<\/em><\/p>\n<p><\/p>\n<p>No. <\/p>\n<p><\/p>\n<p><em>Guarda, \u00e8 una cosa davvero interessante. Vedo un caso specifico in cui possiamo applicarlo e generare una struttura dati.<\/em> <\/p>\n<p><\/p>\n<p>I generatori sono utili, ma come nella barzelletta sulla macchina da barba. Cio\u00e8, la prima volta i volti sono diversi, ma poi tutti hanno lo stesso viso. I generatori funzionano molto bene. Ma noi, sfortunatamente, abbiamo facce un po' diverse. Questo \u00e8 un problema. <\/p>\n<p><\/p>\n<p><em>Dai un'occhiata. Grazie!<\/em><\/p>\n<p><\/p>\n<p><em>Mi chiamo Maxim, vengo da Sberbank. Avete accennato a come stavate cercando di rendere Terraform simile a un linguaggio di programmazione. Non sarebbe pi\u00f9 semplice usare Ansible?<\/em><\/p>\n<p><\/p>\n<p>Sono cose molto diverse. Puoi creare risorse sia con Ansible che con Puppet su Amazon. Ma Terraform \u00e8 specificamente progettato per questo. <\/p>\n<p><\/p>\n<p><em>Avete solo Amazon?<\/em><\/p>\n<p><\/p>\n<p>Non \u00e8 solo che abbiamo solo Amazon. Abbiamo quasi esclusivamente Amazon. Ma la caratteristica principale \u00e8 che Terraform tiene traccia. In Ansible, se dici: 'Alza 5 istanze', le alza, poi dici: 'Ora ne ho bisogno di 3'. E Terraform dir\u00e0: 'Ok, ne eliminer\u00f2 2', mentre Ansible dir\u00e0: 'Ok, ecco 3'. In totale, 8.<\/p>\n<p><\/p>\n<p><em>Buongiorno! Grazie per la vostra presentazione! \u00c8 stato molto interessante ascoltare parlare di Terraform. Vorrei subito fare un piccolo commento riguardo al fatto che Terraform non ha ancora una release stabile, quindi dovete prestarci attenzione.<\/em><\/p>\n<p><\/p>\n<p>Buon tempo per mangiare. Cio\u00e8, se hai bisogno di una soluzione, a volte metti da parte ci\u00f2 che \u00e8 instabile, ecc., ma funziona e ci ha aiutato. <\/p>\n<p><\/p>\n<p><em>Ho una domanda. Usate un backend remoto, usate S3. Perch\u00e9 non usate il backend ufficiale?<\/em><\/p>\n<p><\/p>\n<p>Ufficiale?<\/p>\n<p><\/p>\n<p><em>Terraform Cloud.<\/em><\/p>\n<p><\/p>\n<p>Quando \u00e8 stato lanciato?<\/p>\n<p><\/p>\n<p><em>Circa 4 mesi fa.<\/em> <\/p>\n<p><\/p>\n<p>Se fosse comparso 4 anni fa, probabilmente avrei risposto alla tua domanda.<\/p>\n<p><\/p>\n<p><em>C'\u00e8 gi\u00e0 una funzione incorporata sia per i locks che per memorizzare il file di stato. Prova. Ma anche io non l'ho testata.<\/em><\/p>\n<p><\/p>\n<p>Stiamo viaggiando su un grande treno che si muove ad alta velocit\u00e0. Non si pu\u00f2 semplicemente prendere e buttare via alcuni vagoni. <\/p>\n<p><\/p>\n<p><em>Hai parlato di fiocchi di neve, ma perch\u00e9 non hai usato il branch? Perch\u00e9 non \u00e8 stato possibile farlo?<\/em><\/p>\n<p><\/p>\n<p>Abbiamo un approccio in cui tutta l'infrastruttura \u00e8 in un unico repository. Terraform, Puppet, tutti gli script che in qualche modo sono collegati a questo, sono tutti in un unico repository. In questo modo possiamo garantire che le modifiche incrementali siano testate una dopo l'altra. Se fosse una miriade di branch, un progetto del genere sarebbe praticamente impossibile da gestire. Passano sei mesi e si scostano cos\u00ec tanto che diventa davvero una punizione. \u00c8 qualcosa da cui si desidera scappare prima del refactoring. <\/p>\n<p><\/p>\n<p><em>Cio\u00e8, non funziona?<\/em><\/p>\n<p><\/p>\n<p>Non funziona affatto.<\/p>\n<p><\/p>\n<p>Nel branch ho rimosso il slide delle cartelle. Cio\u00e8, se creiamo una cartella per ciascun stack di test, ad esempio, per il team A \u2013 avr\u00e0 la sua cartella, per il team B la sua cartella, allora questo non funziona. Abbiamo creato un codice unificato per l'ambiente di test, che era abbastanza flessibile da adattarsi a tutti. In altre parole, gestivamo un unico codice. <\/p>\n<p><\/p>\n<p><em>Ciao! Mi chiamo Yura! Grazie per la presentazione! Ho una domanda sui moduli. Dite che utilizzate i moduli. Come gestite la situazione se in un modulo apportate modifiche che non sono compatibili con le modifiche di qualcun altro? Versionate in qualche modo i moduli o cercate di adattare il sistema per soddisfare entrambe le esigenze?<\/em><\/p>\n<p><\/p>\n<p>Questo \u00e8 un problema di grande accumulo di neve. \u00c8 ci\u00f2 di cui soffriamo quando una modifica apparentemente innocua pu\u00f2 rompere una parte dell'infrastruttura. E questo sar\u00e0 evidente solo dopo un certo tempo.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, non c'\u00e8 ancora una soluzione?<\/em><\/p>\n<p><\/p>\n<p>Create moduli universali. Evitate le modifiche specifiche. E il tutto funzioner\u00e0. La seconda parte della presentazione riguarda come evitarlo.<\/p>\n<p><\/p>\n<p><em>Ciao! Grazie per la presentazione! Vorrei chiarire. Dietro le quinte \u00e8 rimasta una grande quantit\u00e0 di lavoro, per cui sono qui. In che modo Puppet e la distribuzione dei ruoli sono integrati?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, semplicemente si estrae il file e si esegue in qualche modo?<\/em><\/p>\n<p><\/p>\n<p>User-data \u00e8 una nota, cio\u00e8 quando cloniamo un'immagine, viene avviato un Daemon che, cercando di capire chi \u00e8, legge la nota che dice che \u00e8 un load balancer.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, \u00e8 un processo separato che viene assegnato?<\/em><\/p>\n<p><\/p>\n<p>Non lo abbiamo inventato noi. Lo utilizziamo. <\/p>\n<p><\/p>\n<p><em>Ciao! Ho proprio una domanda su User-data. Hai detto che ci sono problemi, che qualcuno potrebbe inviare dati errati. Esiste qualche modo per memorizzare user-data nello stesso Git, per avere sempre chiaro a cosa fa riferimento User-data?<\/em><\/p>\n<p><\/p>\n<p>Generiamo dati utente da template. Cio\u00e8, vi entrano un certo numero di variabili. E Terraform genera il risultato finale. Pertanto, non si pu\u00f2 semplicemente guardare il template e dire cosa uscir\u00e0, perch\u00e9 tutti i problemi sono legati al fatto che lo sviluppatore pensa di trasmettere una stringa in questa variabile, mentre in realt\u00e0 arriva un array. E a quel punto \u2013 bam \u2013 sono, ecco, la riga successiva, e tutto si rompe. Se \u00e8 una nuova risorsa e una persona la sta creando, vedr\u00e0 che qualcosa non funziona, ma si risolve in fretta. Ma se \u00e8 stata aggiornata un gruppo di autoscale, a un certo punto le istanze nel gruppo di autoscale iniziano a cambiare. E boom, qualcosa smette di funzionare. \u00c8 frustrante.<\/p>\n<p><\/p>\n<p><em>Quindi, l'unica soluzione \u00e8 testare?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, vedi il problema, aggiungi dei passi di test. Cio\u00e8, si pu\u00f2 testare anche l'output. Forse non \u00e8 cos\u00ec comodo, ma si possono comunque mettere delle etichette - verifica che i dati utente siano ben fissati qui. <\/p>\n<p><\/p>\n<p><em>Mi chiamo Timur. \u00c8 fantastico che ci siano conferenze su come organizzare correttamente Terraform.<\/em><\/p>\n<p><\/p>\n<p>Non ho nemmeno iniziato.<\/p>\n<p><\/p>\n<p><em>Penso che alla prossima conferenza possa esserci. Ho una domanda semplice. Perch\u00e9 hardcodificare il valore in un modulo separato invece di usare tfvars? Cosa rende un modulo con valori migliore di tfvars?<\/em><\/p>\n<p><\/p>\n<p>Cio\u00e8, devo scrivere qui (slide: Production\/environment\/settings.tf): domain = variabile, domain vpcnetwork, variabile vpcnetwork e stvars \u2013 per ottenere la stessa cosa?<\/p>\n<p><\/p>\n<p><em>Esattamente cos\u00ec stiamo facendo. Facciamo riferimento al modulo di impostazione sorgente, per esempio.<\/em><\/p>\n<p><\/p>\n<p>Fondamentalmente, \u00e8 come un tfvars. Tfvars \u00e8 molto utile nell'ambiente di testing. Ho tfvars per istanze grandi e per istanze piccole. E ho inserito un file nella cartella. E ho ottenuto quello che volevo. Quando lavoriamo sull'infrastruttura, vogliamo che sia facile da capire a colpo d'occhio. Invece, cos\u00ec facendo, \u00e8 necessario controllare qui e poi dare un'occhiata in tfvars.<\/p>\n<p><\/p>\n<p><em>Quindi, per avere tutto in un unico posto?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, tfvars \u00e8 quando hai un codice unico. E viene utilizzato in diversi contesti con variazioni. Allora metteresti tfvars e otterresti le tue specifiche. Noi invece trattiamo l'infrastruttura come codice in modo puro. Dai un'occhiata e capisci. <\/p>\n<p><\/p>\n<p><em>Ciao! Ti \u00e8 mai capitato che un provider di cloud interferisse con ci\u00f2 che hai fatto con Terraform? Supponiamo di modificare alcuni metadati. Ci sono delle chiavi ssh. E Google continua a inserire i suoi metadati, le sue chiavi. E Terraform continua a dire che ci sono delle modifiche. Dopo ogni esecuzione, anche se non cambia nulla, continua a comunicare che sta per aggiornare quel campo.<\/em><\/p>\n<p><\/p>\n<p>Con le chiavi, s\u00ec, ma parte dell'infrastruttura \u00e8 colpita da questo problema, cio\u00e8 Terraform non pu\u00f2 modificare nulla. Neanche noi possiamo apportare modifiche manualmente. Dobbiamo conviverci per ora.<\/p>\n<p><\/p>\n<p><em>Quindi hai gi\u00e0 affrontato situazioni simili, ma non hai trovato soluzioni? Continua a fare e fare da solo?<\/em><\/p>\n<p><\/p>\n<p>Sfortunatamente, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Ciao! Mi chiamo Stanislav Starkov. Mail.ru Group. Come risolvi il problema con la generazione del tag su ..., come lo trasmetti internamente? Presumo che utilizzi User-data per indicare il nome dell'host, per indirizzare Puppet? E la seconda parte della domanda. Come affronti questa questione negli SG, cio\u00e8 quando generi SG, centinaia di istanze simili, come le nomini correttamente?<\/em><\/p>\n<p><\/p>\n<p>Le istanze che per noi sono molto importanti, le denominiamo in modo significativo. Quelle che non servono, hanno un nome con la dicitura di gruppo autoscale. In teoria, queste possono essere rimosse per ottenere una nuova istanza. <\/p>\n<p><\/p>\n<p>Riguardo al problema con i tag, non si tratta di un problema, ma di una necessit\u00e0. I tag vengono utilizzati in modo molto intenso, poich\u00e9 l'infrastruttura \u00e8 grande e costosa. Dobbiamo monitorare dove vengono spesi i soldi, quindi i tag ci consentono di analizzare dove e come vengono spesi. Di conseguenza, possiamo identificare dove si spendono molti soldi. <\/p>\n<p><\/p>\n<p>Quale era l'altra domanda?<\/p>\n<p><\/p>\n<p><em>Quando SG crea cento istanze, bisogna differenziarle in qualche modo?<\/em><\/p>\n<p><\/p>\n<p>No, non \u00e8 necessario. Ogni istanza ha un agente che segnala se ha un problema. Se l'agente fa una segnalazione, lui stesso lo sa e, almeno, esiste il suo indirizzo IP. Gi\u00e0 possiamo intervenire. Inoltre, utilizziamo Consul per il Discovery, dove non c'\u00e8 Kubernetes. E Consul mostra anche l'indirizzo IP dell'istanza.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, vi basate sull'IP e non sul nome host?<\/em><\/p>\n<p><\/p>\n<p>Non \u00e8 possibile basarsi sul nome host, ce ne sono davvero troppi. Esistono identificatori di istanza \u2013 come AE, ecc. Pu\u00f2 essere trovato da qualche parte o pu\u00f2 essere cercato. <\/p>\n<p><\/p>\n<p><em>Ciao! Ho capito che Terraform \u00e8 una buona cosa, progettata per il cloud.<\/em> <\/p>\n<p><\/p>\n<p>Non solo. <\/p>\n<p><\/p>\n<p><em>\u00c8 proprio questa domanda che mi interessa. Se decidessi di migrare, per esempio, verso Bare Metal con tutti i tuoi instances? Non ci sarebbero problemi? Oppure dovresti usare altri prodotti, come Ansible, che \u00e8 stato menzionato qui?<\/em><\/p>\n<p><\/p>\n<p>Ansible \u00e8 un po' diverso. Cio\u00e8, Ansible funziona quando l'instance \u00e8 gi\u00e0 avviata. Terraform funziona prima che l'instance sia avviata. La migrazione a Bare Metal non \u00e8 prevista. <\/p>\n<p><\/p>\n<p><em>Attualmente no, ma potrebbe capitare che l'azienda dica: \u00abFacciamolo\u00bb.<\/em><\/p>\n<p><\/p>\n<p>La migrazione a un altro cloud s\u00ec, ma qui c'\u00e8 un'altra questione. Bisogna scrivere il codice Terraform in modo che la transizione a un altro cloud avvenga con minor difficolt\u00e0. <\/p>\n<p><\/p>\n<p>Inizialmente, l'obiettivo era che tutta la nostra infrastruttura fosse agnostica, ovvero qualsiasi cloud dovesse andare bene, ma a un certo punto l'azienda ha ceduto e ha detto: \u00abOk, nei prossimi N anni non ci muoveremo, possiamo usare i servizi di Amazon\u00bb.<\/p>\n<p><\/p>\n<p>Terraform consente di creare lavori nel Front-End, configurare PagerDuty, doc data, e cos\u00ec via. Ha molte funzionalit\u00e0. Pu\u00f2 praticamente controllare il mondo intero.<\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Anche io utilizzo Terraform da 4 anni. Durante la fase di transizione verso Terraform, verso l'infrastruttura e la descrizione dichiarativa, ci siamo trovati di fronte a situazioni in cui qualcuno faceva qualcosa manualmente, mentre tu cercavi di eseguire un plan. E ricevevi qualche errore. Come affrontate questi problemi? Come trovate le risorse perse che erano indicate?<\/em><\/p>\n<p><\/p>\n<p>Principalmente a mano e con gli occhi, se vediamo qualcosa di strano nel report, analizziamo cosa sta succedendo, oppure semplicemente eliminiamo. E in generale, le pull request sono una prassi comune. <\/p>\n<p><\/p>\n<p><em>Se c'\u00e8 un errore, fate il rollback? Avete mai provato a farlo?<\/em><\/p>\n<p><\/p>\n<p>No, \u00e8 una decisione che spetta alla persona nel momento in cui vede il problema.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/524712\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":98124,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-98123","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=\"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441\" \/>\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\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens\" \/>\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=\"2020-10-24T12:42:52+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:49+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\udd47Pattern in Terraform per combattere il caos e la routine manuale. Maxim Kostrykin (Ixtens) | ProHoster","description":"Sembra che gli sviluppatori di Terraform offrano best practices abbastanza comode per lavorare con l'infrastruttura AWS. Solo che c'\u00e8 un dettaglio. Col passare del tempo, il numero di ambienti aumenta, ognuno con le proprie peculiarit\u00e0. Nasce quasi una copia del stack delle applicazioni in una regione vicina. E il codice Terraform deve essere attentamente copiato e modificato secondo i nuovi requisiti, oppure deve diventare una 'snowflake'. La mia presentazione riguarda i pattern in Terraform per affrontare","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441 \u0445\u0430\u043e\u0441\u043e\u043c \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0440\u0443\u0442\u0438\u043d\u043e\u0439. \u041c\u0430\u043a\u0441\u0438\u043c \u041a\u043e\u0441\u0442\u0440\u0438\u043a\u0438\u043d (Ixtens) | ProHoster","og:description":"\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Terraform \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0435 best practices \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 AWS-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439. \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043f\u0438\u044f \u0441\u0442\u0435\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435. \u0418 Terraform-\u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u043e\u0432\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043d\u0435\u0436\u0438\u043d\u043a\u0443. \u041c\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432 Terraform \u0434\u043b\u044f \u0431\u043e\u0440\u044c\u0431\u044b \u0441","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/patterny-v-terraform-dlya-borby-s-haosom-i-ruchnoj-rutinoj-maksim-kostrikin-ixtens","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":"2020-10-24T12:42:52+00:00","article:modified_time":"2020-11-17T22:58:49+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"98123","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:04:35","updated":"2022-09-29 03:09:38"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/98123","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=98123"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/98123\/revisions"}],"predecessor-version":[{"id":164071,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/98123\/revisions\/164071"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/98124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=98123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=98123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=98123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}