{"id":93459,"date":"2020-09-07T07:43:22","date_gmt":"2020-09-07T05:43:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g"},"modified":"2020-09-07T07:43:22","modified_gmt":"2020-09-07T05:43:22","slug":"opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g","title":{"rendered":"Descrizione dell'infrastruttura in Terraform per il futuro. Anton Babenko (2018)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/7d032c58748e76083b69df4ea38c3285.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Molti conoscono e utilizzano Terraform nel loro lavoro quotidiano, ma non sono ancora emerse le migliori pratiche. Ogni team deve inventare i propri approcci e metodi.<\/p>\n<p><\/p>\n<p>La tua infrastruttura inizia quasi sicuramente in modo semplice: alcune risorse + qualche sviluppatore. Col tempo, cresce in ogni direzione. Trovi modi per raggruppare risorse in moduli Terraform, organizzare il codice in cartelle, e cosa potrebbe mai andare storto qui? (le famose ultime parole)<\/p>\n<p><\/p>\n<p>Passa del tempo e ti senti come se la tua infrastruttura fosse un nuovo animale domestico, ma perch\u00e9? Vengono preoccupazioni per cambiamenti inspiegabili nell'infrastruttura, hai paura di toccare l'infrastruttura e il codice \u2014 alla fine ritardi nuove funzionalit\u00e0 o abbassi la qualit\u00e0\u2026<\/p>\n<p><\/p>\n<p>Dopo tre anni di gestione su Github di una collezione di moduli community Terraform per AWS e di un supporto a lungo termine di Terraform in produzione, Anton Babenko \u00e8 pronto a condividere la sua esperienza: come scrivere moduli TF per evitare futuri dolori.<\/p>\n<p><\/p>\n<p>Entro la fine della presentazione, i partecipanti avranno una comprensione migliore dei principi di gestione delle risorse in Terraform, delle migliori pratiche relative ai moduli in Terraform e alcuni principi di integrazione continua legati alla gestione dell'infrastruttura.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><strong>Disclaimer:<\/strong> <em>Voglio notare che questa presentazione \u00e8 datata novembre 2018 \u2013 sono gi\u00e0 passati 2 anni. La versione di Terraform trattata nella presentazione, 0.11, non \u00e8 pi\u00f9 supportata. Negli ultimi 2 anni sono stati rilasciati 2 nuove versioni, con numerose novit\u00e0, miglioramenti e cambiamenti. Vi prego di tenerne conto e di consultare la documentazione.<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/2387cb9ad6bf95b85b28090c9f18dd63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Link:<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/terraform-community-modules\">terraform-community-modules<\/a><\/noindex> + <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/terraform-aws-modules\">terraform-aws-modules<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/antonbabenko\/pre-commit-terraform\">antonbabenko\/pre-commit-terraform<\/a><\/noindex> \u2014 formattazione automatica del codice e della documentazione<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/antonbabenko\/terrapin\">antonbabenko\/terrapin<\/a><\/noindex> \u2014 generatore di moduli Terraform (WIP)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/antonbabenko\/modules.tf-lambda\">antonbabenko\/modules.tf-lambda<\/a><\/noindex> \u2014 generatore di codice Terraform da diagrammi visivi (WIP)<\/li>\n<li>www.terraform-best-practices.com<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@anton.babenko\">medium.com\/@anton.babenko<\/a><\/noindex> (I nuovi post si trovano sul sito personale www.antonbabenko.com\/)<\/li>\n<li>@antonbabenko \u2013 Twitter, e una miriade di diversi Slacks<\/li>\n<\/ul>\n<p><\/p>\n<p>Mi chiamo Anton Babenko. Alcuni di voi hanno sicuramente utilizzato il codice che ho scritto. Adesso ne parler\u00f2 con maggiore sicurezza che mai, perch\u00e9 ho accesso alle statistiche. <\/p>\n<p><\/p>\n<p>Mi occupo di Terraform e sono un attivo partecipante e contributore in molti progetti open source legati a Terraform e Amazon dal 2015. <\/p>\n<p><\/p>\n<p>Da allora ho scritto abbastanza codice da poterlo presentare in modo interessante. E ora cercher\u00f2 di raccontarvi a riguardo.<\/p>\n<p><\/p>\n<p>Parler\u00f2 delle sottigliezze e delle specificit\u00e0 nell'uso di Terraform. Ma in realt\u00e0 questo non \u00e8 un argomento per un HighLoad. E ora capirete perch\u00e9. <\/p>\n<p><\/p>\n<p>Col passare del tempo ho iniziato a scrivere moduli Terraform. Gli utenti ponevano domande e io le riformulavo. Poi ho scritto diverse utility per formattare il codice utilizzando pre-commit hook, ecc.<\/p>\n<p><\/p>\n<p>Ci sono stati molti progetti interessanti. Mi piace dedicarmi alla generazione di codice, perch\u00e9 mi piace che il computer faccia sempre pi\u00f9 lavoro per me e per i programmatori; perci\u00f2 attualmente sto lavorando a un generatore di codice Terraform a partire da diagrammi visuali. Forse alcuni di voi li hanno visti. Sono scatole belle con frecce. E penso sia fantastico poter premere un pulsante 'Esporta' e ottenere tutto questo come codice. <\/p>\n<p><\/p>\n<p>Vengo dall'Ucraina. Vivo da molti anni in Norvegia. <\/p>\n<p><\/p>\n<p>Inoltre, le informazioni per questa presentazione sono state raccolte da persone che conoscono il mio nome e mi trovano sui social media. Ho quasi sempre lo stesso nickname.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/67928ae08257a7ab188322f3cf10a307.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/terraform-aws-modules\">https:\/\/github.com\/terraform-aws-modules<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/registry.terraform.io\/namespaces\/terraform-aws-modules\">https:\/\/registry.terraform.io\/namespaces\/terraform-aws-modules<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Come ho accennato, sono il maintainer principale dei moduli Terraform AWS, che \u00e8 uno dei pi\u00f9 grandi repository su GitHub, dove ospitiamo moduli per le attivit\u00e0 pi\u00f9 comuni: VPC, Autoscaling, RDS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/5ed2e9b0638aec2aacb39af72a9dcfc1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E ci\u00f2 che avete appena sentito \u00e8 la base assoluta. Se dubitate di capire cos'\u00e8 Terraform, sar\u00e0 meglio passare il vostro tempo altrove. Qui ci saranno molti termini tecnici. E non ho esitato a dichiarare il livello della presentazione come il massimo possibile. Questo significa che posso parlare utilizzando tutti i termini senza particolare spiegazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/f6508b864fc723faa4e9860f652ff420.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform \u00e8 nato nel 2014 come uno strumento che permette di scrivere, pianificare e gestire l'infrastruttura come codice. Il concetto chiave qui \u00e8 \"infrastruttura come codice\".<\/p>\n<p><\/p>\n<p>Tutta la documentazione, come ho detto, \u00e8 scritta in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/\">terraform.io<\/a><\/noindex>. Spero che la maggior parte di voi conosca questo sito e abbia letto la documentazione. Se \u00e8 cos\u00ec, siete nel posto giusto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c1efa6a90819f89ed97a7d65d73eca2c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ecco come appare un normale file di configurazione Terraform, dove iniziamo definendo alcune variabili. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/1da470ec7aae5750580bcfc39cb52523.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo caso definiamo \u00abaws_region\u00bb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/64bae52f1145d3466b2e144f7507758d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poi descriviamo quali risorse vogliamo creare. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/f1add85177c56dd1cc2a8ce68a15c35c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eseguiamo alcuni comandi, in particolare \u00abterraform init\u00bb per caricare le dipendenze e i provider. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/7e592e62f5666c111e1962f00b9cff9f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E lanciamo il comando \u00abterraform apply\u00bb per verificare se la configurazione specificata corrisponde alle risorse che abbiamo creato. Poich\u00e9 non abbiamo creato nulla prima, Terraform ci propone di creare queste risorse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8bac034477578afa59bb64db106cea2b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Confermiamo. In questo modo, creiamo un bucket chiamato seasnail.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/2b945542cc62066367de1695afb10ec8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono anche diverse utilit\u00e0 simili. Molti di voi che usano Amazon conoscono AWS CloudFormation, Google Cloud Deployment Manager o Azure Resource Manager. Ognuno di essi ha una propria implementazione per gestire le risorse all'interno di ciascuno di questi provider di cloud pubblico. Terraform \u00e8 particolarmente utile in quanto consente di gestire oltre 100 provider. (Ulteriori dettagli <noindex><a rel=\"nofollow\" href=\"https:\/\/www.terraform.io\/docs\/providers\/index.html\">qui<\/a><\/noindex>)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c2d976e74a17cf1f16af9f1bc29a3b32.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Gli obiettivi che Terraform si \u00e8 posto sin dall'inizio:<\/p>\n<p><\/p>\n<ul>\n<li>Terraform fornisce una visione unificata delle risorse.<\/li>\n<li>Permette di supportare tutte le piattaforme moderne. <\/li>\n<li>Fin dall'inizio, Terraform \u00e8 stato concepito come uno strumento per modificare l'infrastruttura in modo sicuro e prevedibile. <\/li>\n<\/ul>\n<p><\/p>\n<p>Nel 2014, la parola \"prevedibile\" suonava molto insolita in questo contesto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/262def09715fa0249b5033416fd3c4e5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform \u00e8 uno strumento versatile. Se hai un'API, puoi gestire praticamente tutto:<\/p>\n<p><\/p>\n<ul>\n<li>Puoi utilizzare oltre 120 provider per gestire qualsiasi cosa ti interessi. <\/li>\n<li>Ad esempio, puoi usare Terraform per descrivere l'accesso ai repository di GitHub. <\/li>\n<li>Puoi persino creare e chiudere bug in Jira.<\/li>\n<li>Puoi gestire le metriche di New Relic. <\/li>\n<li>Puoi persino creare file in Dropbox, se \u00e8 quello che desideri. <\/li>\n<\/ul>\n<p><\/p>\n<p>Tutto questo si ottiene attraverso i provider Terraform, che hanno un'API aperta e che possono essere descritti in Go.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c6d9023bdb5f622c383f8a61765825f3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Supponiamo che abbiamo iniziato a utilizzare Terraform, abbiamo letto della documentazione sul sito, guardato qualche video e iniziato a scrivere main.tf, come mostrato nelle diapositive precedenti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/1f7da2e6a9b8171945f8b5783b8132f1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E va tutto alla grande, hai creato un file che crea un VPC.<\/p>\n<p><\/p>\n<p>Se desideri creare un VPC, devi specificare circa queste 12 righe. Descrivi in quale regione vuoi crearlo e quale cidr_block di indirizzi IP utilizzare. E tutto qui. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/ddaf4d884a1e4b2e6b07a713b2154521.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Naturalmente, il progetto crescer\u00e0 gradualmente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/e0a07abdf139582b50b4f117923cc2a0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E voi aggiungerete molte nuove risorse: fonti di dati, vi integrerete con nuovi fornitori, e magari userete Terraform per gestire gli utenti nel vostro account GitHub, e cos\u00ec via. Potreste voler utilizzare diversi fornitori di DNS, mescolando tutto quanto. Terraform facilita tutto ci\u00f2. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8f5e9ea326e1a923631da3e434810bc4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Consideriamo il seguente esempio.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8f679abff1c007372dcdf2e611708b7a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aggiungerete gradualmente un internet_gateway, perch\u00e9 volete che le risorse nel vostro VPC abbiano accesso a Internet. \u00c8 una buona idea. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/6ed039e5d55b76f5189bffecf473b9c0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il risultato sar\u00e0 un main.tf come questo:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/ab739b16e0cf3ef88f84ec082020a967.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 la parte superiore di main.tf.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/fea16b3d0ac6701a1503f708e9b17f63.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questa \u00e8 la parte inferiore di main.tf.<\/p>\n<p><\/p>\n<p>Poi aggiungete una subnet. Quando arriverete a voler aggiungere NAT gateways, routes, routing tables e parecchie altre subnets, non avrete 38 righe, ma circa 200-300 righe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/9706450edecd5111c8adbaf01c86cdcf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cio\u00e8, il vostro file main.tf crescer\u00e0 gradualmente. E molto spesso le persone mettono tutto in un unico file. In main.tf possono esserci 10-20 Kb. Immaginate che 10-20 Kb siano contenuti testuali. E tutto \u00e8 interconnesso. Lavorarci diventa sempre pi\u00f9 complicato. 10-20 Kb \u00e8 un buon caso d'uso, e pu\u00f2 essere anche di pi\u00f9. E non sempre le persone considerano questo un problema. <\/p>\n<p><\/p>\n<p>Come nella programmazione tradizionale, cio\u00e8 non infrastruttura come codice, siamo abituati a utilizzare un insieme di classi, pacchetti, moduli e raggruppamenti. Terraform consente di fare praticamente la stessa cosa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/23d406874406406577dd272b4795899d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ul>\n<li>Il codice cresce. <\/li>\n<li>Anche le dipendenze tra le risorse crescono. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/9fe1a348f4818c6d080a77d862b6232c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E sorge in noi una grande necessit\u00e0. Comprendiamo che non possiamo continuare cos\u00ec. Il nostro codice diventa inestricabile. 10-20 Kb non \u00e8 certo enorme, ma parliamo solo dello stack di rete, cio\u00e8 avete aggiunto solo risorse di rete. Non stiamo ancora considerando Application Load Balancer, distribuzione del cluster ES, Kubernetes, ecc., dove \u00e8 facile aggiungere altri 100 Kb. Se scrivete tutto questo, scoprirete presto che Terraform offre moduli Terraform.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/15187efbc9d48d1d2069c69b4ef1a491.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I moduli Terraform sono una configurazione Terraform autosufficiente, gestita come un gruppo. Questo \u00e8 tutto ci\u00f2 che c'\u00e8 da sapere sui moduli Terraform. Non sono particolarmente intelligenti, non permettono di fare connessioni complesse a seconda di qualcosa. Tutto questo ricade sulle spalle degli sviluppatori. Cio\u00e8, \u00e8 semplicemente una configurazione Terraform che avete gi\u00e0 scritto. E potete semplicemente richiamarla come un gruppo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/2c4489dc6da5a4c1f32ffea5218a902a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo modo cerchiamo di capire come ottimizzare i nostri 10-20-30 Kb di codice. Comprendiamo gradualmente che \u00e8 necessario utilizzare alcuni moduli. <\/p>\n<p><\/p>\n<p>Il primo tipo di moduli che incontriamo sono i moduli di risorsa. Non comprendono quali siano la tua infrastruttura, il tuo business e quali siano le condizioni. Questi sono i moduli che amministro insieme alla comunit\u00e0 open source e che proponiamo come i blocchi di base pi\u00f9 iniziali per la tua infrastruttura. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/3ee9bff297b410615d6f869bd7c05285.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esempio di modulo di risorsa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/db6ed597ba534cb2cde077049e73f51b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quando chiamiamo un modulo di risorsa, indichiamo da quale percorso dobbiamo caricare il suo contenuto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c4d8a9608644392c64b2171b25d83ad9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Indichiamo quale versione vogliamo caricare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/713359b956e80d43a0ea4f590959739a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Passiamo un sacco di argomenti. E basta. \u00c8 tutto ci\u00f2 che dobbiamo sapere quando usiamo questo modulo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8987d97aabb77238af296776588ba1a7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Molti pensano che se usano l'ultima versione, tutto sar\u00e0 stabile. Ma non \u00e8 cos\u00ec. L'infrastruttura deve essere versionata, dobbiamo rispondere chiaramente a quale versione \u00e8 stata distribuita quella o quella componente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/bb4be602dd32b89285883643a3df2db5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Di seguito il codice all'interno di questo modulo. Modulo security-group. Qui lo scroll arriva fino alla riga 640. Creare una risorsa security-group in Amazon in tutte le possibili configurazioni \u00e8 un compito molto complesso. Non basta creare semplicemente un security-group e definire quali regole applicare. Questo sarebbe troppo facile. All'interno di Amazon ci sono milioni di diverse limitazioni. Ad esempio, se usi <strong>VPC endpoint, prefix list, vari API<\/strong> e cerchi di combinare tutto ci\u00f2, Terraform non ti permette di farlo. N\u00e9 l'API di Amazon lo consente. Pertanto, \u00e8 necessario nascondere tutta questa logica complessa nel modulo e fornire all'utente un codice che appaia solo in questo modo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/e163f0678577325b3629980ec55717f5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'utente non deve sapere come \u00e8 realizzato internamente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/36188061b996aa7e559bdfc3afada4a9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il secondo tipo di moduli, composto da moduli di risorse, affronta gi\u00e0 compiti pi\u00f9 applicabili per la tua azienda. Spesso si tratta di uno spazio che funge da estensione per Terraform e stabilisce valori fissi per i tag, in accordo con gli standard aziendali. Qui \u00e8 possibile aggiungere funzionalit\u00e0 che Terraform attualmente non consente di utilizzare. Questo \u00e8 il momento attuale. Attualmente la versione \u00e8 0.11, che presto diventer\u00e0 obsoleta. Tuttavia, preprocessori, jsonnet, cookiecutter e una serie di altri strumenti rappresentano i meccanismi di supporto da utilizzare per un funzionamento completo. <\/p>\n<p><\/p>\n<p>Ora mostrer\u00f2 alcuni esempi a riguardo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/96764177d72cd9835f1a007eccedcc05.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il modulo infrastrutturale viene invocato esattamente allo stesso modo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/0e036ea86279651179f18d0c5394442f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si specifica la fonte da cui caricare il contenuto.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/d33adefbe446554c952d15f8883b73e2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Viene passato un insieme di valori che vengono forniti a questo modulo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/a9bd3ed71cdb0524faec83cb942e4e3d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>All'interno di questo modulo vengono invocati diversi moduli di risorse per creare VPC, Load Balancer applicativo, gruppi di sicurezza, o per un cluster Elastic Container Service.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/df6955fc8f2fe94eac3226966faf987c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono due tipi di moduli. \u00c8 importante comprenderlo, poich\u00e9 la maggior parte delle informazioni che ho raggruppato in questa presentazione non \u00e8 scritta nella documentazione. <\/p>\n<p><\/p>\n<p>La documentazione di Terraform attualmente presenta molte difficolt\u00e0, poich\u00e9 indica solo l'esistenza di determinate funzionalit\u00e0 senza spiegare come utilizzarle o il motivo per cui sia preferibile farlo in un certo modo. Di conseguenza, molte persone finiscono per scrivere delle soluzioni che poi si rivelano insostenibili.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/619e1bd78d84d966c03d5eedab6671c8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Proseguiamo esaminando come scrivere questi moduli. Successivamente, vedremo come richiamarli e come lavorare con il codice. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/7bf5015edc75c0a15a8915439a5fc56b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Terraform Registry \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/registry.terraform.io\/\">https:\/\/registry.terraform.io\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Consiglio n. 0 \u2013 non scrivere moduli per risorse. La maggior parte di questi moduli \u00e8 gi\u00e0 stata creata per te. Come ho gi\u00e0 detto, sono open source, non contengono alcuna logica commerciale personale e non hanno valori hardcoded per indirizzi IP, password, ecc. Un modulo \u00e8 molto flessibile e, probabilmente, esiste gi\u00e0. Ci sono circa 650 moduli per le risorse di Amazon, e la maggior parte di essi \u00e8 di buona qualit\u00e0. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/b68827405b2202e597852905c6475bc0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In questo esempio, qualcuno \u00e8 venuto da te e ha detto: \u00abVoglio avere la possibilit\u00e0 di gestire un database. Crea un modulo, cos\u00ec posso creare un database\u00bb. La persona non conosce i dettagli di implementazione n\u00e9 di Amazon n\u00e9 di Terraform. Sta semplicemente dicendo: \u00abVoglio gestire MSSQL\u00bb. Cio\u00e8, supponiamo che invocher\u00e0 il nostro modulo, passer\u00e0 il tipo di motore e indicher\u00e0 il fuso orario.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8d3892958b9067c1996b7c9115b97f08.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E la persona non deve sapere che all'interno di questo modulo creeremo due risorse diverse: una per MSSQL e l'altra per il resto solo perch\u00e9 in Terraform 0.11 non \u00e8 possibile specificare valori di fuso orario come opzionali. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/612b070a57244ac65d4ae6fdce78f218.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E all'uscita di questo modulo, la persona avr\u00e0 semplicemente la possibilit\u00e0 di ottenere un indirizzo. Non sapr\u00e0 da quale database o da quale risorsa stiamo creando tutto questo. Questo \u00e8 un elemento molto importante di astrazione. E si applica non solo ai moduli pubblici in open source, ma anche a quelli che scriverai nei tuoi progetti e team. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/bebb8510b0137faf16b4f02320eb69c0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 il secondo argomento, che \u00e8 piuttosto importante se utilizzi Terraform da un po' di tempo. Hai un repository dove conservi tutti i tuoi moduli Terraform per la tua azienda. Ed \u00e8 del tutto normale che nel tempo questo progetto cresca fino a una dimensione di uno o due megabyte. Va bene. <\/p>\n<p><\/p>\n<p>Ma il problema \u00e8 come Terraform richiama questi moduli. Ad esempio, se chiami un modulo per creare ogni singolo utente, Terraform caricher\u00e0 prima l'intero repository e poi acceder\u00e0 alla cartella dove si trova quel specifico modulo. In questo modo, caricherai ogni volta un megabyte. Se gestisci 100 o 200 utenti, scaricherai 100 o 200 megabyte, e solo dopo accederai a quella cartella. Quindi, naturalmente, non vuoi dover caricare tutto ogni volta che premi \"Terraform init\". <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/eee24c4c8628cf1aaf06d2f9fa88d410.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mbtproject\/mbt\">https:\/\/github.com\/mbtproject\/mbt<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ci sono due soluzioni a questo problema. La prima consiste nell'utilizzare percorsi relativi. In questo modo specifichi nel codice che la cartella \u00e8 locale (.\/). E prima di avviare qualcosa, esegui un Git clone di questo repository localmente. Cos\u00ec lo fai solo una volta. <\/p>\n<p><\/p>\n<p>Certo, ci sono diversi svantaggi. Ad esempio, non \u00e8 possibile utilizzare il versioning. E questo a volte pu\u00f2 essere difficile da gestire. <\/p>\n<p><\/p>\n<p>La seconda soluzione. Se hai molti sottoprodotti e hai gi\u00e0 un pipeline consolidato, esiste un progetto MBT che consente di assemblare molti pacchetti diversi da un monorepository e caricarli su S3. Questo \u00e8 un metodo molto valido. In questo modo, il file iam-user-1.0.0.zip peser\u00e0 solo 1 Kb, poich\u00e9 il codice per generare questa risorsa \u00e8 molto piccolo. E questo funzioner\u00e0 in modo molto pi\u00f9 veloce. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/1402d267a4c4b7e912f4d00325e68244.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Parliamo di ci\u00f2 che non pu\u00f2 essere utilizzato nei moduli. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8fbd9e6d78e72ee2fe30562453957d77.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perch\u00e9 nei moduli \u00e8 una cattiva idea? La cosa pi\u00f9 terribile \u00e8 l'assunzione dell'utente. L'assunzione dell'utente \u00e8 una forma di autenticazione nel provider che pu\u00f2 essere utilizzata da persone diverse. Ad esempio, tutti noi assumeremo il ruolo. Questo significa che Terraform accetter\u00e0 questo ruolo. E poi eseguir\u00e0 le altre azioni con questo ruolo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c14e84f0bd4f8019c1cd375268ce4416.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il problema consiste nel fatto che se Vasya ama connettersi ad Amazon in un modo, ad esempio utilizzando una variabile d'ambiente predefinita, mentre Petya preferisce usare la sua chiave condivisa, che tiene in un luogo segreto, in Terraform non si possono specificare entrambe le cose. Affinch\u00e9 non soffrano, non \u00e8 necessario indicare questo blocco nel modulo. Deve essere specificato a un livello superiore. Cio\u00e8, abbiamo un modulo di risorsa, un modulo infrastrutturale e una composizione in cima. E da qualche parte sopra, deve essere quindistabilito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/bd5ec774dfd9325c5f88b14925ed637b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il secondo problema riguarda il provisioner. Qui la questione non \u00e8 cos\u00ec banale, perch\u00e9 se scrivete codice e per voi funziona, potreste pensare che se funziona, non c'\u00e8 motivo di cambiarlo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/4859e030d6fc22201757d6f372366261.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il problema \u00e8 che non controllate sempre quando questo provisioner verr\u00e0 eseguito, in primo luogo. E in secondo luogo, non controllate cosa significhi aws ec2, cio\u00e8 stiamo parlando ora di Linux o Windows. In questo modo, non potete scrivere qualcosa che funzioni allo stesso modo su diversi sistemi operativi o per diversi casi d'uso.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/98958fc032bcbc4bace86a6d6e74fb62.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il pi\u00f9 comune esempio, menzionato anche nella documentazione ufficiale, \u00e8 che se scrivi aws_instance e specifichi un insieme di argomenti, non c'\u00e8 nulla di sbagliato nel includere il provisioner \u00ablocal-exec\u00bb e avviare il tuo ansible-playbook.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/50d8055c66969147af3e92195b818d6e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In realt\u00e0 \u2013 s\u00ec, non c'\u00e8 nulla di sbagliato. Ma presto ti renderai conto che questa cosa del local-exec non esiste, per esempio, in launch_configuration. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/47f5b5ef6433a0e2853a969ddb423883.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quando usi launch_configuration e desideri creare un autoscaling group da un'istanza, in launch_configuration non c'\u00e8 il concetto di \u00abprovisioner\u00bb. C'\u00e8 il concetto di \u00abuser data\u00bb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/eb45a5b16b0c90d5e200b4adc487d38a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pertanto, una soluzione pi\u00f9 universale \u00e8 utilizzare user data. Questo verr\u00e0 eseguito o nell'istanza stessa quando l'istanza si accende, oppure in questo stesso user data, quando l'autoscaling group utilizza questa launch_configuration.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/307d665dd12a2bf67deebf3f985c62f2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se c'\u00e8 davvero il desiderio di avviare un provisioner, perch\u00e9 \u00e8 un componente di collegamento, quando una risorsa viene creata e in quel momento \u00e8 necessario avviare il proprio provisioner o comando. Ci sono molte situazioni come questa. <\/p>\n<p><\/p>\n<p>E la risorsa pi\u00f9 appropriata per questo \u00e8 chiamata null_resource. Null_resource \u00e8 una risorsa fittizia che in realt\u00e0 non viene mai creata. Non tocca nulla, non ha API, non ha autoscaling. Ma consente di regolare quando eseguire un comando. In questo caso, il comando viene eseguito al momento della creazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/2b7d5fcfee963eb2366f6e9fb7be188b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Collegamento <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/common-traits-in-terraform-modules\">http:\/\/bit.ly\/common-traits-in-terraform-modules<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ci sono diversi segnali. Non mi soffermer\u00f2 su tutti i segnali in modo molto dettagliato. C'\u00e8 un articolo su questo. Ma se hai lavorato con Terraform o hai utilizzato moduli altrui, hai spesso notato che molti moduli, come gran parte del codice open source, vengono scritti per esigenze personali. Qualcuno lo ha scritto, ha risolto il proprio problema. L'ha pubblicato su GitHub, lasciando che vivesse. Vivr\u00e0, ma se non ci sono documentazione e esempi, nessuno lo utilizzer\u00e0. E se non c'\u00e8 funzionalit\u00e0 che consente di risolvere un po' pi\u00f9 della propria specifica esigenza, nessuno lo utilizzer\u00e0 comunque. Ci sono moltissimi modi per perdere utenti. <\/p>\n<p><\/p>\n<p>Se desideri scrivere qualcosa che le persone vorranno utilizzare, ti consiglio di seguire questi segnali. <\/p>\n<p><\/p>\n<p>Essi sono:<\/p>\n<p><\/p>\n<ul>\n<li>Documentazione ed esempi.<\/li>\n<li>Funzionalit\u00e0 completa.<\/li>\n<li>Valori predefiniti ragionevoli.<\/li>\n<li>Codice pulito.<\/li>\n<li>Test.<\/li>\n<\/ul>\n<p><\/p>\n<p>I test \u2013 \u00e8 una situazione a s\u00e9 stante, perch\u00e9 \u00e8 piuttosto difficile scriverli. Io credo di pi\u00f9 nella documentazione e negli esempi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/835b3e4152a8ce5af46a0ea77187e13c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, abbiamo esaminato come scrivere i moduli. Ci sono due argomenti. Il primo, il pi\u00f9 importante, \u00e8: non scrivere se puoi, perch\u00e9 molte persone hanno gi\u00e0 svolto questi compiti prima di te. E il secondo, se alla fine hai deciso di procedere, cerca di non utilizzare provider nei moduli e nel provisioner. <\/p>\n<p><\/p>\n<p>Questa \u00e8 la parte grigia della documentazione. Potresti ora pensare: \u00abNon \u00e8 chiaro. Non mi ha convinto\u00bb. Ma vediamo tra sei mesi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/ff3612aec24633ccaae8aefc24d5b04a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora parliamo di come invocare questi moduli. <\/p>\n<p><\/p>\n<p>Comprendiamo che nel tempo il nostro codice cresce. Non abbiamo pi\u00f9 un solo file, ma ne abbiamo gi\u00e0 20. Tutti si trovano in una sola cartella. O, forse, in cinque cartelle. Potremmo iniziare a dividerli in base alle regioni, ai componenti. Poi ci rendiamo conto che ora abbiamo delle anteprime di sincronizzazione, orchestrazione che devono sorgere. Cio\u00e8, dobbiamo capire cosa fare se abbiamo cambiato le risorse di rete, cosa fare con le nostre altre risorse, come invocare queste dipendenze, ecc. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/14cc354574cf2960530d7c40fb678b52.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono due estremi. Il primo estremo \u00e8 tutto in uno. Abbiamo un file principale. Fino a un certo punto, era considerata la best practice ufficiale sul sito di Terraform.<\/p>\n<p><\/p>\n<p>Ma ora \u00e8 scritto come deprecato ed \u00e8 stato rimosso. Nel tempo, la comunit\u00e0 di Terraform ha capito che non si tratta affatto di una best practice, perch\u00e9 le persone iniziano a utilizzare il progetto in modi diversi. E ci sono problemi. Ad esempio, quando indichiamo tutte le dipendenze in un unico posto. Ci sono situazioni in cui clicchiamo su 'Terraform plan' e mentre Terraform aggiorna lo stato di tutte le risorse, pu\u00f2 passare molto tempo. <\/p>\n<p><\/p>\n<p>Molto tempo significa, ad esempio, 5 minuti. Per qualcuno, questo \u00e8 molto tempo. Ho visto casi in cui ci volevano 15 minuti. 15 minuti in cui l'API di AWS interrogava per capire lo stato di ogni risorsa. \u00c8 un'area molto ampia. <\/p>\n<p><\/p>\n<p>E, naturalmente, si presenter\u00e0 un problema correlato quando si desidera modificare qualcosa in un punto, poi si aspetta 15 minuti e vi esce un insieme di modifiche. Vi arrendete, scrivete \u00abYes\u00bb e qualcosa va storto. Questo \u00e8 un esempio molto reale. Terraform non cerca di are da problemi. Cio\u00e8, scrivete ci\u00f2 che volete. Se ci sono problemi, sono i vostri problemi. Fino a Terraform 0.11 non cerca di aiutarvi in alcun modo. In 0.12 ci sono alcuni punti interessanti che vi permettono di dire: \u00abVasja, lo desideri davvero, vuoi rifletterci?\u00bb <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/727b827aa9e31043e4e037e0c42a9748.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il secondo modo consiste nel ridurre quest'area, cio\u00e8 \u00e8 possibile legare meno le chiamate di un posto da un altro. <\/p>\n<p><\/p>\n<p>L'unico problema \u00e8 che \u00e8 necessario scrivere pi\u00f9 codice, cio\u00e8 bisogna descrivere variabili in un gran numero di file, aggiornando questo. A qualcuno non piace. Per me va bene. E alcuni pensano: \u00abPerch\u00e9 scriverlo in posti diversi, posso metterlo tutti in un unico posto\u00bb. Si pu\u00f2 fare anche cos\u00ec, ma \u00e8 un'altra estremit\u00e0.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/f9de423769b338726faefba886bee419.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dove vive tutto ci\u00f2 in un unico posto? Una, due, tre persone, cio\u00e8 qualcuno lo utilizza. <\/p>\n<p><\/p>\n<p>E chi chiama un singolo componente, un blocco o un modulo infrastrutturale? Cinque o sette persone. \u00c8 fantastico. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/0339f2fcf9c08ce6a70bc359bb1950ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La risposta pi\u00f9 comune \u00e8 che si trova da qualche parte nel mezzo. Se il progetto \u00e8 grande, spesso ci si trova in una situazione in cui n\u00e9 una soluzione \u00e8 valida n\u00e9 l'altra funziona completamente, quindi si finisce per mescolare. Non c'\u00e8 nulla di sbagliato in questo, a patto che si comprenda che ci sono vantaggi in entrambi i casi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/bf6eaf1416bd5445ca90f2cbcf0792f1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se c'\u00e8 stato un cambiamento nello stack VPC e vuoi applicare queste modifiche a EC2, cio\u00e8 vuoi aggiornare il gruppo di autoscaling perch\u00e9 hai una nuova subnet, questo tipo di dipendenze lo chiamo orchestrazione. Ci sono varie soluzioni: chi come utilizza? <\/p>\n<p><\/p>\n<p>Posso consigliarti quali soluzioni esistono. Puoi usare Terraform per fare magia, oppure usare file make per utilizzare Terraform. E se c'\u00e8 qualche cambiamento, puoi avviarlo qui. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/8ff0f7f7e1fc37572749aeb1dce6e2f0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come ti sembra questa soluzione? Qualcuno crede che sia una grande soluzione? Vedo un sorriso, forse ci sono dei dubbi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/29a2d3e1909af1c30ab4af2647d5bca2.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Certo, non ripetetelo a casa. Terraform non \u00e8 mai stato creato per essere eseguito da Terraform.<\/p>\n<p><\/p>\n<p>In una presentazione mi \u00e8 stato detto: \u00abNo, questo non funzioner\u00e0\u00bb. Il fatto \u00e8 che non deve funzionare. Anche se sembra cos\u00ec sorprendente poter lanciare Terraform da Terraform, e poi ancora Terraform, non \u00e8 necessario farlo. Terraform dovrebbe sempre essere avviato in modo molto semplice.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/1ae74b01e8cb8f7bab8bc5065b65e6c7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gruntwork-io\/terragrunt\/\">https:\/\/github.com\/gruntwork-io\/terragrunt\/<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Se hai bisogno di orchestrare le chiamate quando qualcosa cambia in un unico posto, allora c'\u00e8 Terragrunt.<\/p>\n<p><\/p>\n<p>Terragrunt \u00e8 un'utilit\u00e0, un'estensione di Terraform che consente di coordinare e orchestrare le chiamate ai moduli infrastrutturali.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/60ad02b0d3e6189fa6195e43c043b3e7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un tipico file di configurazione Terraform appare cos\u00ec. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/2a5f5cb7e6eaed566c526a0923d1f1e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Specifichi quale modulo specifico desideri chiamare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/ccf0faaa01207c67201ec750666d0c87.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quali sono le dipendenze del modulo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/affc9afd52aac7cc4b13337c5d7f068e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quali argomenti accetta questo modulo. Questa \u00e8 tutto ci\u00f2 che devi sapere su Terragrunt.<\/p>\n<p><\/p>\n<p>C'\u00e8 documentazione, ci sono 1.700 stelle su GitHub. Ma nella maggior parte dei casi, questo \u00e8 tutto ci\u00f2 che c'\u00e8 da sapere. Ed \u00e8 molto facile implementarlo in aziende che hanno appena iniziato a lavorare con Terraform.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/90a4f52c58538647a062901e6d4b5246.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, l'orchestrazione \u00e8 Terragrunt. Ci sono altre opzioni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/5d57e3de03fbe7c5fbc8592367964069.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora parliamo di come lavorare con il codice. <\/p>\n<p><\/p>\n<p>Se hai bisogno di aggiungere nuove funzionalit\u00e0 al codice, nella maggior parte dei casi \u00e8 semplice. Devi solo scrivere una nuova risorsa, qui \u00e8 tutto chiaro. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/5a927eb69b80527945b7f825f42a1bc4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se hai gi\u00e0 una risorsa che hai creato in precedenza, ad esempio, se hai scoperto Terraform dopo aver aperto un account AWS e desideri utilizzare le risorse che hai gi\u00e0, \u00e8 opportuno ampliare il tuo modulo in modo che supporti l'uso delle risorse esistenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/754e9d2836bf82e409c52a84988c84bd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E supportare la creazione di nuove risorse utilizzando il blocco risorsa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/82f388d9659dc9d20e81475aa3f9692f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>In output restituiamo sempre l'output id in base a ci\u00f2 che \u00e8 stato utilizzato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/71dc2952996800bce6278805c76a156f.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un altro problema molto significativo in Terraform 0.11 \u00e8 la gestione delle liste. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/669cd348c88f849155bfd06192cfea72.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La complessit\u00e0 sta nel fatto che se abbiamo una lista di users.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/dc808aa41a3f689ba1650f2a4f862dcf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E quando creiamo questi users utilizzando il blocco risorsa, tutto funziona normalmente. Passiamo attraverso l'intera lista, creiamo un file per ognuno. Tutto ok. E poi, ad esempio, se user3, che si trova nel mezzo, deve essere rimosso, tutte le risorse create dopo di lui verranno ricreate, poich\u00e9 l'indice cambier\u00e0. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/4dfd4b4e3f902e1d63d4ba7e48ed6400.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lavorare con gli elenchi in un ambiente stateful. Cosa significa un ambiente stateful? \u00c8 la situazione in cui si genera un nuovo valore quando viene creato questo risorsa. Ad esempio, la AWS Access Key o la AWS Secret Key, cio\u00e8 quando creiamo un utente, riceviamo una nuova Access o Secret Key. E ogni volta che eliminiamo un utente, questo utente avr\u00e0 una nuova chiave. Ma non \u00e8 secondo il feng shui, perch\u00e9 l'utente non vorr\u00e0 avere a che fare con noi se dobbiamo creare sempre un nuovo utente per lui quando qualcuno lascia il team.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c1fe1eb9f5c59b85e0e3934c1a6f6c6d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La soluzione \u00e8 questa. \u00c8 un codice scritto in Jsonnet. Jsonnet \u00e8 un linguaggio di creazione di modelli di Google. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/d67ae4dc51ee3e72e49692550e47653d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo comando consente di accettare questo modello e restituisce un file json, che \u00e8 stato creato secondo il tuo modello. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/52be571cf82b122265a7bd64489b874d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il modello appare in questo modo. <\/p>\n<p><\/p>\n<p>Terraform permette di lavorare in modo equivalente sia con HCL che con Json, quindi se hai la possibilit\u00e0 di generare Json, puoi usarlo in Terraform. Un file con estensione .tf.json verr\u00e0 caricato con successo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/a2e9b9ecd514dc7fd178930a236f9305.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi lavoriamo con questo come al solito: terraform init, terraform apply. E creiamo due utenti.<\/p>\n<p><\/p>\n<p>Ora non ci spaventa pi\u00f9 se qualcuno lascia il team. Modifichiamo semplicemente il file json. Vasya Pupkin se n'\u00e8 andato, Petya Pyatochkin \u00e8 rimasto. Petya Pyatochkin non ricever\u00e0 una nuova chiave. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/b6dcff93532446d5d06007b545df769d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'integrazione di Terraform con altri strumenti non \u00e8 fondamentalmente un compito per Terraform. Terraform \u00e8 stato creato come piattaforma per generare risorse e basta. Tutto ci\u00f2 che arriva dopo non riguarda Terraform. Non c'\u00e8 bisogno di intrecciarci dentro. C'\u00e8 Ansible, che fa tutto ci\u00f2 che serve. <\/p>\n<p><\/p>\n<p>Tuttavia, ci sono situazioni in cui vogliamo integrare Terraform e invocare un comando dopo che qualcosa \u00e8 stato eseguito. <\/p>\n<p><\/p>\n<p>Primo modo. Creiamo un output, in cui scriviamo questo comando.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/63f29f850cb05bbb9605bb3d34fdd659.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E poi invochiamo questo comando dal shell terraform output e indichiamo il valore che desideriamo. In questo modo viene eseguito il comando con tutti i valori sostituiti. \u00c8 molto comodo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/083f5435d85e998ac5ba63e096f82026.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Secondo modo. Si utilizza null_resource in base alle modifiche nella nostra infrastruttura. Possiamo invocare lo stesso local-exec non appena cambia l'ID di qualche risorsa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/f0df46f403079ca865294f584d8e1da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Naturalmente, tutto ci\u00f2 \u00e8 fluido sulla carta, perch\u00e9 Amazon, come tutti gli altri provider pubblici, ha un sacco di casi limite.<\/p>\n<p><\/p>\n<p>I casi limite pi\u00f9 comuni riguardano il fatto che, quando hai aperto un account AWS, \u00e8 importante quali regioni utilizzi; se quella funzionalit\u00e0 \u00e8 attivata; potrebbe essere che tu l'abbia aperto dopo dicembre 2013; potrebbe essere che tu stia utilizzando le impostazioni predefinite in VPC, ecc. Ci sono molte limitazioni. E Amazon le ha disseminate in tutta la documentazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/0615964259654a9894770bc326ca9725.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono alcune cose che ti consiglio di evitare.<\/p>\n<p><\/p>\n<p>Per cominciare, evita tutti gli argomenti non segreti all'interno di Terraform plan o Terraform CLI. Puoi raccoglierli in un file tfvars o in una variabile d'ambiente. <\/p>\n<p><\/p>\n<p>Ma non \u00e8 necessario memorizzare tutto questo comando magico. Terraform plan \u2013 var e via. La prima variabile \u00e8 var, la seconda variabile \u00e8 var, la terza, quarta. Il principio pi\u00f9 importante dell'infrastruttura come codice che utilizzo pi\u00f9 spesso \u00e8 che, semplicemente guardando il codice, dovrei capire perfettamente cosa \u00e8 stato distribuito, in quale stato si trova e con quali valori. E quindi non ho bisogno di leggere la documentazione o chiedere a Vasya quali parametri ha usato per creare il nostro cluster. Mi basta aprire il file con estensione tfvars, che spesso corrisponde all'ambiente, e vedere tutto l\u00ec.<\/p>\n<p><\/p>\n<p>Non dovresti nemmeno utilizzare argomenti target per ridurre il campo d'azione. \u00c8 molto pi\u00f9 semplice utilizzare piccoli moduli infrastrutturali. <\/p>\n<p><\/p>\n<p>Non dovresti n\u00e9 limitare n\u00e9 aumentare il parallelism. Se ho 150 risorse e voglio aumentare il parallelism di Amazon da 10, che \u00e8 il valore predefinito, a 100, \u00e8 probabile che qualcosa vada storto. O potrebbe andare bene adesso, ma quando Amazon dir\u00e0 che stai facendo troppe chiamate, inizieranno i problemi. <\/p>\n<p><\/p>\n<p>Terraform cercher\u00e0 di riavviare la maggior parte di questi problemi, ma non otterrai praticamente nulla. Parallelism=1 \u00e8 una cosa importante da utilizzare se ti sei imbattuto in un bug all'interno dell'API di AWS o all'interno del provider di Terraform. E allora devi specificare: parallelism=1 e aspettare che Terraform completi una chiamata, poi la seconda, poi la terza. Le eseguir\u00e0 in sequenza.<\/p>\n<p><\/p>\n<p>Spesso mi chiedono: \u00abPerch\u00e9 penso che i workspaces di Terraform siano un male?\u00bb. Credo che il principio dell'infrastruttura come codice consista nel vedere quale infrastruttura \u00e8 stata creata e con quali valori. <\/p>\n<p><\/p>\n<p>Workspaces \u00e8 stato creato non per volont\u00e0 degli utenti. Questo non significa che gli utenti abbiano scritto su GitHub issues che non possono fare a meno dei workspace di Terraform. No, non \u00e8 cos\u00ec. Terraform Enterprise \u00e8 una soluzione commerciale. Terraform di HashiCorp ha deciso che avevamo bisogno dei workspace, quindi lo implementeremo. Penso che sia molto pi\u00f9 semplice metterlo in una cartella separata. In questo modo avremo un po' pi\u00f9 di file, ma sar\u00e0 pi\u00f9 chiaro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/e6c0d79203c27d49f0e3c4022e515b52.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come lavorare con il codice? In sostanza, lavorare con le liste \u00e8 l'unico problema. E considerate Terraform in modo pi\u00f9 semplice. Non \u00e8 qualcosa che far\u00e0 tutto bene per voi. Non dovete inserire tutto ci\u00f2 che \u00e8 scritto nella documentazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/f154e25a85bdb723a5e7ad52471d88f4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel titolo della relazione si parlava di 'futuro'. Ne parler\u00f2 brevemente. Per futuro si intende che presto verr\u00e0 rilasciato 0.12. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/c7f2da5d87e69fb10bf966b9258b5255.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>0.12 porta un sacco di novit\u00e0. Se provieni dalla programmazione tradizionale, ti mancano vari blocchi dinamici, cicli e operazioni di confronto corrette e condizionali, dove il lato sinistro e quello destro vengono calcolati non contemporaneamente, ma a seconda della situazione. Ti mancano molto, quindi 0.12 risolver\u00e0 questo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/63aaef065c8a641a86a9223996524d18.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ma! Se scrivi in modo pi\u00f9 semplice e utilizzi moduli gi\u00e0 pronti e soluzioni di terze parti, non dovrai aspettare e sperare che la versione 0.12 arrivi a sistemare tutto per te. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Descrizione dell&#039;infrastruttura in Terraform per il futuro. Anton Babenko (2018)\" src=\"\/wp-content\/uploads\/2020\/09\/b356603f38d5eb671c473369b5e8a03b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>Grazie per l'intervento! Hai parlato dell'infrastruttura come codice e hai accennato ai test in un'unica parola. Servono test nei moduli? Di chi \u00e8 la responsabilit\u00e0? Bisogna scriverli personalmente o \u00e8 responsabilit\u00e0 dei moduli?<\/em><\/p>\n<p><\/p>\n<p>L'anno prossimo sar\u00e0 pieno di interventi sul fatto che abbiamo deciso di testare tutto. Cosa testare \u00e8 la domanda pi\u00f9 grande. Ci sono molte dipendenze e diverse limitazioni dei vari fornitori. Quando parliamo e tu dici: 'Ho bisogno di test', io chiedo: 'Cosa intendi testare?'. Tu rispondi che testerai nel tuo territorio. Allora io dico che nel mio non funziona. Quindi, nemmeno su questo riusciremo a trovare un accordo. Per non parlare dei numerosi problemi tecnici. Cio\u00e8, come si scrivono questi test in modo che siano adeguati. <\/p>\n<p><\/p>\n<p>Sto attivamente esplorando questo tema, ovvero come generare automaticamente test sulla base dell'infrastruttura che hai scritto. In altre parole, se hai scritto questo codice, devo eseguirlo e da questo potr\u00f2 creare i test. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gruntwork-io\/terratest\">Terratest<\/a><\/noindex> \u00c8 una delle librerie pi\u00f9 frequentemente citate che consente di scrivere test di integrazione per Terraform. \u00c8 uno degli strumenti disponibili. Preferisco di pi\u00f9 il tipo DSL, ad esempio rspec.<\/p>\n<p><\/p>\n<p><em>Antonio, grazie per la presentazione! Mi chiamo Valeriy. Permettimi di porre una domanda un po' filosofica. C'\u00e8, in un certo senso, provisioning e deployment. Il provisioning crea la mia infrastruttura, nel deployment la riempiamo di contenuti utili, come server, applicazioni, ecc. Nella mia testa, penso che Terraform sia pi\u00f9 per il provisioning, mentre Ansible sia pi\u00f9 per il deployment, poich\u00e9 Ansible consente di installare nginx e Postgres anche su infrastrutture fisiche. Tuttavia, Ansible sembra anche in grado di effettuare provisioning, per esempio, di risorse Amazon o Google. Ma Terraform permette anche di deployare software tramite i suoi moduli. Secondo te, c'\u00e8 una linea di demarcazione tra Terraform e Ansible, dove e cosa sarebbe meglio usare? Oppure, pensi che Ansible sia ormai obsoleto e dovremmo cercare di usare Terraform per tutto?<\/em><\/p>\n<p><\/p>\n<p>Ottima domanda, Valery. Ritengo che Terraform dal 2014 non sia cambiato nel suo scopo. \u00c8 stato creato per l'infrastruttura ed \u00e8 rimasto per l'infrastruttura. Abbiamo sempre avuto e avremo bisogno di management della configurazione Ansible. La sfida \u00e8 che ci sono user data all'interno della launch_configuration. E l\u00ec chiami Ansible e cos\u00ec via. Questa \u00e8 la distinzione standard che mi piace di pi\u00f9. <\/p>\n<p><\/p>\n<p>Se parliamo di infrastruttura bella, ci sono strumenti come Packer, che crea quest'immagine. Poi Terraform utilizza il data source per cercare questa immagine e aggiornare la sua launch_configuration. Quindi, il pipeline consiste nel chiamare prima Tracker, poi chiamare Terraform. E se c'\u00e8 stato un build, avviene una nuova modifica. <\/p>\n<p><\/p>\n<p><em>Salve! Grazie per la presentazione! Mi chiamo Misha, della compagnia RBS. \u00c8 possibile chiamare Ansible tramite provisioner durante la creazione di una risorsa. Inoltre, in Ansible esiste una funzione chiamata inventario dinamico. Si pu\u00f2 prima eseguire Terraform e poi chiamare Ansible, che prender\u00e0 le risorse dallo stato e le eseguir\u00e0. Cosa \u00e8 meglio?<\/em><\/p>\n<p><\/p>\n<p>Entrambi gli approcci sono utilizzati con successo da diverse persone. Penso che l'inventario dinamico in Ansible sia utile, a meno che non stiamo parlando di un gruppo di autoscaling. Infatti, per i gruppi di autoscaling abbiamo gi\u00e0 il nostro strumento chiamato launch_configuration. In launch_configuration annotiamo tutto ci\u00f2 che deve essere avviato quando creiamo una nuova risorsa. Quindi, per Amazon, usare un inventario dinamico e leggere il file Terraform ts mi sembra superfluo. Tuttavia, se si utilizzano altri strumenti che non prevedono il concetto di \"autoscaling group\", ad esempio DigitalOcean o un altro fornitore che non ha gruppi di autoscaling, sar\u00e0 necessario chiamare manualmente l'API, trovare gli indirizzi IP e generare il file di inventario dinamico su cui Ansible operer\u00e0. In altre parole, per Amazon c'\u00e8 launch_configuration, mentre per tutto il resto esiste l'inventario dinamico.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/517804\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Terraform \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u0435\u0442\u043e\u0434\u044b. \u0412\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 + \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 Terraform-\u043c\u043e\u0434\u0443\u043b\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c, \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93460,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93459","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=\"\u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Terraform \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u0435\u0442\u043e\u0434\u044b. \u0412\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 + \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 Terraform-\u043c\u043e\u0434\u0443\u043b\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c, \u0438\" \/>\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\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g\" \/>\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\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Terraform \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u0410\u043d\u0442\u043e\u043d \u0411\u0430\u0431\u0435\u043d\u043a\u043e (2018\u0433) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Terraform \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u0435\u0442\u043e\u0434\u044b. \u0412\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 + \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 Terraform-\u043c\u043e\u0434\u0443\u043b\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c, \u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g\" \/>\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-09-07T05:43:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-07T05:43:22+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\udd47Descrizione dell'infrastruttura in Terraform per il futuro. Anton Babenko (2018) | ProHoster","description":"Molti conoscono e usano Terraform nel lavoro quotidiano, ma non sono ancora emerse le migliori pratiche. Ogni team deve inventare i propri approcci e metodi. La vostra infrastruttura probabilmente inizia in modo semplice: qualche risorsa + alcuni sviluppatori. Col tempo, cresce in tutte le direzioni. Trovate modi per raggruppare le risorse in moduli Terraform, organizzare il codice in cartelle, e","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g","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\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Terraform \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u0410\u043d\u0442\u043e\u043d \u0411\u0430\u0431\u0435\u043d\u043a\u043e (2018\u0433) | ProHoster","og:description":"\u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u044e\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 Terraform \u0432 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043c\u0435\u0442\u043e\u0434\u044b. \u0412\u0430\u0448\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 + \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0430 \u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u043e \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b. \u0412\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432 Terraform-\u043c\u043e\u0434\u0443\u043b\u0438, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e \u043f\u0430\u043f\u043a\u0430\u043c, \u0438","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/opisanie-infrastruktury-v-terraform-na-budushhee-anton-babenko-2018g","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-09-07T05:43:22+00:00","article:modified_time":"2020-09-07T05:43:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93459","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 11:47:31","updated":"2022-09-27 15:34:51"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/93459","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=93459"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/93459\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/93460"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=93459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=93459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=93459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}