Terraform 地形最佳实践-避免重复

Terraform 地形最佳实践-避免重复,terraform,devops,terraform-provider-aws,Terraform,Devops,Terraform Provider Aws,我正在考虑将我们的一些基础架构代码切换到Terraform,因为我们在AWS CloudFormation上遇到了一些障碍 让我举一个我正在努力实现的例子。我有一个ECS集群,它可以运行10多个不同的任务定义。每个任务定义包含几乎相同的配置,因此为了避免代码重复,我正在构建一个可重用的模块 从我收集的信息来看,有3种主要的方法可以构建您的terraform目录 1: 使用这种结构,我必须从env文件夹中获取变量,并将其与-var files=“env/dev.tfvars”一起传递,然后在我的m

我正在考虑将我们的一些基础架构代码切换到Terraform,因为我们在AWS CloudFormation上遇到了一些障碍

让我举一个我正在努力实现的例子。我有一个ECS集群,它可以运行10多个不同的任务定义。每个任务定义包含几乎相同的配置,因此为了避免代码重复,我正在构建一个可重用的模块

从我收集的信息来看,有3种主要的方法可以构建您的terraform目录

1:

使用这种结构,我必须从env文件夹中获取变量,并将其与
-var files=“env/dev.tfvars”
一起传递,然后在我的main.tf中,我必须将变量传递到modules/ecs/task/main.tf,这似乎需要很长的一段路,并且需要很多步骤才能将变量传递到ecs/task/main.tf

二,

如果希望将基于环境的变量应用于
modules/ecs/task/main.tf
,则必须从调用
modules/ecs/main.tf
的示例阶段中的
main.tf
开始。然后通过
/modules/ecs/main.tf
将其应用于
/modules/ecs/task/main.tf

这种方法的问题还在于,每当我添加新模块时,我都必须将其添加到所有不同环境的main.tf中

三,

使用terraform工作区,我可以使用modules/ecs/task/variables.tf中的局部变量来确定我正在构建的环境。像这样:

modules/ecs/task.variables.tf

locals {

env="${terraform.workspace}"

masterAccountIDS = {

"default"="12121212"

"dev"="84848484"

}



masterAccountID="${lookup(local.masterAccountIDS, local.env)}"

}
但这需要每次我添加一个新环境时,我都要检查所有variables.tf文件,并添加一个名为“stage”的新条目


我想不出一种方法可以让我不复制粘贴代码,或在添加新环境时插入新内容,或将所有内容都放在一个位置,因此我可能只需要编辑一个文件。

使用工作空间是目前最好的选择。我使用下面的方法在一个地方管理所有变量-

默认值。tf-

/* DEFAULT VARIABLES */

locals {
  tags = {
      Project = "${var.project}"
      Contact = "vivek@vivekyadav.me"
      Requester = "Vivek"
      Creator = "Vivek"
      ManagedBy = "TF"
      Environ = "${local.workspace["environ"]}"
   }
}

locals {
  meta = {
      name_prefix = "hpy-${local.workspace["environ"]}-${local.workspace["project_name"]}"
      account_id = "${local.workspace["account_id"]}"
      region_name = "${local.workspace["region_name"]}"
   }
}

/* CUSTOM VARIABLES - ENVIRONMENT SPECIFIC */

################  DEFAULT LOCALS - DEFINE ENV VARIABLES FOR APP  #################
locals {
  env = {
    default = {
      project_name = "${var.project}"
      region_name = "${var.region}"
      environ = "dev"
      account_id = "356******001"
    }
    default_list = {
    }

################  DEV LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    dev = {
      environ = "dev"
    }
    dev_list = {
    }

################  UAT LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    uat = {
      environ = "uat"
    }
    uat_list = {
    }

################  PREP LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    prep = {
      environ = "prep"
    }
    prep_list = {
    }

################  PRD LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    prod = {
      environ = "prod"
      account_id = "3621****8334"
    }
    prod_list = {
    }

  }

################  EXPORTING ENV/WORKSPACE VARIABLES FOR APP  #################

  workspace = "${merge(local.env["default"], local.env[terraform.workspace])}"
  workspace_lists= "${merge(local.env["default_list"], local.env[format("%v_list",terraform.workspace)])}"
}
现在,您可以在主定义中调用上述变量-

main.tf-

module "s3" {
  source = "s3"
  tags = "${local.tags}"
  meta = "${local.meta}"
  workspace = "${local.workspace}"
  workspace_list = "${local.workspace_list}"
}
现在,您可以调用模块内定义的变量,如下所示-

"${var.workspace["environ"]}"
PS-这是一个解决方法,但现在效果非常好。Terraform应该提供一些现成的东西来管理它

/* DEFAULT VARIABLES */

locals {
  tags = {
      Project = "${var.project}"
      Contact = "vivek@vivekyadav.me"
      Requester = "Vivek"
      Creator = "Vivek"
      ManagedBy = "TF"
      Environ = "${local.workspace["environ"]}"
   }
}

locals {
  meta = {
      name_prefix = "hpy-${local.workspace["environ"]}-${local.workspace["project_name"]}"
      account_id = "${local.workspace["account_id"]}"
      region_name = "${local.workspace["region_name"]}"
   }
}

/* CUSTOM VARIABLES - ENVIRONMENT SPECIFIC */

################  DEFAULT LOCALS - DEFINE ENV VARIABLES FOR APP  #################
locals {
  env = {
    default = {
      project_name = "${var.project}"
      region_name = "${var.region}"
      environ = "dev"
      account_id = "356******001"
    }
    default_list = {
    }

################  DEV LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    dev = {
      environ = "dev"
    }
    dev_list = {
    }

################  UAT LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    uat = {
      environ = "uat"
    }
    uat_list = {
    }

################  PREP LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    prep = {
      environ = "prep"
    }
    prep_list = {
    }

################  PRD LOCALS - DEFINE ENV VARIABLES FOR APP  #################

    prod = {
      environ = "prod"
      account_id = "3621****8334"
    }
    prod_list = {
    }

  }

################  EXPORTING ENV/WORKSPACE VARIABLES FOR APP  #################

  workspace = "${merge(local.env["default"], local.env[terraform.workspace])}"
  workspace_lists= "${merge(local.env["default_list"], local.env[format("%v_list",terraform.workspace)])}"
}
module "s3" {
  source = "s3"
  tags = "${local.tags}"
  meta = "${local.meta}"
  workspace = "${local.workspace}"
  workspace_list = "${local.workspace_list}"
}
"${var.workspace["environ"]}"