【问题标题】:terrraform code organization to distribute content用于分发内容的 terraform 代码组织
【发布时间】:2019-11-13 08:51:52
【问题描述】:

我正在学习 terraform。 我的 terraform 代码目前组织为 -

  main.tf
   ->modules
    ->route53
    ->network
    ->ec2

这适用于大多数情况,但我现在想分发启动服务器(ec2 和我配置运行的一些程序)的整个配方,包括作为变量的 route53 域名和作为资源的子网/安全组我的网络。 我在 route53/network/ec2 等模块中有很多资源。
是否有好的做法或模式或一键式命令(例如,如果我只想运行模块网络中的所有资源,我可以这样做)

target apply -f network

所以我可以做类似的事情

terraform apply -target module.network.(resource) -target module.ec2.(resource) -target module.route53 

等等等等

【问题讨论】:

  • 您将只在根模块配置中声明 network 模块。
  • 谢谢,但我为什么要这样做?

标签: amazon-web-services terraform


【解决方案1】:

构建 Terraform 代码的最佳实践是

...在大多数情况下,我们强烈建议保持模块树平坦,只有一层子模块,并使用与上述类似的技术,使用表达式来描述模块之间的关系

发件人:TF Module Composition guide

基本上这意味着:

  1. 将模块保存在其他 git 或与非模块 tf 文件 (provisioners) 相同的文件夹中,使模块变小并遵守 SRP(单一责任)。
  2. 通过模块组合来组合复杂的流程,记住 DIP - Dependency Inversion
  3. 模块是单一职责的抽象,而provisioners 是构成模块调用的实际设置 - 在平面级别,而后面的模块调用可能会使用流中它们之前的模块调用的输出

这意味着:

- /modules
   - /vpc
     - vpc.tf
   - /subnets_private
     - subnets.tf
     - routing_tables.tf
   - /ecs_cluster
     - iam_ecs.tf
     - asg_ecs.tf
   - /network
- /provisioners
   - /staging
     - /workload_cluster_core_domain
         - main.tf
     - /control_plane_network
         - main.tf

main.tf 具有扁平结构:

    module1--
             |    
  --module2<-  
  |   
  ->module3  

每个module 可以使用以下输出:

  • 前面(在依赖树中)module 调用
  • data 来电。

当然,您可以在状态级别对流程进行分区,但您需要对其进行维护,或者使用 OOS 框架、la Terragrunt,或者编写自己的包装器(顺便说一句,这是非常常见的方法)——但这显然需要在 bash/go/python/node/etc 中包装 TF cli 用法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多