【问题标题】:is it possible to call multiple terraform modules using terragrunt是否可以使用 terragrunt 调用多个 terraform 模块
【发布时间】:2021-05-27 11:30:14
【问题描述】:

我正在尝试从 terragrunt 调用多个模块。我知道目前 terragrunt 不支持多个源,我们一次只能调用一个模块。所以,我创建了一个 main.tf 文件来前端多个模块。

# main.tf 

module "foo" {
   source = "../modules/vpc"
}


module "bar" {
   source = "../modules/s3"
}

在 terragrunt 内部调用 main.tf 作为源,认为会调用模块 foo 和模块 bar。

# terragrunt.hcl

terraform {
  source = "./main.tf

  }


inputs {
}

这可以使用 terragrunt 吗?我需要一次对多个 terraform 模块进行分组。

【问题讨论】:

    标签: terraform terraform-provider-aws terragrunt


    【解决方案1】:

    简而言之,是的,您发布的两个文件 sn-ps 都可以。

    terragrunt 不支持多个源,我们一次只能调用一个模块。

    更长的答案:将 terraform { ... } 块中的 terragrunt.hcl 视为指向“根 terraform 模块”的指针很有用。此根模块与任何其他 terraform 模块一样,但很特别,因为它位于所有 terraform 配置的根或顶部。

    所以 terragrunt 仅支持一个根模块,但该根模块可以根据需要使用任意数量的附加模块。

    terragrunt 给我们的强大功能是能够重用这些根模块。在 vanilla terraform 中,您不能重复使用此根模块。

    在您的示例中,terragrunt 文件指向同一文件中的根模块 (./main.tf)。这很好用,但是因为我们使用 terragrunt 来保持干燥,我们通常会将这个根模块放在不同的目录中,甚至可能在 git repo 中并在 terragrunt.hcl 文件中适当地引用它

    这是一个简单的图表:

             +-------------------------------+
             |       /my/root-module         |
             |                               |
             |           main.tf             |
             |                               |
             +--------------+----------------+
    +------------------+    |    +----------------+
    |  /my/modules/vpc |    |    | /my/modules/s3 |
    |                  |    |    |                |
    |   module "foo"   <----+---->  module "bar"  |
    |                  |         |                |
    |                  |         |                |
    +------------------+         +----------------+
    

    未显示的是指向/my/root-module 的 terragrunt.hcl 文件,它可以位于磁盘或 git 中的其他位置。

    【讨论】:

    • 我认为我们不能将 /my/root-module 放在任何地方。它需要位于您拥有子模块(/my/modules/vpc、/my/modules/s3)的路径上的某个位置。我试过这个并没有用。当您在 terragrunt.hcl 中将 /my/root-module 引用为源时,它会根据您在路径中使用 (//) 指定的任何根目录下载所有模块配置。在这种情况下,它将是 source = //my/root-modules。所以 terragrunt 将下载 /my 目录级别的所有内容,这将涵盖两个模块。让我知道这是否不正确,是否可以将根模块放在任何地方。它对我不起作用!
    • @Meet101 并非如此。它/可以/去任何地方,但必须更新source = "..." 行以相应地引用。它可以是相对文件路径、绝对文件路径、远程 github 存储库或对 terraform 注册表上托管模块之一的引用。模块的位置是相互独立的,只有当你使用相对路径时才重要。
    【解决方案2】:

    我有以下结构。

    project    
    │
    └───live
    │   │
    │   └───dev
    │       │   terragrunt.hcl
    │       │   
    │       └───aws-ec2
    |       |      terragrunt.hcl   
    |       └───aws-rds
    |              terragrunt.hcl
    │   
    └───modules
        │   
        └───ec2
        │      files.tf
        └───rds
               files.tf
    

    在开发中,我正在运行terragrunt plan-all(已弃用,但如果您不介意由依赖关系引起的错误,则可以使用)。最新的 cli 选项是 terragrunt run-all (command),但我认为除了 terragrunt 文件之外,您还需要一个 terraform 文件。

    更多信息可以在这里找到:

    【讨论】:

    • 这是正确的。就我而言,我有一个复杂的目录结构,并且无法从根目录使用 apply-all/run-all 命令。而不是这个,我将多个模块组合成一个,然后直接调用该根模块。
    猜你喜欢
    • 2019-12-31
    • 2020-05-20
    • 2021-03-25
    • 2020-06-09
    • 2010-10-21
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多