{"id":559,"date":"2022-03-21T22:50:31","date_gmt":"2022-03-21T21:50:31","guid":{"rendered":"https:\/\/www.netexpertise.eu\/es\/?p=559"},"modified":"2022-03-21T22:50:34","modified_gmt":"2022-03-21T21:50:34","slug":"administre-las-entradas-de-dns-con-terraform","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html","title":{"rendered":"Administre las Entradas de DNS con Terraform"},"content":{"rendered":"\n<p><a href=\"\/es\/category\/devops\/terraform\">Terraform<\/a> ayuda a construir la infraestructura as code. Cada vez m\u00e1s servidores web ahora ofrecen plugins de Terraform para administrar zonas DNS. Gandi es uno de ellos, junto con OVH y muchos otros. Probemos la versi\u00f3n 2 que se acaba de lanzar y veamos c\u00f3mo crear registros DNS en Gandi desde un repositorio de Git.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img src=\"http:\/\/www.netexpertise.eu\/uploads\/technology-network-golden-background-6873012.jpg\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<h2><br>El Provider de DNS Terraform Gandi<\/h2>\n\n\n\n<p>El <a href=\"https:\/\/registry.terraform.io\/providers\/psychopenguin\/gandi\/latest\/docs\" target=\"_blank\" rel=\"noreferrer noopener\">proveedor Terraform de Gandi<\/a> se declara en un archivo, por lo general, provider.tf. Puede agregar la clave API de Gandi necesaria para autenticar y registrar recursos. Se puede generar desde su sitio web en \u00abConfiguraci\u00f3n de usuario\u00bb, \u00abAdministraci\u00f3n de cuentas de usuario y configuraci\u00f3n de seguridad\u00bb en la pesta\u00f1a Seguridad.<br>Por obvias razones de seguridad, se recomienda crear la clave de la clave API en la variable de entorno GANDI_KEY. Lo dejo as\u00ed en provider.tf como parte de la prueba.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">terraform {\n  required_providers {\n    gandi = {\n      version = \"~&gt; 2.0\"\n      source   = \"go-gandi\/gandi\"\n    }\n  }\n}\n\nprovider \"gandi\" {\n  key = \"XXXXXXXXXXXXXXXXXXX\"\n}<\/code><\/pre>\n\n\n\n<h2><br>Archivo de registros DNS<\/h2>\n\n\n\n<p>Gandi realiza copias de seguridad autom\u00e1ticas de las entradas de DNS en un formato de archivo simple, en el que me inspir\u00e9 para el archivo de registros de DNS. Llam\u00e9moslo dominio.txt donde \u00abdominio\u00bb es su nombre de dominio. Aqu\u00ed hay un ejemplo con 3 entradas DNS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">www1 300 IN A 127.0.0.1\nwww2 300 IN A 127.0.0.1\nwww  300 IN CNAME www1<\/code><\/pre>\n\n\n\n<p><br>Debemos declarar el dominio como una variable que usaremos m\u00e1s adelante, en variable.tf.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">variable domain {\n  default = \"mydomain.com\"\n}<\/code><\/pre>\n\n\n\n<h2><br>C\u00f3digo Terraform de Entradas DNS<\/h2>\n\n\n\n<p>Aqu\u00ed hay un archivo main.tf de Terraform minimalista que lee el archivo que contiene las entradas de DNS y crea un nuevo registro de cada l\u00ednea.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">data \"local_file\" \"dns_file\" {\n  filename = \".\/${var.domain}.txt\"\n}\n\nlocals {\n  # Convertit le fichier en tableau\n  dns_records = toset([ for e in split(\"\\n\", data.local_file.dns_file.content) :\n                        replace(e, \"\/\\\\s+\/\", \" \") if e != \"\" ])\n}\n  \nresource \"gandi_livedns_record\" \"record\" {\n  for_each =  local.dns_records\n  zone     =  var.domain\n  name     =  split(\" \",each.value)[0]\n  type     =  split(\" \",each.value)[3]\n  ttl      =  split(\" \",each.value)[1]\n  values   = [split(\" \",each.value)[4]]\n}<\/code><\/pre>\n\n\n\n<p><br>Puede apreciar el poder de Terraform, que puede hacer mucho con solo unas pocas l\u00edneas de c\u00f3digo.<br><br>Tenga en cuenta que estoy eliminando varios espacios &#8211; replace(e, \u00ab\/\\\\s+\/\u00bb, \u00bb \u00ab) &#8211; al dividir las l\u00edneas porque la funci\u00f3n de divisi\u00f3n crea un elemento vac\u00edo si procesa dos espacios. Tambi\u00e9n ignoro las l\u00edneas en blanco. Luego recorremos cada l\u00ednea para crear registros DNS con un recurso de tipo <em>gandi_livedns_record<\/em>.<br>Funciona con entradas A y CNAME.<br><br>Podr\u00edamos aplicar diferentes tratamientos para cada tipo de registro creando tablas separadas o ignorando otros tipos de DNS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">dns_records   = [ for e in split(\"\\n\", data.local_file.dns_file.content) :\n                  replace(e, \"\/\\\\s+\/\", \" \") if e != \"\" ]\nA_records     = toset([for e in local.dns_records : e if split(\" \",e)[3] == \"A\"])\nCNAME_records = toset([for e in local.dns_records : e if split(\" \",e)[3] == \"CNAME\"])<\/code><\/pre>\n\n\n\n<p><br>Luego podr\u00edamos recorrer A_records para crear las entradas A y procesar los CNAME en un segundo bloque de recursos.<br>Otras posibilidades: manejo de CNAMEs multivalor, registros TXT, etc\u2026<\/p>\n\n\n\n<h2><br>Plan y Aplicaci\u00f3n de Creaci\u00f3n de Entradas de DNS<\/h2>\n\n\n\n<p>Ejecute <em>terraform plan<\/em> para comprobar lo qu\u00e9 terraform se va a modificar. Deber\u00eda mostrar que se crear\u00e1n 3 recursos. ejecute <em>terraform apply<\/em> para crear las entradas de DNS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ terraform plan\n\nTerraform used the selected providers to generate the following execution plan.\nResource actions are indicated with the following symbols:\n  + create\n\nTerraform will perform the following actions:\n\n  # gandi_livedns_record.record[\"www 300 IN CNAME www1\"] will be created\n  + resource \"gandi_livedns_record\" \"record\" {\n      + href   = (known after apply)\n      + id     = (known after apply)\n      + name   = \"www\"\n      + ttl    = 300\n      + type   = \"CNAME\"\n      + values = [\n          + \"www1\",\n        ]\n      + zone   = \"domain.com\"\n    }\n\n  [...]\n\nPlan: 3 to add, 0 to change, 0 to destroy.<\/code><\/pre>\n\n\n\n<p><br>En cuanto al rendimiento, prob\u00e9 la creaci\u00f3n de 200 entradas y tard\u00e9 2&#8217;57\u00bb con una conexi\u00f3n bastante mala. S\u00ed, es un poco lento ya que se basa en llamar a una API REST para cada entrada. Sin embargo, crear una entrada adicional ser\u00e1 muy r\u00e1pido.<br>Un <em>terraform plan<\/em> tard\u00f3 1&#8217;31\u00bb en actualizar estas 200 entradas.<br><br>Por supuesto, siempre puede omitir el paso de actualizaci\u00f3n <em>terraform plan -refresh=false<\/em> que demora menos de un segundo.<br>El plan se puede guardar en un archivo temporal, que se puede cargar al aplicar los cambios.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">$ terraform plan -refresh=false -out=plan.file\n$ terraform apply plan.file<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Terraform ayuda a construir la infraestructura as code. Cada vez m\u00e1s servidores web ahora ofrecen plugins de Terraform para administrar zonas DNS. Gandi es uno de ellos, junto con OVH y muchos otros. Probemos la versi\u00f3n 2 que se acaba de lanzar y veamos c\u00f3mo crear registros DNS en Gandi desde un repositorio de Git. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[62,116],"tags":[117],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Administre las Entradas de DNS con Terraform<\/title>\n<meta name=\"description\" content=\"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Administre las Entradas de DNS con Terraform\" \/>\n<meta property=\"og:description\" content=\"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-21T21:50:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-21T21:50:34+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.netexpertise.eu\/uploads\/technology-network-golden-background-6873012.jpg\" \/>\n<meta name=\"author\" content=\"dave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@netexpertise\" \/>\n<meta name=\"twitter:site\" content=\"@netexpertise\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html\",\"url\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html\",\"name\":\"Netexpertise - Administre las Entradas de DNS con Terraform\",\"isPartOf\":{\"@id\":\"https:\/\/www.netexpertise.eu\/es\/#website\"},\"datePublished\":\"2022-03-21T21:50:31+00:00\",\"dateModified\":\"2022-03-21T21:50:34+00:00\",\"author\":{\"@id\":\"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\"},\"description\":\"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.netexpertise.eu\/es\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Administre las Entradas de DNS con Terraform\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.netexpertise.eu\/es\/#website\",\"url\":\"https:\/\/www.netexpertise.eu\/es\/\",\"name\":\"Netexpertise\",\"description\":\"Sistemas \/ Redes \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.netexpertise.eu\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g\",\"caption\":\"dave\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Administre las Entradas de DNS con Terraform","description":"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html","og_locale":"es_ES","og_type":"article","og_title":"Netexpertise - Administre las Entradas de DNS con Terraform","og_description":"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform","og_url":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html","og_site_name":"Netexpertise","article_published_time":"2022-03-21T21:50:31+00:00","article_modified_time":"2022-03-21T21:50:34+00:00","og_image":[{"url":"http:\/\/www.netexpertise.eu\/uploads\/technology-network-golden-background-6873012.jpg"}],"author":"dave","twitter_card":"summary_large_image","twitter_creator":"@netexpertise","twitter_site":"@netexpertise","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html","url":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html","name":"Netexpertise - Administre las Entradas de DNS con Terraform","isPartOf":{"@id":"https:\/\/www.netexpertise.eu\/es\/#website"},"datePublished":"2022-03-21T21:50:31+00:00","dateModified":"2022-03-21T21:50:34+00:00","author":{"@id":"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf"},"description":"Gestiona sus registros DNS desde un repositorio Git y apl\u00edcalos a su proveedor de Gandi con Terraform","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/administre-las-entradas-de-dns-con-terraform.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.netexpertise.eu\/es"},{"@type":"ListItem","position":2,"name":"Administre las Entradas de DNS con Terraform"}]},{"@type":"WebSite","@id":"https:\/\/www.netexpertise.eu\/es\/#website","url":"https:\/\/www.netexpertise.eu\/es\/","name":"Netexpertise","description":"Sistemas \/ Redes \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.netexpertise.eu\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf","name":"dave","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/image\/","url":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","contentUrl":"http:\/\/1.gravatar.com\/avatar\/1129916e1f4955bd632f27f836f64e55?s=96&d=mm&r=g","caption":"dave"}}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/559"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/comments?post=559"}],"version-history":[{"count":9,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/559\/revisions"}],"predecessor-version":[{"id":569,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/559\/revisions\/569"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/media?parent=559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/categories?post=559"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/tags?post=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}