You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将script.yml命令传入terraform-aws-imagebuilder-component-shell的variables.tf

最优实现方案

推荐你保留独立的script.yml文件,通过Terraform内置函数读取解析后传入模块,不要把大量命令硬编码到variables.tf中,这种方式维护性更强:命令和Terraform配置解耦,script.yml可以单独做版本管理、合规校验,修改命令时不需要调整Terraform核心逻辑。

具体实现步骤

  1. 将script.yml放在你的Terraform代码根目录(或指定的子目录下),不需要修改原有YAML内容
  2. 在调用模块的tf文件中,添加本地值解析YAML文件提取命令列表:
# 读取并解析本地script.yml
locals {
  hardening_script = yamldecode(file("${path.module}/script.yml"))
  # 按名称匹配提取对应阶段和步骤的命令,避免顺序调整后索引失效
  build_phase        = [for phase in local.hardening_script.phases : phase if phase.name == "build"][0]
  hardening_step     = [for step in local.build_phase.steps : step if step.name == "CISBenchmarkHardening"][0]
  hardening_commands = local.hardening_step.inputs.commands
}
  1. 调用模块时直接传入解析得到的命令列表即可:
module "cis_hardening_component" {
  source  = "rhythmictech/imagebuilder-component-shell/aws"
  version = "请填写你使用的模块版本号,建议固定版本避免兼容问题"

  name             = "cis-benchmark-hardening"
  component_version = "1.0.0"
  platform         = "Linux"
  phase            = "build"
  commands         = local.hardening_commands
  # 其他参数按需配置,如tags、kms_key_id、description等
}

更简化的可选方案

如果不想做YAML解析,你可以直接使用模块的data_uri参数:将完整的script.yml上传到有权限访问的S3存储桶,直接传入S3 URI即可,模块会直接使用你提供的完整组件文档,不需要拆分提取命令:

module "cis_hardening_component" {
  source  = "rhythmictech/imagebuilder-component-shell/aws"
  version = "你的模块版本号"

  name             = "cis-benchmark-hardening"
  component_version = "1.0.0"
  platform         = "Linux"
  data_uri         = "s3://你的存储桶路径/script.yml"
}

关键注意事项

  • 如果你的shell命令中包含$符号(比如引用环境变量),需要在$前额外加一个$转义(即写成$$),避免被Terraform识别为插值语法解析报错
  • 每次修改script.yml中的命令后,记得同步更新component_version参数值,否则EC2 Image Builder会认为组件没有变更,不会触发重新构建
  • 不要使用latest版本的模块,固定模块版本可以避免后续模块更新带来的兼容性问题
  • 确保Terraform执行身份对S3存储桶(如果用data_uri方案)有读取权限

内容的提问来源于stack exchange,提问作者Tate_87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:27:00