टेराफॉर्म: क्या संसाधन के लिए कई टैग निर्दिष्ट करने के लिए एक संक्षिप्त सिंटैक्स है?


10

एक संसाधन में कई टैग संलग्न करने के लिए, मैं वर्तमान में कई tagब्लॉकों का उपयोग करता हूं :

resource "aws_autoscaling_group" "instance" {
  ...

  tag {
    key                 = "Name"
    value               = "${var.cluster_prefix}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Owner"
    value               = "${var.tag_Owner}"
    propagate_at_launch = true
  }

  tag {
    key                 = "Project"
    value               = "${var.tag_Project}"
    propagate_at_launch = true
  }
}

यह काम करता है, लेकिन मुझे आश्चर्य है कि अगर अधिक संक्षिप्त वाक्यविन्यास है। यह भी एक त्रुटि सा है क्योंकि आपको propagate_at_launchप्रत्येक टैग के लिए निर्दिष्ट करना होगा ।

अपडेट: यह प्रश्न Terrafrom v0.12 के सामने आने से पहले लिखा गया था। तब से डायनेमिक नेस्ट ब्लॉक ( नीचे मेरा उत्तर देखें ) के साथ समर्थन में सुधार हुआ है ।

जवाबों:


7

इसके auto-scaling-groupलिए सबसे संक्षिप्त सिंटैक्स उपलब्ध है।

अधिकांश अन्य संसाधनों के लिए आप tagsसिंटैक्स का उपयोग करते हैं जो इस तरह दिखता है:

tags {
  Key1 = "value1"
  Key2 = "value2"
}

3

Terraform v0.12 ने डायनेमिक नेस्ट ब्लॉक के लिए समर्थन जोड़ा। निम्न उदाहरण नई सुविधाओं के बारे में उनके ब्लॉग पोस्ट से लिया गया है (अनुभाग डायनेमिक नेस्ट ब्लॉक देखें ):

locals {
  standard_tags = {
    Name    = var.cluster_prefix
    Owner   = var.tag_Owner
    Project = var.tag_Project
  }
}

resource "aws_autoscaling_group" "example" {
  # ...

  dynamic "tag" {
    for_each = local.standard_tags

    content {
      key                 = tag.key
      value               = tag.value
      propagate_at_launch = true
    }
  }
}

2

एक अन्य विकल्प terraform-null-labelमॉड्यूल का उपयोग करना है। यह tagsमानक टेराफ़ॉर्म मानचित्र के रूप में एक चर को पारित करने का समर्थन करता है । मॉड्यूल तब एक आउटपुट का उत्सर्जन करता है जिसे कहा जाता है tags_as_list_of_mapsकि आपके इच्छित प्रारूप में टैग शामिल हैं। लेकिन इस मॉड्यूल का उपयोग करने का एक और बेहतर कारण एक निश्चित सम्मेलन का पालन करने वाले संसाधन नामों का लगातार सेट उत्पन्न करना है।

उदाहरण के लिए, आप यह कर सकते हैं:

module "example" {
  source     = "git::https://github.com/cloudposse/terraform-null-label.git?ref=master"
  namespace  = "eg"
  stage      = "prod"
  name       = "bastion"
  tags       = { 
                 "BusinessUnit" = "XYZ" 
                 "Snapshot" = "true"
               }
}

तो आपके उदाहरण से, हम फिर कुछ इस तरह लिख सकते हैं:

resource "aws_autoscaling_group" "instance" {
  ...
  name = "${module.example.id}"
  ...
  tags = "${module.example.tags_as_list_of_maps}"
  ...
}

नोट: मैंने nameसह उत्पन्न करने के तरीके को दिखाने के लिए फ़ील्ड को जोड़ा


प्रत्येक रिसोर्स के लिए "नाम" यूनीक बनाने का सबसे अच्छा तरीका क्या होगा? यदि आप पुलों पर प्रत्येक "नाम" नल-लेबल मॉड्यूल का उपयोग करते हैं तो समान है। क्या होगा अगर आप अपने सबनेट को किसी प्रत्यय जैसे -पाइप-सबनेट का नाम देना चाहते हैं? क्या कोई तरीका है जो नल-लेबल को संभाल सकता है?
इजाक

0

aws_autoscaling_groupअब टैग की एक सूची का समर्थन करता है ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags )। लेकिन यह अन्य टेराफ़ॉर्म संसाधनों के सिंटैक्स के लिए थोड़ा अलग दिखता है:

tags = [
  {
    key                 = "explicit1"
    value               = "value1"
    propagate_at_launch = true
  },
  {
    key                 = "explicit2"
    value               = "value2"
    propagate_at_launch = true
  },
]

यह प्रक्षेप के माध्यम से गतिशील रूप से टैग बनाने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.