{"id":1153,"date":"2022-01-17T22:41:57","date_gmt":"2022-01-17T21:41:57","guid":{"rendered":"https:\/\/www.netexpertise.eu\/fr\/?p=1153"},"modified":"2022-02-10T08:30:13","modified_gmt":"2022-02-10T07:30:13","slug":"ressource-partagee-terraform-par-lexemple-les-cles-ssh","status":"publish","type":"post","link":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html","title":{"rendered":"Ressource Partag\u00e9e Terraform par l&rsquo;Exemple: les Cl\u00e9s SSH"},"content":{"rendered":"\n<p>Terraform permet d&rsquo;automatiser la cr\u00e9ation d&rsquo;infrastructures dans le cloud, ce qu&rsquo;on appelle commun\u00e9ment l&rsquo;infrastructure as code. Il nous faut cr\u00e9er une machine virtuelle, laquelle doit contenir les cl\u00e9s SSH de 3 administrateurs. Le but sera de faire en sorte que cette ressource partag\u00e9e Terraform soit r\u00e9utilisable par d&rsquo;autres modules. Cet exemple sur le <a href=\"\/fr\/tag\/ibmcloud\">Cloud IBM<\/a> s&rsquo;appuie sur le plugin IBM pour Terraform mais la m\u00e9thode reste valide pour les autres cloud providers \u00e9videmment.<br>Je n&rsquo;ai pas mis la cr\u00e9ation du VPC, des subnets et security groups pour gagner en lisibilit\u00e9.<br><br><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" src=\"\/uploads\/icon-clipart-recycle-recover-reuse-3418168-e1642486455484.png\" alt=\"Ressource Partag\u00e9e Terraform\" width=\"640\" height=\"363\"\/><\/figure><\/div>\n\n\n\n<h2><br>Ressources dans un Module Unique<\/h2>\n\n\n\n<p>Commen\u00e7ons par cr\u00e9er les fichiers ssh.tf contenant le code cr\u00e9ant les cl\u00e9s des administrateurs, et vm.tf le code de cr\u00e9ation du serveur dans un m\u00eame r\u00e9pertoire. Les cl\u00e9s sont donn\u00e9es en param\u00e8tre \u00e0 la VM.<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>Le code est simple mais pose un probl\u00e8me majeur:<br>Les cl\u00e9s SSH ne sont pas r\u00e9utilisables dans un autre module Terraform. Si on copie\/colle ce code pour cr\u00e9er une 2me VM, une erreur indiquera que les cl\u00e9s existent d\u00e9j\u00e0. L&rsquo;ajout d&rsquo;une cl\u00e9 n\u00e9cessite de modifier les 2 fichiers Terraform.<\/p>\n\n\n\n<h2><br>Ressources Communes Terraform<\/h2>\n\n\n\n<p>Il faut donc cr\u00e9er les cl\u00e9s SSH dans un module Terraform ind\u00e9pendant et les rendre accessibles depuis les autres modules. On peut y parvenir en exportant les id des cl\u00e9s gr\u00e2ce aux valeurs outputs. Les outputs permettent de rendre des variables accessibles en ligne de commande ou \u00e0 d&rsquo;autres modules Terraform pour les r\u00e9utiliser.<br>D\u00e9pla\u00e7ons la d\u00e9claration des cl\u00e9s dans un nouveau r\u00e9pertoire Terraform auquel nous ajoutons une sortie output ssh_keys qui renvoie un tableau de leurs id, puisque c&rsquo;est ce qu&rsquo;attendent les VM en param\u00e8tre.<\/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>Apr\u00e8s avoir lanc\u00e9 <em>terraform apply<\/em>, on peut afficher les valeurs <a href=\"https:\/\/www.terraform.io\/language\/values\/outputs\" target=\"_blank\" rel=\"noreferrer noopener\">output<\/a> avec <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>C&rsquo;est exactement ce que nous voulions. Ne reste qu&rsquo;\u00e0 r\u00e9cup\u00e9rer le contenu de l&rsquo;output sous forme de data lookup pour l&rsquo;exploiter dans le module 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>C&rsquo;est beaucoup mieux, on est capable de g\u00e9rer les cl\u00e9s SSH ind\u00e9pendamment des autres modules Terraform et de les r\u00e9utiliser comme bon nous semble. Le path du data lookup est le chemin relatif vers le r\u00e9pertoire contenant le fichier ssh.tf.<\/p>\n\n\n\n<h2><br>Variables sous Forme de Liste<\/h2>\n\n\n\n<p>C&rsquo;est pas mal mais on pourrait rendre la cr\u00e9ation des ressources partag\u00e9es (ici les cl\u00e9s SSH) plus \u00e9l\u00e9gante.<br>En effet, l&rsquo;ajout d&rsquo;une nouvelle cl\u00e9 se fait \u00e0 2 endroits: cr\u00e9er une ressource Terraform, et l&rsquo;ajouter aux valeurs retourn\u00e9es dans l&rsquo;output. Ce qui est contraignant et g\u00e9n\u00e9rateur d&rsquo;erreurs.<br>De plus, ca reste assez difficile \u00e0 lire et il serait plus clair de s\u00e9parer valeurs et code.<br><br>Pour cela, nous allons stocker les cl\u00e9s dans une table de type <a href=\"https:\/\/www.terraform.io\/language\/expressions\/types#map\" target=\"_blank\" rel=\"noreferrer noopener\">map<\/a> dans un fichier terraform.tfvars, qui sera charg\u00e9 automatiquement.<\/p>\n\n\n\n<pre title=\"terraform.tfvars\" 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>Dans ssh.tf, nous allons ensuite ex\u00e9cuter une boucle sur ce tableau de cl\u00e9\/valeur pour cr\u00e9er les ressources, et les exporter dans l&rsquo;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>La r\u00e9cup\u00e9ration des valeurs est un peu complexe. J&rsquo;ai commenc\u00e9 par sortir en output values(ibm_is_ssh_key.keys) pour analyser la structure et ainsi r\u00e9cup\u00e9rer les ids.<br><br>Au final, une nouvelle ressource partag\u00e9e (une cl\u00e9 SSH dans notre cas) se fait en l&rsquo;ajoutant simplement dans un tableau, dans un fichier ne contenant que des variables. A un seul endroit. N&rsquo;importe qui peut s&rsquo;en charger sans m\u00eame lire ou comprendre le code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Terraform permet d&rsquo;automatiser la cr\u00e9ation d&rsquo;infrastructures dans le cloud, ce qu&rsquo;on appelle commun\u00e9ment l&rsquo;infrastructure as code. Il nous faut cr\u00e9er une machine virtuelle, laquelle doit contenir les cl\u00e9s SSH de 3 administrateurs. Le but sera de faire en sorte que cette ressource partag\u00e9e Terraform soit r\u00e9utilisable par d&rsquo;autres modules. Cet exemple sur le Cloud IBM [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[440,468],"tags":[453,469],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Netexpertise - Ressource Partag\u00e9e Terraform par l&#039;Exemple: les Cl\u00e9s SSH<\/title>\n<meta name=\"description\" content=\"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d&#039;autres modules via un output. Exemple d&#039;une VM faisant appel \u00e0 des cl\u00e9s 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\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Netexpertise - Ressource Partag\u00e9e Terraform par l&#039;Exemple: les Cl\u00e9s SSH\" \/>\n<meta property=\"og:description\" content=\"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d&#039;autres modules via un output. Exemple d&#039;une VM faisant appel \u00e0 des cl\u00e9s SSH.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html\" \/>\n<meta property=\"og:site_name\" content=\"Netexpertise\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-17T21:41:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-10T07:30:13+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\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html\",\"url\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html\",\"name\":\"Netexpertise - Ressource Partag\u00e9e Terraform par l'Exemple: les Cl\u00e9s SSH\",\"isPartOf\":{\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#website\"},\"datePublished\":\"2022-01-17T21:41:57+00:00\",\"dateModified\":\"2022-02-10T07:30:13+00:00\",\"author\":{\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\"},\"description\":\"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d'autres modules via un output. Exemple d'une VM faisant appel \u00e0 des cl\u00e9s SSH.\",\"breadcrumb\":{\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.netexpertise.eu\/fr\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ressource Partag\u00e9e Terraform par l&rsquo;Exemple: les Cl\u00e9s SSH\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#website\",\"url\":\"https:\/\/www.netexpertise.eu\/fr\/\",\"name\":\"Netexpertise\",\"description\":\"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632\",\"name\":\"dave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.netexpertise.eu\/fr\/#\/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\"},\"sameAs\":[\"http:\/\/www.netexpertise.eu\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Netexpertise - Ressource Partag\u00e9e Terraform par l'Exemple: les Cl\u00e9s SSH","description":"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d'autres modules via un output. Exemple d'une VM faisant appel \u00e0 des cl\u00e9s 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\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html","og_locale":"fr_FR","og_type":"article","og_title":"Netexpertise - Ressource Partag\u00e9e Terraform par l'Exemple: les Cl\u00e9s SSH","og_description":"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d'autres modules via un output. Exemple d'une VM faisant appel \u00e0 des cl\u00e9s SSH.","og_url":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html","og_site_name":"Netexpertise","article_published_time":"2022-01-17T21:41:57+00:00","article_modified_time":"2022-02-10T07:30:13+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\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html","url":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html","name":"Netexpertise - Ressource Partag\u00e9e Terraform par l'Exemple: les Cl\u00e9s SSH","isPartOf":{"@id":"https:\/\/www.netexpertise.eu\/fr\/#website"},"datePublished":"2022-01-17T21:41:57+00:00","dateModified":"2022-02-10T07:30:13+00:00","author":{"@id":"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632"},"description":"Cr\u00e9ez des ressources partag\u00e9es Terraform pour y acc\u00e9der depuis d'autres modules via un output. Exemple d'une VM faisant appel \u00e0 des cl\u00e9s SSH.","breadcrumb":{"@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.netexpertise.eu\/fr\/devops\/terraform\/ressource-partagee-terraform-par-lexemple-les-cles-ssh.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.netexpertise.eu\/fr"},{"@type":"ListItem","position":2,"name":"Ressource Partag\u00e9e Terraform par l&rsquo;Exemple: les Cl\u00e9s SSH"}]},{"@type":"WebSite","@id":"https:\/\/www.netexpertise.eu\/fr\/#website","url":"https:\/\/www.netexpertise.eu\/fr\/","name":"Netexpertise","description":"Syst\u00e8mes \/ R\u00e9seaux \/ DevOps","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.netexpertise.eu\/fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.netexpertise.eu\/fr\/#\/schema\/person\/e398f0307e2b167f6b884c4953be2632","name":"dave","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.netexpertise.eu\/fr\/#\/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"},"sameAs":["http:\/\/www.netexpertise.eu"]}]}},"_links":{"self":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/1153"}],"collection":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/comments?post=1153"}],"version-history":[{"count":0,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/posts\/1153\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/media?parent=1153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/categories?post=1153"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.netexpertise.eu\/fr\/wp-json\/wp\/v2\/tags?post=1153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}