Terraform: Bir kaynak için birden fazla etiket belirtmek için özlü bir sözdizimi var mı?


10

Bir kaynağa birden çok etiket eklemek için şu anda birden çok tagblok kullanıyorum:

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
  }
}

Çalışıyor, ama daha kısa bir sözdizimi olup olmadığını merak ediyorum. Ayrıca, propagate_at_launchher bir etiket için belirtmeniz gereken bir hatadır .

Güncelleme: Soru Terrafrom v0.12 çıkmadan önce yazılmıştır. O zamandan beri destek Dinamik İç İçe Bloklar ile gelişti ( aşağıdaki cevabıma bakın ).

Yanıtlar:


7

Bunun için auto-scaling-groupmevcut en kısa sözdizimidir.

Diğer kaynakların çoğunda tagsşuna benzer sözdizimini kullanırsınız :

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

3

Terraform v0.12, Dinamik İç İçe Bloklar için destek ekledi. Aşağıdaki örnek, yeni özellikler hakkındaki blog gönderilerinden türetilmiştir ( Dinamik İç İçe Bloklar bölümüne bakın ):

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

Başka bir seçenek de terraform-null-labelmodülü kullanmaktır . tagsStandart Terraform haritası olarak adlandırılan bir değişkeni geçirmeyi destekler . Ardından modül tags_as_list_of_maps, etiketleri istediğiniz biçimde içeren çağrılan bir çıktı yayar . Ancak bu modülü kullanmanın daha iyi bir nedeni, sabit bir kurala uyan tutarlı bir dizi kaynak adı oluşturmaktır.

Örneğin, bunu yapabilirsiniz:

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"
               }
}

Böylece örneğinizden, şöyle bir şey yazabiliriz:

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

NOT:name Alanın nasıl oluşturulacağını göstermek için ekledim


Her kaynak için "isim" uniqi yapmanın en iyi yolu ne olurdu? null-label modülünü kullanırsanız, kaynaklardaki her "isim" aynıdır. Alt ağlarınızı -private-subnet gibi bir sonekle adlandırmak isterseniz ne olur? Boş etiketin bununla başa çıkmasının bir yolu var mı?
Izac

0

aws_autoscaling_groupŞimdi bir etiket listesi desteklemiyor ( https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#tags ). Ancak bu, diğer terraform kaynaklarının sözdiziminden biraz farklı görünüyor:

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

Bu aynı zamanda enterpolasyon yoluyla dinamik olarak etiket oluşturmaya izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.