{"id":539,"date":"2022-02-12T08:36:50","date_gmt":"2022-02-12T07:36:50","guid":{"rendered":"https:\/\/www.netexpertise.eu\/es\/?p=539"},"modified":"2022-02-12T08:36:52","modified_gmt":"2022-02-12T07:36:52","slug":"recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html","title":{"rendered":"Recurso Compartido de Terraform con el Ejemplo: Claves SSH"},"content":{"rendered":"\n<p>Terraform automatiza la creaci\u00f3n de infraestructura en el cloud, com\u00fanmente conocida como infraestructura como c\u00f3digo. Necesitamos crear una m\u00e1quina virtual, que debe contener las claves SSH de 3 administradores. El objetivo ser\u00e1 hacer que este recurso compartido de Terraform sea reutilizable por otros m\u00f3dulos. Este ejemplo en <a href=\"\/es\/tag\/ibmcloud\">Cloud IBM<\/a> se basa en el plugin de IBM para Terraform, pero el m\u00e9todo sigue siendo v\u00e1lido para otros proveedores de cloud, por supuesto.<br>No puse la creaci\u00f3n de la VPC, subredes y grupos de seguridad para ganar legibilidad.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img src=\"\/uploads\/icon-clipart-recycle-recover-reuse-3418168-e1642486455484.png\" alt=\"Recurso Compartido de Terraform\"\/><\/figure><\/div>\n\n\n\n<h2><br>Recursos en un solo m\u00f3dulo<\/h2>\n\n\n\n<p>Comencemos por crear los archivos ssh.tf que contienen el c\u00f3digo que crea las claves del administrador y vm.tf el c\u00f3digo de creaci\u00f3n del servidor en el mismo directorio. Las claves se dan como par\u00e1metros a la m\u00e1quina virtual.<br><br><\/p>\n\n\n\n<pre title=\"ssh.tf\" class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">resource \"ibm_is_ssh_key\" \"user1_sshkey\" {\n  name       = \"user1\"\n  public_key = \"ssh-rsa AAAAB3[...]k+XR==\"\n}\n\nresource \"ibm_is_ssh_key\" \"user2_sshkey\" {\n  name       = \"user2\"\n  public_key = \"ssh-rsa AAAAB3[...]Zo9R==\"\n}\n\nresource \"ibm_is_ssh_key\" \"user3_sshkey\" {\n  name       = \"user3\"\n  public_key = \"ssh-rsa AAAAB3[...]67GqV=\"\n}<\/code><\/pre>\n\n\n\n<pre title=\"vm.tf\" class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">resource \"ibm_is_instance\" \"server1\" {\n  name    = \"server1\"\n  image   = var.image\n  profile = var.profile\n  vpc  = ibm_is_vpc.vpc.id\n  zone = var.zone1\n\n  primary_network_interface {\n    subnet          = ibm_is_subnet.subnet1.id\n    security_groups = [ibm_is_vpc.vpc.default_security_group]\n  }\n\n  keys = [\n    ibm_is_ssh_key.user1_sshkey.id,\n    ibm_is_ssh_key.user2_sshkey.id,\n    ibm_is_ssh_key.user3_sshkey.id\n  ]\n}<\/code><\/pre>\n\n\n\n<p><br>El c\u00f3digo es simple pero tiene un problema importante:<br>Las claves SSH no son reutilizables en otro m\u00f3dulo de Terraform. Si copiamos\/pegamos este c\u00f3digo para crear una segunda VM, un error indicar\u00e1 que las claves ya existen. Adem\u00e1s, agregar una clave requiere modificar los 2 archivos de Terraform.<\/p>\n\n\n\n<h2><br>Recursos comunes de Terraform<\/h2>\n\n\n\n<p>Por lo tanto, es necesario crear las claves SSH en un m\u00f3dulo Terraform independiente y hacerlas accesibles desde los otros m\u00f3dulos. Esto se puede lograr exportando los id de las claves utilizando los valores output. Los outputs permiten que las variables est\u00e9n disponibles en la l\u00ednea de comandos o en otros m\u00f3dulos de Terraform para su reutilizaci\u00f3n.<br>Muevamos la declaraci\u00f3n de las claves a un nuevo directorio de Terraform al que agregamos una salida <a href=\"https:\/\/www.terraform.io\/language\/values\/outputs\" target=\"_blank\" rel=\"noreferrer noopener\">output<\/a> ssh_keys que devuelve una matriz de sus ID, ya que esto es lo que las m\u00e1quinas virtuales esperan como par\u00e1metro.<br><br><\/p>\n\n\n\n<pre title=\"ssh.tf\" class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">resource \"ibm_is_ssh_key\" \"user1_sshkey\" {\n  name       = \"user1\"\n  public_key = \"ssh-rsa AAAAB3[...]k+XR==\"\n}\n\nresource \"ibm_is_ssh_key\" \"user2_sshkey\" {\n  name       = \"user2\"\n  public_key = \"ssh-rsa AAAAB3[...]Zo9R==\"\n}\n\nresource \"ibm_is_ssh_key\" \"user3_sshkey\" {\n  name       = \"user3\"\n  public_key = \"ssh-rsa AAAAB3[...]67GqV=\"\n}\n\noutput \"ssh_keys\" {\n  value = [\n    ibm_is_ssh_key.user1_sshkey.id,\n    ibm_is_ssh_key.user2_sshkey.id,\n    ibm_is_ssh_key.user3_sshkey.id\n  ]\n}<\/code><\/pre>\n\n\n\n<p><br>Despu\u00e9s de ejecutar terraform apply, podemos mostrar los valores de salida con <em>terraform output<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ terraform output\nssh_keys = [\n  \"r010-3e98b94b-9518-4e11-9ac4-a014120344dc\",\n  \"r010-b271dce5-4744-48c3-9001-a620e99563d9\",\n  \"r010-9358c6ab-0eed-4de7-a4a0-4ba20b2c04c9\",\n]<\/code><\/pre>\n\n\n\n<p><br>Es exactamente lo que quer\u00edamos. Todo lo que queda es recuperar el contenido de la salida en forma de data lookup para usarlo en el m\u00f3dulo VM.<\/p>\n\n\n\n<pre title=\"vm.tf\" class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">data \"terraform_remote_state\" \"ssh_keys\" {\n  backend = \"local\"\n  config = {\n    path = \"..\/ssh_keys\/terraform.tfstate\"\n  }\n}\n\nresource \"ibm_is_instance\" \"server1\" {\n  name    = \"server1\"\n  image   = var.image\n  profile = var.profile\n\n  primary_network_interface {\n    subnet          = ibm_is_subnet.subnet1.id\n    security_groups = [ibm_is_vpc.vpc.default_security_group]\n  }\n\n  vpc  = ibm_is_vpc.vpc.id\n  zone = var.zone1\n  keys = data.terraform_remote_state.ssh_keys.outputs.ssh_keys\n}<\/code><\/pre>\n\n\n\n<p><br>Es mucho mejor, podemos administrar las claves SSH independientemente de otros m\u00f3dulos de Terraform y reutilizarlas a voluntad. El path del data lookup es la ruta relativa al directorio que contiene el archivo ssh.tf.<\/p>\n\n\n\n<h2><br>Variables de Lista<\/h2>\n\n\n\n<p>No est\u00e1 mal pero podr\u00edamos hacer m\u00e1s elegante la creaci\u00f3n de recursos compartidos (aqu\u00ed las claves SSH).<br>De hecho, agregar una nueva clave se realiza en 2 lugares: crear un recurso de Terraform y agregarlo a los valores devueltos en la salida. Lo cual es restrictivo y genera errores.De hecho, agregar una nueva clave se realiza en 2 lugares: crear un recurso de Terraform y agregarlo a los valores devueltos en la salida. Lo cual es restrictivo y puede generar errores.<br>Adem\u00e1s, sigue siendo bastante dif\u00edcil de leer y ser\u00eda m\u00e1s claro separar valores y c\u00f3digo.<\/p>\n\n\n\n<p>Para eso almacenaremos las claves en una tabla de tipo <a href=\"https:\/\/www.terraform.io\/language\/expressions\/types#map\" target=\"_blank\" rel=\"noreferrer noopener\">map<\/a> en un archivo terraform.tfvars, que se cargar\u00e1 autom\u00e1ticamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\">ssh_keys = {\n  \"user1\" = \"ssh-rsa AAAAB3[...]k+XR==\"\n  \"user2\" = \"ssh-rsa AAAAB3[...]Zo9R==\"\n  \"user3\" = \"ssh-rsa AAAAB3[...]67GqV=\"\n}<\/code><\/pre>\n\n\n\n<p><br>En ssh.tf, luego recorreremos esta matriz de clave\/valor para crear los recursos y exportarlos en el output.<\/p>\n\n\n\n<pre title=\"ssh.tf\" class=\"wp-block-code\"><code lang=\"vim\" class=\"language-vim\"># D\u00e9finition du tableau\nvariable \"ssh_keys\" {\n  type = map(string)\n}\n\nresource \"ibm_is_ssh_key\" \"keys\" {\n  for_each = var.ssh_keys\n  name = each.key\n  public_key = each.value\n}\n\noutput \"ssh_keys\" {\n  value = values(ibm_is_ssh_key.keys)[*].id\n}<\/code><\/pre>\n\n\n\n<p><br>Recuperar valores es un poco complejo. Empec\u00e9 generando valores de output (ibm_is_ssh_key.keys) para analizar la estructura y as\u00ed recuperar los id.<\/p>\n\n\n\n<p>Al final, un nuevo recurso compartido (una clave SSH en nuestro caso) se realiza simplemente agreg\u00e1ndolo a una matriz, en un archivo que contiene solo variables. En un lugar. Cualquiera puede hacer esto sin siquiera leer o entender el c\u00f3digo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Terraform automatiza la creaci\u00f3n de infraestructura en el cloud, com\u00fanmente conocida como infraestructura como c\u00f3digo. Necesitamos crear una m\u00e1quina virtual, que debe contener las claves SSH de 3 administradores. El objetivo ser\u00e1 hacer que este recurso compartido de Terraform sea reutilizable por otros m\u00f3dulos. Este ejemplo en Cloud IBM se basa en el plugin de [&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":[68,117],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Recurso Compartido de Terraform con el Ejemplo: Claves SSH<\/title>\n<meta name=\"description\" content=\"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.\" \/>\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\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Recurso Compartido de Terraform con el Ejemplo: Claves SSH\" \/>\n<meta property=\"og:description\" content=\"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-12T07:36:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-12T07:36:52+00:00\" \/>\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\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html\",\"url\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html\",\"name\":\"Netexpertise - Recurso Compartido de Terraform con el Ejemplo: Claves SSH\",\"isPartOf\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#website\"},\"datePublished\":\"2022-02-12T07:36:50+00:00\",\"dateModified\":\"2022-02-12T07:36:52+00:00\",\"author\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\"},\"description\":\"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"http:\/\/www.netexpertise.eu\/es\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Recurso Compartido de Terraform con el Ejemplo: Claves SSH\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#website\",\"url\":\"http:\/\/www.netexpertise.eu\/es\/\",\"name\":\"Netexpertise\",\"description\":\"Sistemas \/ Redes \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.netexpertise.eu\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\/\/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 - Recurso Compartido de Terraform con el Ejemplo: Claves SSH","description":"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.","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\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html","og_locale":"es_ES","og_type":"article","og_title":"Netexpertise - Recurso Compartido de Terraform con el Ejemplo: Claves SSH","og_description":"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.","og_url":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html","og_site_name":"Netexpertise","article_published_time":"2022-02-12T07:36:50+00:00","article_modified_time":"2022-02-12T07:36:52+00:00","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\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html","url":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html","name":"Netexpertise - Recurso Compartido de Terraform con el Ejemplo: Claves SSH","isPartOf":{"@id":"http:\/\/www.netexpertise.eu\/es\/#website"},"datePublished":"2022-02-12T07:36:50+00:00","dateModified":"2022-02-12T07:36:52+00:00","author":{"@id":"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf"},"description":"Cree recursos compartidos de Terraform para acceder a ellos desde otros m\u00f3dulos a trav\u00e9s de un output. Ejemplo de una VM que usa claves SSH.","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/es\/devops\/terraform\/recurso-compartido-de-terraform-con-el-ejemplo-claves-ssh.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"http:\/\/www.netexpertise.eu\/es"},{"@type":"ListItem","position":2,"name":"Recurso Compartido de Terraform con el Ejemplo: Claves SSH"}]},{"@type":"WebSite","@id":"http:\/\/www.netexpertise.eu\/es\/#website","url":"http:\/\/www.netexpertise.eu\/es\/","name":"Netexpertise","description":"Sistemas \/ Redes \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.netexpertise.eu\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Person","@id":"http:\/\/www.netexpertise.eu\/es\/#\/schema\/person\/27ec923be6625ac4b4bb86c8f0b12abf","name":"dave","image":{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/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\/539"}],"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=539"}],"version-history":[{"count":11,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/539\/revisions"}],"predecessor-version":[{"id":550,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/posts\/539\/revisions\/550"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/media?parent=539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/categories?post=539"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/es\/wp-json\/wp\/v2\/tags?post=539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}