在小部件上循环

时间:2019-07-15 07:47:55

标签: terraform terraform-provider-aws

如何仅迭代terraform脚本的窗口小部件部分并在单个仪表板中获取所有窗口小部件?

locals {
  instances = csvdecode(file("${path.module}/sample.csv"))
}

//如果使用count,它将循环这部分

resource "aws_cloudwatch_dashboard" "main" {
  dashboard_name = "my-dashboard" 

  dashboard_body = <<EOF
 { 
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,  

          "properties":{
             "metrics":[ 
              for itr in local.instances.id:

                [
                   "AWS/EC2",
                   "CPUUtilization",
                   "InstanceId",
                   itr   // want this section to fetch the value form excel 
                ]

             ],
             "period":300,
             "stat":"Average",
             "region":"ap-south-1",
             "title":"EC2 Instance CPU ",
             "annotations": {
                "horizontal": [
                      {
                         "label": "Untitled annotation",
                         "value": 2
                     }]}

          }},]}EOF}

2 个答案:

答案 0 :(得分:1)

如果您的目标是生成JSON,则通常最好使用jsonencode而不是template_file,因为它可以自动处理JSON语法详细信息,从而避免需要调整文本的烦人细节模板以获取正确的JSON。

例如:

dashboard_body = jsonencode({
  "widgets": [
    "type": "metric",
    "x": 0,
    "y": 0,
    "width": 12,
    "height": 6,

    "properties": {
      "metrics": [
        for inst in local.instances : [
          "AWS/EC2",
          "CPUUtilization",
          "InstanceId",
          inst.id,
        ]
      ],
      "period": 300,
      # etc, etc
    },
  ],
})

通过使用jsonencode,您可以使用Terraform的任何常规语言功能来生成数据结构,而保留jsonencode函数以将其最终转换为有效的JSON语法。

答案 1 :(得分:0)

我尝试使用两个template_file资源。

sample.csv进行测试

instance_id
i-00001
i-00002
i-00003
  1. 创建用于循环的template_file资源
data "template_file" "ec2_metric" {
  count    = length(local.instances)
  template = jsonencode([ "AWS/EC2", "CPUUtilization", "InstanceId", element(local.instances.*.instance_id, count.index)])
}
  1. 为整个json创建一个template_file
data "template_file" "widgets" {
  template = <<JSON
  { 
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,  

          "properties":{
             "metrics":[ 
               ${join(", \n               ", data.template_file.ec2_metric.*.rendered)}

             ],
             "period":300,
             "stat":"Average",
             "region":"ap-south-1",
             "title":"EC2 Instance CPU ",
             "annotations": {
                "horizontal": [
                      {
                         "label": "Untitled annotation",
                         "value": 2
                     }]}

          }},]}
JSON
}
  1. 使用template_file,
resource "aws_cloudwatch_dashboard" "main" {
  dashboard_name = "my-dashboard" 

  dashboard_body = data.template_file.widgets.rendered
...
}
  1. 测试template_file.widgets
output "test" {
  value = data.template_file.widgets.rendered
}

结果

Outputs:

test =   { 
   "widgets": [
       {
          "type":"metric",
          "x":0,
          "y":0,
          "width":12,
          "height":6,  

          "properties":{
             "metrics":[ 
               ["AWS/EC2","CPUUtilization","InstanceId","i-00001"], 
               ["AWS/EC2","CPUUtilization","InstanceId","i-00002"], 
               ["AWS/EC2","CPUUtilization","InstanceId","i-00003"]
             ],
             "period":300,
             "stat":"Average",
             "region":"ap-south-1",
             "title":"EC2 Instance CPU ",
             "annotations": {
                "horizontal": [
                      {
                         "label": "Untitled annotation",
                         "value": 2
                     }]}

          }},]}