{"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>A prima vista, gli sviluppatori di Terraform offrono best practices abbastanza comode per lavorare con l'infrastruttura AWS. Solo che c'\u00e8 una sfumatura. Col tempo, il numero di ambienti aumenta, ognuno con le proprie peculiarit\u00e0. Nasce quasi una copia dello stack applicativo in una regione vicina. E il codice Terraform deve essere copiato e modificato con attenzione secondo i nuovi requisiti o realizzare una snowflake.<\/p>\n<p><\/p>\n<p>La mia presentazione riguarda i pattern in Terraform per affrontare il caos e la routine manuale nei grandi progetti 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 in Ixtens. Ci occupiamo di ecommerce-driven-development. E da 5 anni pratico le 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 un'azienda, il cui nome non dir\u00f2, coprendomi con un accordo di riservatezza. <\/p>\n<p><\/p>\n<p>I numeri sulla slide sono indicati per comprendere la portata del progetto. Tutto ci\u00f2 di cui parler\u00f2 in seguito \u00e8 legato 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 nel bel mezzo si stava effettuando il refactoring dell'infrastruttura, perch\u00e9 il progetto era cresciuto. E i pattern utilizzati non erano pi\u00f9 adeguati. E considerando tutto il previsto aumento del progetto, era necessario pensare a qualcosa di nuovo. <\/p>\n<p><\/p>\n<p>Grazie a Matvey, che ieri ha raccontato cosa stava succedendo in Dodo Pizza. \u00c8 ci\u00f2 che accadeva da noi 4 anni fa. <\/p>\n<p><\/p>\n<p>Sono arrivati gli sviluppatori e hanno iniziato a creare codice infrastrutturale. <\/p>\n<p><\/p>\n<p>I motivi pi\u00f9 ovvi per cui ci\u00f2 era necessario erano legati al time to market. Bisognava fare in modo che il team DevOps non fosse un collo di bottiglia nel rilascio. E per di pi\u00f9, a livello iniziale, 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 dell'azienda HashiCorp. E per coloro che non sanno cosa sia, le prossime slide. <\/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 fare in modo che otteniamo 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=\"macchina virtuale\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"4196\">macchina virtuale<\/a>. Descriveremo, aggiungeremo 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 pianificare. Terraform pianificher\u00e0 e dir\u00e0: \u00abOk, per la vostra risorsa possiamo fare queste cose\u00bb. E, come minimo, una risorsa sar\u00e0 aggiunta. E non ci 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 sei soddisfatto, puoi chiedere a Terraform di applicare e Terraform creer\u00e0 un\u2019istanza per te, e otterrai 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 53 registrazioni.<\/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. Richiediamo un piano. Vediamo quali modifiche sono pianificate. Applichiamo. In questo modo, la nostra infrastruttura cresce. <\/p>\n<p><\/p>\n<p>Terraform utilizza un concetto chiamato file di stato. Cio\u00e8, tutte le modifiche che vengono inviate ad Amazon vengono salvate in un file, in cui per ogni risorsa che hai descritto, ci sono risorse corrispondenti create in Amazon. In questo modo, quando modifichi 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. E li archiviavamo in Git, il che era estremamente scomodo. Qualcuno dimenticava sempre di eseguire il commit delle modifiche, e si verificavano molti conflitti. <\/p>\n<p><\/p>\n<p>Ora \u00e8 possibile utilizzare un backend, cio\u00e8 si indica a Terraform in quale bucket e con quale chiave deve salvare il file di stato. E Terraform si prender\u00e0 cura di estrarre questo file di stato, fare tutta la magia e riporre 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 cresce. Ecco il nostro codice. Ora non vogliamo semplicemente 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 un modulo, cio\u00e8 descrivere la stessa cosa in una 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, nel test richiamare questo modulo e ottenere la stessa cosa come se avessimo eseguito Terraform apply nel modulo stesso. Per il test ci sar\u00e0 un codice di questo tipo.<\/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 nei test non abbiamo bisogno di grandi istanze; nella 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. E dovevamo in qualche modo organizzare tutto il codice, in modo che fosse conveniente per tutti: sia per coloro che effettuano la manutenzione di questo codice, sia per coloro che apportano modifiche. Si prevede che qualsiasi sviluppatore possa andare e modificare l'infrastruttura come \u00e8 necessario per la sua parte della piattaforma. <\/p>\n<p><\/p>\n<p>Questa \u00e8 la struttura ad albero dei cataloghi, raccomandata dalla stessa HashiCorp, se hai un grande progetto e ha senso suddividere l'intera infrastruttura in pezzi pi\u00f9 piccoli, descrivendo ogni pezzo in una cartella separata. <\/p>\n<p><\/p>\n<p>Avere una libreria ricca di risorse consente di richiamare in modo simile nei test e 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, ci\u00f2 non era del tutto adatto, poich\u00e9 il stack di test per gli sviluppatori o per il testing doveva essere ottenuto in modo pi\u00f9 semplice. Non volevamo dover navigare tra le cartelle e applicare in una sequenza specifica, preoccupandoci che il database si avviasse e poi si avviasse l'istanza che utilizza quel database. Pertanto, tutti i test venivano avviati da una sola cartella. L\u00ec venivano richiamati 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 necessario per poter ottenere, ad esempio, un indirizzo IP dall'istanza freschamente creata e per avere quel indirizzo IP in un record route53. <\/p>\n<p><\/p>\n<p>In aggiunta, la piattaforma \u00e8 molto grande. E avviare lo 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 questo processo. E il job di Jenkins consentiva di avviare lo stack. Doveva essere avviato un pull request con le modifiche che lo sviluppatore desiderava testare, specificando tutte le opzioni necessarie, i componenti e anche le dimensioni. Se desiderava testare le prestazioni, poteva richiedere pi\u00f9 istanze. Se doveva semplicemente verificare che un certo modulo si aprisse, poteva avviarlo con le impostazioni minime. Poteva anche specificare se aveva bisogno di un cluster o meno, ecc. <\/p>\n<p><\/p>\n<p>E poi Jenkins eseguiva uno script shell che modificava leggermente il codice nella cartella Terraform. Rimuoveva file non necessari e aggiungeva file richiesti. E poi, tramite un'unica esecuzione, Terraform apply alzava lo stack. <\/p>\n<p><\/p>\n<p>E poi seguivano altri passaggi, in cui non voglio addentrarmi. <\/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 avevamo bisogno di un po' pi\u00f9 di opzioni rispetto alla produzione, abbiamo dovuto creare copie dei moduli, in modo da poter aggiungere quelle funzionalit\u00e0 necessarie solo nel testing. <\/p>\n<p><\/p>\n<p>E cos\u00ec \u00e8 successo che nel testing si desiderava testare quelle modifiche che alla fine sarebbero andate in produzione. Ma in realt\u00e0 si testava una cosa e in produzione si applicava qualcos'altro. E c'era un piccolo divario di schemi, in quanto in produzione tutte le modifiche venivano applicate dal team operativo. E 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 in cui veniva aggiunto un nuovo servizio che si differenziava leggermente da uno gi\u00e0 esistente. E invece di modificare il modulo esistente, era necessario fare una copia e aggiungere le modifiche necessarie. <\/p>\n<p><\/p>\n<p>Fondamentalmente, Terraform non \u00e8 un vero linguaggio. \u00c8 una dichiarazione. Se dobbiamo 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, un collega ha detto che non era necessario creare troppi fiocchi di neve. Sono rimasto incuriosito da cosa intendesse. C'\u00e8 un fatto scientifico che nel mondo non esistono due fiocchi di neve identici, si differenziano sempre un po'. E non appena ho ascoltato questa cosa, ho subito percepito tutto il peso del codice Terraform. Perch\u00e9 quando era necessario passare da una versione all'altra, Terraform richiedeva modifiche che spezzavano la catena, cio\u00e8 il codice non era pi\u00f9 compatibile con la versione successiva. Cos\u00ec dovevo fare una pull request che copriva quasi met\u00e0 dei file nell'infrastruttura per portare l'infrastruttura alla versione successiva 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 una grande grande massa di neve. <\/p>\n<p><\/p>\n<p>Per uno sviluppatore esterno, che non fa parte dell'operazione, questo non ha molta importanza, perch\u00e9 ha fatto la pull request e la sua risorsa \u00e8 partita. E tutto, poi non \u00e8 pi\u00f9 affare suo. Ma per il team DevOps, che si assicura che tutto sia a posto, bisogna fare tutte queste modifiche. E il costo di queste modifiche aumentava molto con ogni ulteriore fiocco di neve.<\/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 come uno studente durante un seminario disegna con il gesso sulla lavagna due cerchi perfetti. E il docente si sorprende di come sia riuscito a disegnarli cos\u00ec bene senza compasso. Lo studente risponde: '\u00c8 molto semplice, ho girato un macinacarne per due anni nell'esercito'. <\/p>\n<p><\/p>\n<p>E dei quattro anni in cui partecipo a questo progetto, circa due anni mi occupo di Terraform. E, naturalmente, ho alcuni trucchi, alcuni consigli su come semplificare il codice Terraform, lavorarci come un linguaggio di programmazione e ridurre il carico sui programmatori che devono mantenere questo codice 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>La prima cosa da cui vorrei iniziare sono i Symlinks. Terraform ha molto codice ripetitivo. Ad esempio, la chiamata al provider praticamente in ogni punto in cui creiamo un pezzo di infrastruttura \u00e8 la stessa. Quindi \u00e8 logico estrarla in una cartella separata. E ovunque sia necessario il provider, fare Symlinks su questo 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, nel tuo ambiente di produzione utilizzi un'assunzione di ruolo, che ti consente di ottenere diritti di accesso a un determinato account Amazon esterno. E cambiando un file, tutti gli altri che si trovano nell'albero delle risorse avranno i diritti richiesti affinch\u00e9 Terraform sapesse a quale segmento Amazon fare riferimento. <\/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 i Symlinks non funzionano? Come gi\u00e0 detto, in Terraform ci sono file di stato. E sono davvero molto utili. Ma il fatto \u00e8 che Terraform inizializza il backend prima di ogni altra cosa. E non pu\u00f2 utilizzare in questi parametri alcuna variabile, devono sempre essere scritti come testo. <\/p>\n<p><\/p>\n<p>E come risultato, quando qualcuno crea una nuova risorsa, copia una parte del codice da altre cartelle. E pu\u00f2 commettere un errore con la chiave o con il bucket. Ad esempio, crea una cosa sandbox e poi la fa in produzione. E potrebbe capitare che il bucket in produzione venga utilizzato dalla sandbox. Certo, questo verr\u00e0 scoperto rapidamente. Si potr\u00e0 correggere in qualche modo, ma comunque \u00e8 una perdita di tempo e in una certa 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 successivamente? Prima di lavorare con Terraform, bisogna inizializzarlo. Durante il processo di inizializzazione, Terraform scarica tutti i plugin. A un certo punto, da un monolite si sono spezzati in un'architettura pi\u00f9 microservizi. E bisogna sempre eseguire Terraform init, affinch\u00e9 possa caricare tutti i moduli, tutti i plugin.<\/p>\n<p><\/p>\n<p>E puoi utilizzare uno script shell che, da un lato, sar\u00e0 in grado di recuperare tutte le variabili. Gli script shell non hanno limitazioni. E, dall'altro, i percorsi. Se utilizziamo sempre quello che \u00e8 presente nel repository come chiave per il file di stato, allora, 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? 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>Il JSON \u00e8 facilmente leggibile dallo script shell. Di conseguenza, \u00e8 possibile posizionare un file di configurazione con il bucket in un certo 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 remoti. Cio\u00e8, quando sollevo qualche risorsa, per dire ad Amazon: \u00abPer favore, crea un'istanza\u00bb, devo specificare molti parametri obbligatori. <\/p>\n<p><\/p>\n<p>E questi identificatori sono memorizzati in un'altra cartella. Posso dire: \u00abTerraform, vai per favore nel file di stato di quella risorsa e portami questi identificatori\u00bb. In questo modo si ottiene 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 crea una VPC cos\u00ec diversa, che ti ci vorr\u00e0 molto tempo per adattare una cosa all'altra, quindi puoi utilizzare il trucco successivo. <\/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 in pratica crea la VPC e fornisce gli identificatori, ma in realt\u00e0 c'\u00e8 semplicemente un file con valori hardcoded, che pu\u00f2 essere usato per creare la stessa istanza.<\/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 sempre \u00e8 necessario salvare il file di stato nel cloud. Ad esempio, quando vengono testati i moduli, \u00e8 possibile utilizzare l'inizializzazione del backend, in cui il file verr\u00e0 salvato semplicemente sul disco durante il 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' di testing. 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 comprensione di come formattare il codice Terraform. Terraform fmt consente di formattare il codice che stai modificando in conformit\u00e0 a questa guida. Pertanto, i test devono necessariamente verificare se la formattazione corrisponde a quella stabilita da HashiCorp, per non dover cambiare la posizione delle parentesi e cos\u00ec via. <\/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. Fa qualcosa in pi\u00f9 che una semplice verifica della sintassi, tipo controllare se tutte le parentesi sono abbinate. Cosa \u00e8 importante qui? La nostra infrastruttura \u00e8 molto ramificata. Ci sono molte cartelle diverse. E in ognuna \u00e8 necessario eseguire Terraform validate.<\/p>\n<p><\/p>\n<p>Pertanto, per accelerare il testing, eseguiamo pi\u00f9 processi in parallelo, utilizzando la parallelizzazione. <\/p>\n<p><\/p>\n<p>Il parallelo \u00e8 una cosa molto utile, sfruttatelo.<\/p>\n<p><\/p>\n<p>Ma ogni volta che si verifica l'inizializzazione di Terraform, va su HashiCorp e chiede: \u00abQuali sono le versioni pi\u00f9 recenti dei plugin? E quel plugin che ho in cache \u2013 \u00e8 quello giusto o no?\u00bb. E questo rallentava 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 \u00e8 informato su dove si trovano i plugin, dir\u00e0: \u00abOk, probabilmente quella \u00e8 la versione pi\u00f9 recente. Non andr\u00f2 da nessuna parte, inizier\u00f2 subito a validare 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 indicare tutti i provider che in qualche modo partecipano 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 il Terraform plan. Come ho detto, lo sviluppo \u00e8 ciclico. Scriviamo il codice con delle modifiche. E poi dobbiamo scoprire quali modifiche sono previste per l'infrastruttura. <\/p>\n<p><\/p>\n<p>E quando l'infrastruttura \u00e8 molto, molto grande, puoi modificare un modulo, riparare un ambiente di test o un singolo regione e rompere qualche vicino. Pertanto, il Terraform plan deve essere eseguito su tutta l'infrastruttura e mostrare quali modifiche sono previste.<\/p>\n<p><\/p>\n<p>Possiamo farlo in modo intelligente. Ad esempio, abbiamo scritto uno script in Python che risolve le dipendenze. E a seconda di cosa \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 Terraform plan deve essere eseguito su richiesta. Almeno, \u00e8 ci\u00f2 che facciamo noi. <\/p>\n<p><\/p>\n<p>I test sono sicuramente utili per ogni modifica, per ogni commit, ma i piani sono abbastanza costosi. E noi nella pull request diciamo: \u00abPer favore, dammi i piani\u00bb. Si attiva un robot e invia nei commenti o in allegato tutti i piani previsti per le tue modifiche. <\/p>\n<p><\/p>\n<p>Il piano \u00e8 un'operazione piuttosto costosa. Richiede tempo, perch\u00e9 Terraform va su Amazon e chiede: \u00abQuesto instance esiste ancora? E per questo autoscale, le specifiche sono davvero quelle?\u00bb. E per velocizzare questo processo, si pu\u00f2 utilizzare un parametro come refresh=false. Questo significa che Terraform scaricher\u00e0 dallo stato 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 Terraform \u00e8 molto pi\u00f9 veloce, ma lo stato deve corrispondere alla vostra infrastruttura, cio\u00e8, da qualche parte, in un certo momento, deve essere eseguito Terraform refresh. Terraform refresh fa esattamente ci\u00f2 che serve affinch\u00e9 lo stato corrisponda a quello che c'\u00e8 nella reale infrastruttura. <\/p>\n<p><\/p>\n<p>E bisogna parlare di sicurezza. Da qui sarebbe stato opportuno iniziare. L\u00ec dove eseguite Terraform e Terraform lavora con la vostra infrastruttura, c'\u00e8 una vulnerabilit\u00e0. Cio\u00e8, in sostanza, state eseguendo codice. E se la richiesta di pull contiene del codice dannoso, questo pu\u00f2 essere eseguito sull'infrastruttura che ha troppi privilegi. Pertanto, 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>Il prossimo argomento di cui vorrei parlare \u00e8 il test di user-data.<\/p>\n<p><\/p>\n<p>Cos'\u00e8 user-data? Su Amazon, quando creiamo un'istanza, possiamo inviare dall'istanza una sorta di messaggio - metadati. Quando l'istanza si avvia, di solito cloud init \u00e8 sempre presente su queste istanze. Cloud init legge questo messaggio e dice: \"Ok, oggi sono un bilanciatore di carico\". E in conformit\u00e0 con queste istruzioni compie 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>Ma, sfortunatamente, quando facciamo Terraform plan e Terraform apply, user-data appare come una sorta di miscuglio di numeri. Cio\u00e8, vi invia semplicemente un hash. E tutto ci\u00f2 che potete 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 presta attenzione, su Amazon, potrebbe finire un qualche file di testo danneggiato nella vera infrastruttura. <\/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 opzione, potete specificare solo il template invece di tutta l'infrastruttura durante l'esecuzione. E nel codice dire: \"Per favore, mostrami questo template\". E alla fine potete 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 utilizzare un modulo per generare user-data. Applicate questo modulo. Ottenete un file sul disco. Lo confrontate con quello di riferimento. E in questo modo, se un principiante decide di modificare un po' user-data, i vostri test diranno: \"Ok, qui e qui ci sono delle modifiche - va bene\".<\/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 abbastanza spaventoso fare Terraform apply in modalit\u00e0 automatica, perch\u00e9, chi sa quali cambiamenti sono arrivati e quanto possano essere devastanti per l'infrastruttura in uso. <\/p>\n<p><\/p>\n<p>Per l'ambiente di test va tutto bene. Cio\u00e8, il job che crea l'ambiente di test \u00e8 ci\u00f2 di cui tutti gli sviluppatori hanno bisogno. E un'affermazione come \u00abtutto ha funzionato\u00bb non \u00e8 un meme divertente, ma una prova che la persona si \u00e8 impegnata, ha avviato lo stack, ha eseguito alcuni test su di esso. E si \u00e8 accertata che tutto va bene e ha detto: \u00abOk, il codice che sto rilasciando \u00e8 stato testato\u00bb.<\/p>\n<p><\/p>\n<p>In production, sandbox e altri ambienti che sono pi\u00f9 importanti per il business, \u00e8 possibile applicare parzialmente alcune risorse in modo abbastanza sicuro, perch\u00e9 non porta a situazioni in cui qualcuno muore. Questi sono: gruppi autoscale, gruppi di sicurezza, ruoli, route53 e l'elenco pu\u00f2 essere abbastanza lungo. Ma fai attenzione a ci\u00f2 che accade, leggi i report sulle applicazioni automatiche. <\/p>\n<p><\/p>\n<p>Dove \u00e8 pericoloso o si ha paura di applicare, per esempio, se si tratta di risorse persistenti o di database, allora ricevi report su eventuali modifiche non applicate in qualche parte dell'infrastruttura. E l'ingegnere, sotto supervisione, avvia i job per applicare o lo fa dalla propria console. <\/p>\n<p><\/p>\n<p>In Amazon esiste una funzione chiamata protezione dalla terminazione. Questa pu\u00f2 proteggerti in alcuni casi da modifiche non richieste. Cio\u00e8, Terraform si connette a Amazon e dice: \u00abDevo eliminare questa istanza per crearne un'altra\u00bb. E Amazon risponde: \u00abSpiacenti, non oggi. Abbiamo attivato la protezione dalla terminazione\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 modulo a modulo, da modulo a modulo, specialmente se i moduli sono annidati. <\/p>\n<p><\/p>\n<p>E questo \u00e8 molto difficile da leggere. \u00c8 molto complicato fare una revisione. E molto spesso succede che alcuni parametri passano la revisione, ma non sono proprio quelli necessari. Questo richiede tempo e denaro per essere corretto 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, ti propongo di utilizzare una cosa come un parametro complesso che include una sorta di albero di valori. Cio\u00e8, hai bisogno di una certa cartella in cui sono indicati tutti i valori che desideri 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>E chiamando questo modulo, si pu\u00f2 ottenere un albero che viene generato in un unico modulo generale, cio\u00e8 in un modulo generale che funziona allo stesso modo per tutta l'infrastruttura.<\/p>\n<p><\/p>\n<p>In questo modulo \u00e8 possibile effettuare alcuni calcoli, utilizzando questa nuova funzionalit\u00e0 in Terraform chiamata locals. E poi, con un output, restituire 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>A questo punto, tutte le migliori scoperte che ho sono esaurite. E vorrei raccontare una storia su Colombo. Quando cercava soldi per la sua spedizione per scoprire l'India (come pensava allora), nessuno credeva in lui e lo considerava impossibile. Allora disse: \"Fate in modo che l'uovo non cada\". Tutti i banchieri, persone molto ricche e probabilmente intelligenti, cercavano in tutti i modi di tenere in equilibrio l'uovo, e continuava a cadere. Allora Colombo prese l'uovo, premette un po'. Il guscio si ruppe, e l'uovo rimase fermo. Dissero: \"Oh, \u00e8 troppo semplice!\". E Colombo rispose: \"S\u00ec, \u00e8 troppo semplice. E quando scoprir\u00f2 l'India, tutti utilizzeranno questa rotta commerciale\". <\/p>\n<p><\/p>\n<p>E ci\u00f2 che vi ho appena raccontato sono probabilmente cose abbastanza semplici e banali. E quando ne vieni a conoscenza e inizi a utilizzarle, \u00e8 normale. Quindi, approfittatene. E se per voi queste cose sono assolutamente normali, almeno sapete come far s\u00ec che l'uovo 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>Facciamo un riepilogo: <\/p>\n<p><\/p>\n<ul>\n<li>Cercate di evitare le nevicate. E meno nevicate ci sono, meno risorse vi serviranno per apportare modifiche a tutta la vostra grande infrastruttura. <\/li>\n<li>Cambiamenti continui. Cio\u00e8, quando ci sono state delle modifiche nel codice, bisogna allineare la vostra infrastruttura a queste modifiche il prima possibile. Non deve esserci la situazione in cui qualcuno dopo due o tre mesi viene a vedere Elasticsearch, esegue un piano Terraform e trova un sacco di modifiche che non si aspettava. E si spende molto tempo per rimettere tutto in ordine. <\/li>\n<li>Test e automazione. Pi\u00f9 codice avete coperto da test e funzionalit\u00e0, maggiore sar\u00e0 la vostra sicurezza che state facendo tutto correttamente. E la consegna automatica aumenter\u00e0 notevolmente la vostra fiducia. <\/li>\n<li>Il codice per gli ambienti di test e produzione deve essere praticamente identico. Praticamente, perch\u00e9 la produzione \u00e8 comunque un po' diversa e ci saranno sempre alcuni dettagli che andranno oltre l'ambiente di test. Tuttavia, si pu\u00f2 comunque garantire una certa somiglianza. <\/li>\n<li>E se hai molto codice Terraform e mantenere questo codice aggiornato richiede molto tempo, non \u00e8 mai troppo tardi per fare un refactoring e riorganizzarlo in una forma migliore. <\/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 AMI programmata. <\/li>\n<li>Struttura per route53, quando hai molte registrazioni e desideri che siano in un ordine coerente. <\/li>\n<li>Gestire i limiti di API. \u00c8 quando Amazon dice: \u00abBasta, non posso accettare pi\u00f9 richieste, per favore aspetta\u00bb. E met\u00e0 dell'azienda aspetta finch\u00e9 non pu\u00f2 avviare la propria infrastruttura. <\/li>\n<li>Istanza spot. Amazon non \u00e8 un affare economico e le spot consentono di risparmiare molto. E si potrebbe tenere una presentazione su questo. <\/li>\n<li>Sicurezza e ruoli IAM. <\/li>\n<li>Ricerca di risorse perdute, quando hai in Amazon istanze di origine sconosciuta che consumano denaro. Anche se le istanze costano 100-150 dollari al mese, in un anno si accumulano pi\u00f9 di 1.000. La ricerca di queste risorse \u00e8 un affare redditizio. <\/li>\n<li>E 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>Per quanto mi riguarda, \u00e8 tutto. Terraform \u00e8 fantastico, usatelo. Grazie!<\/p>\n<p><\/p>\n<p>Domande<\/p>\n<p><\/p>\n<p><em>Grazie per la presentazione! Il vostro file di stato \u00e8 su S3, come risolvete il problema che pi\u00f9 persone potrebbero accedere a questo file di stato e tentare di eseguire il deployment?<\/em><\/p>\n<p><\/p>\n<p>In primo luogo, non abbiamo fretta. In secondo luogo, ci sono flag che indicano che stiamo lavorando su un certo pezzo di codice. Cio\u00e8, nonostante l'infrastruttura sia molto ampia, non significa che ci siano sempre persone che applicano modifiche. E quando la fase attiva era in corso, era un problema, i nostri file di stato erano archiviati in Git. Era importante, altrimenti qualcuno avrebbe creato un file di stato e dovevamo raccoglierli a mano per continuare. Adesso questo problema non esiste. In generale, Terraform ha risolto questa questione. E se ci sono frequenti cambiamenti, si possono utilizzare i lock che prevengono quanto hai detto.<\/p>\n<p><\/p>\n<p><em>Utilizzate la versione open source o l'enterprise?<\/em><\/p>\n<p><\/p>\n<p>Nessun enterprise, cio\u00e8 tutto ci\u00f2 che si pu\u00f2 andare a scaricare gratuitamente. <\/p>\n<p><\/p>\n<p><em>Mi chiamo Stanislav. Volevo fare una piccola aggiunta. Hai parlato di una funzione di Amazon che consente di rendere istanze indistruttibili. Questo \u00e8 presente anche in Terraform stesso, nel blocco Life Second \u00e8 possibile specificare un divieto di modifica o un divieto 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. In primo luogo, hai parlato di testing. Hai utilizzato qualche strumento per il testing? Ho sentito parlare del plugin Test Kitchen. Forse c\u2019\u00e8 qualcos\u2019altro. E vorrei anche chiedere riguardo ai Local Values. In cosa differiscono fondamentalmente dalle Input Variables? E perch\u00e9 non posso parametrizzare qualcosa solo attraverso i Local Values? Ho cercato di approfondire questo argomento, ma non ci sono riuscito.<\/em><\/p>\n<p><\/p>\n<p>Possiamo parlare pi\u00f9 nel dettaglio dopo questa sala. Gli strumenti per il testing qui sono una nostra creazione. Non ci sono nulla di particolare per testare. In realt\u00e0, ci sono opzioni in cui i test automatici alzano un'infrastruttura da qualche parte, controllano che vada bene e poi distruggono tutto con un report che indica che la tua infrastruttura \u00e8 ancora in buona forma. Noi non abbiamo questo, perch\u00e9 gli stack di test vengono eseguiti ogni giorno. E questo \u00e8 sufficiente. E se qualcosa inizia a rompersi, inizier\u00e0 a rompersi senza che dobbiamo verificarlo ulteriormente. <\/p>\n<p><\/p>\n<p>Per quanto riguarda i Local Values, continuiamo la conversazione dopo la sala. <\/p>\n<p><\/p>\n<p><em>Ciao! Grazie per la presentazione! \u00c8 stato molto istruttivo. Hai detto che avete molto codice simile per descrivere l'infrastruttura. Non avete considerato l'idea di generare questo codice?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda, grazie! Il punto \u00e8 che quando utilizziamo l'infrastruttura come codice, presupponiamo di guardare il codice e comprendere quale infrastruttura sta dietro quel codice. Se il codice \u00e8 generato, dobbiamo immaginarci quale codice verr\u00e0 generato per capire quale infrastruttura sar\u00e0 l\u00ec. Oppure generiamo il codice, lo committiamo e, in sostanza, \u00e8 la stessa cosa. Quindi abbiamo seguito il percorso che avevamo scritto, e cos\u00ec abbiamo ottenuto. Inoltre, i generatori sono emersi qualche tempo dopo, quando abbiamo iniziato a fare. Ed era gi\u00e0 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 pu\u00f2 essere applicato e generare una struttura di dati.<\/em> <\/p>\n<p><\/p>\n<p>I generatori sono buoni, quando hai, come nella barzelletta sulla macchina da barba. Cio\u00e8, la prima volta il viso \u00e8 diverso, ma poi diventa lo stesso per tutti. I generatori sono molto interessanti. Ma purtroppo, noi abbiamo volti un po' diversi. Questo \u00e8 il problema. <\/p>\n<p><\/p>\n<p><em>Guarda semplicemente. Grazie!<\/em><\/p>\n<p><\/p>\n<p><em>Mi chiamo Maxim, vengo da Sberbank. Hai detto un po' che cercavi di portare Terraform a un parallelo con un linguaggio di programmazione. Non \u00e8 pi\u00f9 facile usare Ansible?<\/em><\/p>\n<p><\/p>\n<p>Sono cose molto diverse. Puoi usare Ansible per creare risorse, e puoi usare Puppet per creare risorse in Amazon. Ma Terraform \u00e8 proprio ottimizzato per questo. <\/p>\n<p><\/p>\n<p><em>Avete solo Amazon?<\/em><\/p>\n<p><\/p>\n<p>Non \u00e8 che abbiamo solo Amazon. Abbiamo quasi solo Amazon. Ma la caratteristica chiave \u00e8 che Terraform memorizza. In Ansible, se dici: \"Alza 5 istanze\", lui lo fa, poi dici: \"Ora ne ho bisogno di 3\". E Terraform dir\u00e0: \"Ok, ne distrugger\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 dare un piccolo commento sul fatto che Terraform non ha comunque un rilascio stabile, quindi fate attenzione con Terraform.<\/em><\/p>\n<p><\/p>\n<p>La gallina in tempo. Cio\u00e8, se hai bisogno di una soluzione, a volte rimandi quello che \u00e8 instabile e cos\u00ec via, ma funziona ed \u00e8 stato utile per noi. <\/p>\n<p><\/p>\n<p><em>Ho una domanda. Usate il 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 apparso?<\/p>\n<p><\/p>\n<p><em>Circa 4 mesi fa.<\/em> <\/p>\n<p><\/p>\n<p>Se fosse apparso 4 anni fa, probabilmente avrei risposto alla tua domanda.<\/p>\n<p><\/p>\n<p><em>Ci sono gi\u00e0 funzioni integrate per i lock, e puoi memorizzare il file di stato. Provalo. Ma anche io non l'ho testato.<\/em><\/p>\n<p><\/p>\n<p>Stiamo viaggiando in un grande treno che si muove ad alta velocit\u00e0. E non puoi semplicemente prendere e buttare via diversi vagoni. <\/p>\n<p><\/p>\n<p><em>Hai parlato di fiocchi di neve, ma perch\u00e9 non hai usato i 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 si riferiscono 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 massa di branch, un progetto del genere sarebbe praticamente impossibile da gestire. Passano sei mesi e si allontanano tanto che \u00e8 semplicemente una punizione. Questo \u00e8 quello da cui si vorrebbe scappare fino al refactoring. <\/p>\n<p><\/p>\n<p><em>Cio\u00e8, non funziona?<\/em><\/p>\n<p><\/p>\n<p>Questo non funziona affatto.<\/p>\n<p><\/p>\n<p>Nella branch ho rimosso il slide della cartella. Cio\u00e8, se si fa un stack di test per ogni squadra, ad esempio, la squadra A ha la sua cartella, la squadra B la sua, allora non funziona neanche questo. Abbiamo creato un codice unificato per l'ambiente di test, che fosse abbastanza flessibile da adattarsi a tutti. Cio\u00e8, abbiamo gestito un unico codice. <\/p>\n<p><\/p>\n<p><em>Ciao! Mi chiamo Yuri! Grazie per la presentazione! Ho una domanda sui moduli. Dite che utilizzate i moduli. Come gestite la situazione se un modulo subisce cambiamenti che non sono compatibili con quelli di un altro? Versionate i moduli in qualche modo o cercate di adattare la soluzione per soddisfare entrambi i requisiti?<\/em><\/p>\n<p><\/p>\n<p>\u00c8 un problema della grande palla di neve. \u00c8 ci\u00f2 di cui soffriamo, quando un apparente cambiamento innocuo pu\u00f2 rompere una parte dell'infrastruttura. E questo sar\u00e0 notato solo dopo un certo periodo di tempo.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, al momento non viene risolto in alcun modo?<\/em><\/p>\n<p><\/p>\n<p>Fate moduli universali. Evitate le dipendenze crollanti. E tutto funzioner\u00e0. La seconda parte della presentazione riguarda come evitarlo.<\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! Vorrei chiarire. \u00c8 rimasta una grande questione di cui sono venuto a parlare. In che modo sono integrati Puppet e la distribuzione dei ruoli?<\/em><\/p>\n<p><\/p>\n<p>User-data.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, semplicemente estraete un file e in qualche modo lo eseguite?<\/em><\/p>\n<p><\/p>\n<p>User-data \u00e8 una nota, cio\u00e8 quando creiamo un clone dell'immagine, si avvia 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 qualche processo separato che viene assegnato?<\/em><\/p>\n<p><\/p>\n<p>Non l'abbiamo inventato noi. Lo utilizziamo. <\/p>\n<p><\/p>\n<p><em>Salve! Ho proprio una domanda su User-data. Ha detto che ci sono problemi, che qualcuno pu\u00f2 inviare informazioni sbagliate. Esiste un modo per memorizzare i dati utente nello stesso Git, in modo che sia sempre chiaro a cosa si sta riferendo User-data?<\/em><\/p>\n<p><\/p>\n<p>Generiamo User-data da template. Vale a dire, su di esso si basano un certo numero di variabili. E Terraform genera il risultato finale. Quindi 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 passare una stringa in quella variabile, mentre arriva un array. E lui \u2013 puff, e io \u2013questo, quello, la riga successiva, e tutto si rompe. Se si tratta di una nuova risorsa e la persona la avvia, vede che qualcosa non funziona, quindi ci\u00f2 si risolve rapidamente. Ma se si \u00e8 aggiornata un gruppo autoscale, a un certo punto le istanze nel gruppo autoscale iniziano a cambiare. E puff, qualcosa non funziona. \u00c8 frustrante.<\/p>\n<p><\/p>\n<p><em>Quindi, l'unica soluzione \u00e8 testare?<\/em><\/p>\n<p><\/p>\n<p>S\u00ec, vedete il problema, aggiungete passi di test. Vale a dire, anche l'output pu\u00f2 essere testato. Forse non \u00e8 cos\u00ec comodo, ma \u00e8 possibile mettere alcune etichette \u2013 verificate che User-data sia qui inchiodato. <\/p>\n<p><\/p>\n<p><em>Mi chiamo Timur. \u00c8 fantastico che ci siano relazioni 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 nella prossima conferenza, forse, ci sar\u00e0. Ho una semplice domanda. Perch\u00e9 hardcodate il valore in un modulo separato e non usate tfvars, cio\u00e8, in cosa \u00e8 meglio un modulo con valori rispetto a tfvars?<\/em><\/p>\n<p><\/p>\n<p>Vale a dire, qui (slide: Production\/environments\/settings.tf) devo scrivere: domain = variabile, domain vpcnetwork, variabile vpcnetwork e stvars \u2013 estrarre lo stesso?<\/p>\n<p><\/p>\n<p><em>Lo facciamo esattamente cos\u00ec. Ci riferiamo al modulo impostazione sorgente, per esempio.<\/em><\/p>\n<p><\/p>\n<p>Fondamentalmente, \u00e8 un tfvars. Il tfvars \u00e8 molto utile nell'ambiente di test. Ho tfvars per grandi istanze, per piccole. E ho messo un file nella cartella. E ho ottenuto ci\u00f2 che volevo. Quando costruiamo l'infrastruttura, vogliamo che si possa vedere e capire tutto subito. Cos\u00ec \u00e8, \u00e8 necessario guardare qui, poi guardare 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. E viene utilizzato in diversi posti con diverse sfumature. Allora avresti lanciato tfvars e ottenuto le tue sfumature. E noi \u2013 \u00e8 infrastruttura come codice in forma pura. Hai guardato e capito. <\/p>\n<p><\/p>\n<p><em>Ciao! Ti \u00e8 mai capitato di affrontare situazioni in cui il provider cloud interviene su ci\u00f2 che hai fatto con Terraform? Supponiamo che stiamo modificando i metadati. Ci sono chiavi ssh. E Google continua a inserire i suoi metadati, le sue chiavi. E Terraform scrive sempre che ci sono delle modifiche. Dopo ogni esecuzione, anche se nulla cambia, dice sempre che sta per aggiornare questo campo.<\/em><\/p>\n<p><\/p>\n<p>Con le chiavi, ma s\u00ec, parte dell'infrastruttura \u00e8 colpita da questa situazione, cio\u00e8 Terraform non pu\u00f2 cambiare nulla. Anche noi a mano non possiamo modificare nulla. Finora conviviamo con questo.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, ti \u00e8 capitato di affrontare situazioni del genere, ma non hai trovato soluzioni, lui continua a fare autonomamente?<\/em><\/p>\n<p><\/p>\n<p>Purtroppo, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Ciao! Mi chiamo Starkov Stanislav. Mail.ru Group. Come risolvete il problema con la generazione del tag su \u2026, come lo trasmettete internamente? Credo di capire, tramite User \u2014 data, per specificare il nome host, da indirizzare con Puppet? E la seconda parte della domanda. Come affrontate questa questione nel SG, cio\u00e8 quando generate SG, centinaia di istanze simili, come le nominate correttamente?<\/em><\/p>\n<p><\/p>\n<p>Le istanze che per noi sono molto importanti, le nominiamo in modo elegante. Quelle che non servono, c'\u00e8 una notazione che \u00e8 un gruppo autoscale. E teoricamente, si pu\u00f2 uccidere e ottenere un nuovo. <\/p>\n<p><\/p>\n<p>Riguardo al problema con il tag, non \u00e8 un problema, ma una questione. E noi utilizziamo molto i tag, perch\u00e9 l'infrastruttura \u00e8 grande e costosa. Abbiamo bisogno di capire dove vanno a finire i soldi, quindi i tag ci permettono di identificare cosa e dove \u00e8 stato speso. Di conseguenza, facilita la ricerca di eventuali spese eccessive. <\/p>\n<p><\/p>\n<p>Di cosa parlavi ancora?<\/p>\n<p><\/p>\n<p><em>Quando il SG crea centinaia di istanze, \u00e8 necessario differenziarle in qualche modo?<\/em><\/p>\n<p><\/p>\n<p>No, non \u00e8 necessario. Su ogni istanza c'\u00e8 un agente che comunica che ho un problema. Se l'agente comunica, allora l'agente sa di lui e, come minimo, esiste il suo indirizzo IP. Si pu\u00f2 gi\u00e0 verificare. Inoltre, utilizziamo Consul per il Discovery, dove non c'\u00e8 Kubernetes. E anche Consul mostra l'indirizzo IP dell'istanza.<\/p>\n<p><\/p>\n<p><em>Cio\u00e8, ti basi proprio sull'IP e non sul nome host?<\/em><\/p>\n<p><\/p>\n<p>\u00c8 impossibile basarsi sul nome host, cio\u00e8 ce ne sono molti. Ci sono identificatori delle istanze \u2013 AE e cos\u00ec via. Pu\u00f2 essere trovato da qualche parte, si pu\u00f2 cercare. <\/p>\n<p><\/p>\n<p><em>Ciao! Ho capito che Terraform \u00e8 una buona cosa, progettata per le nuvole.<\/em> <\/p>\n<p><\/p>\n<p>Non solo. <\/p>\n<p><\/p>\n<p><em>Questo \u00e8 esattamente il punto che mi interessa. Se decidete di migrare, ad esempio, su Bare Metal con tutti i vostri instances? Non ci saranno problemi? Oppure dovrete comunque usare altri prodotti, come lo stesso Ansible menzionato qui?<\/em><\/p>\n<p><\/p>\n<p>Ansible \u00e8 leggermente diverso. Cio\u00e8, Ansible funziona gi\u00e0 quando l'instance \u00e8 avviato. Terraform funziona prima che l'instance sia avviato. La migrazione su Bare Metal \u2013 no. <\/p>\n<p><\/p>\n<p><em>Al momento no, ma arriva il business e dice: \u00abFacciamolo\u00bb.<\/em><\/p>\n<p><\/p>\n<p>La migrazione su un altro cloud \u2013 s\u00ec, ma qui c'\u00e8 un'altra questione. \u00c8 necessario scrivere il codice Terraform in modo che si possa migrare su un altro cloud con meno difficolt\u00e0. <\/p>\n<p><\/p>\n<p>Inizialmente, l'obiettivo era dare che tutta la nostra infrastruttura fosse agnostica, cio\u00e8 qualsiasi cloud dovesse andare bene, ma a un certo punto il business 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 jobs nel Front-End, configurare PagerDuty, documenti dati, ecc. Ha davvero molte funzionalit\u00e0. Pu\u00f2 praticamente controllare il mondo intero.<\/p>\n<p><\/p>\n<p><em>Grazie per la relazione! Anche io lavoro con Terraform da 4 anni. Durante la transizione verso Terraform, verso l'infrastruttura, verso la descrizione dichiarativa, ci siamo trovati in situazioni in cui qualcuno faceva qualcosa a mano, e tu cercavi di fare un piano. E ricevevi qualche errore. Come affrontate questi problemi? Come trovate le risorse perse che erano state 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 lo eliminiamo. In generale, le pull request sono una pratica comune. <\/p>\n<p><\/p>\n<p><em>Se c'\u00e8 un errore, fate rollback? Avete provato a farlo?<\/em><\/p>\n<p><\/p>\n<p>No, \u00e8 una decisione del momento, quando si 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 5.0.1.1 - aioseo.com -->\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) 5.0.1.1\" \/>\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: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 Kostrik\u0438\u043d (Ixtens) | ProHoster","description":"","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: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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}