Project Icon

terraformer

从现有基础设施逆向生成Terraform配置的开源工具

Terraformer是一个开源CLI工具,能够从现有基础设施逆向生成Terraform配置文件和状态文件。该工具支持Google Cloud、AWS、Azure等多个主流云平台,可以导入特定资源、过滤结果并自定义导入过程。Terraformer基于Terraform提供程序开发,易于扩展支持新资源。对于将已有基础设施迁移到Terraform管理,或者快速创建基础设施即代码配置,Terraformer都是一个实用的辅助工具。

Terraformer

测试 代码检查 Go 报告卡 AUR 包 Homebrew

一个基于现有基础设施生成 tf/jsontfstate 文件的命令行工具(反向 Terraform)。

  • 免责声明:这不是 Google 的官方产品
  • 由 Waze SRE 创建

Waze SRE 标志

目录

GCP 演示

asciicast

功能

  1. 为所有支持的资源对象生成 tf/json + tfstate 文件,从现有基础设施。
  2. 远程状态可以上传到 GCS 存储桶。
  3. 使用 terraform_remote_state 连接资源(本地和存储桶)。
  4. 使用自定义文件夹树模式保存 tf/json 文件。
  5. 按资源名称和类型导入。
  6. 支持 terraform 0.13(对于 terraform 0.11 使用 v0.7.9)。

Terraformer 使用 Terraform 提供商,设计为易于支持新添加的资源。 要升级具有新字段的资源,您只需要升级相关的 Terraform 提供商。

从提供商导入当前状态到 Terraform 配置

用法:
   import [provider] [flags]
   import [provider] [command]

可用命令:
  list        列出提供商支持的资源

标志:
  -b, --bucket string         gs://terraform-state
  -c, --connect                (默认为 true)
  -С, --compact                (默认为 false)
  -x, --excludes strings      firewalls,networks
  -f, --filter strings        compute_firewall=id1:id2:id4
  -h, --help                  google 的帮助
  -O, --output string         输出格式 hcl 或 json(默认为 "hcl")
  -o, --path-output string     (默认为 "generated")
  -p, --path-pattern string   {output}/{provider}/ (默认为 "{output}/{provider}/{service}/")
      --projects strings
  -z, --regions strings       europe-west1,(默认为 [global])
  -r, --resources strings     firewall,networks 或 * 表示所有服务
  -s, --state string          local 或 bucket(默认为 "local")
  -v, --verbose               详细模式
  -n, --retry-number          刷新失败时执行的重试次数
  -m, --retry-sleep-ms        重试之间的睡眠时间(毫秒)

使用 "import [provider] [command] --help" 获取有关命令的更多信息。

权限

该工具需要只读权限来列出服务资源。

资源

您可以使用 --resources 参数来指定要从哪些服务导入资源。

要从所有服务导入资源,请使用 --resources="*"。如果您想排除某些服务,可以将该参数与 --excludes 结合使用,以排除您不想导入的服务资源,例如 --resources="*" --excludes="iam"

过滤

过滤器是选择 terraformer 导入哪些资源的方法。可以根据资源的标识符或属性进行过滤。多个过滤值用 : 分隔。如果标识符包含此符号,值应该用 ' 包裹,例如 --filter=resource=id1:'project:dataset_id'。基于标识符的过滤器将在 Terraformer 尝试刷新远程状态之前执行。

当您需要只过滤几种资源类型中的一种时,使用 Type。在导入不同资源类型时可以组合多个过滤器。一个例子是从特定 AWS VPC 导入所有 AWS 安全组:

terraformer import aws -r sg,vpc --filter Type=sg;Name=vpc_id;Value=VPC_ID --filter Type=vpc;Name=id;Value=VPC_ID

注意 sgNamevpc 的不同。

迁移状态版本

对于 terraform >= 0.13,您可以使用 replace-provider 从先前版本迁移状态。

使用示例:

terraform state replace-provider -auto-approve "registry.terraform.io/-/aws" "hashicorp/aws"
资源 ID

过滤基于 Terraform 资源 ID 模式。要找到资源的有效 ID 模式,请查看 Terraform 文档 的导入部分。

使用示例:

terraformer import aws --resources=vpc,subnet --filter=vpc=myvpcid --regions=eu-west-1

将只导入 id 为 myvpcid 的 vpc。这种形式的过滤器可以在需要通过标识符选择资源时提供帮助。

仅字段名

可以只按特定字段名进行过滤。例如,当您只想检索具有特定标签键的资源时,可以使用此方法。

使用示例:

terraformer import aws --resources=s3 --filter="Name=tags.Abc" --regions=eu-west-1

将只导入具有标签 Abc 的 s3 资源。当字段值从过滤角度来看不重要时,这种形式的过滤器可以提供帮助。

包含点的字段

可以按包含点的字段进行过滤。

使用示例:

terraformer import aws --resources=s3 --filter="Name=tags.Abc.def" --regions=eu-west-1

将只导入具有标签 Abc.def 的 s3 资源。

规划

plan 命令生成一个包含所有设置为导入的资源的计划文件。通过在运行 import 命令之前修改计划文件,您可以重命名或过滤要导入的资源。

其余的子命令和参数与 import 命令相同。

$ terraformer plan google --resources=networks,firewall --projects=my-project --regions=europe-west1-d
(省略)

将计划文件保存到 generated/google/my-project/terraformer/plan.json

在查看/自定义计划文件后,通过运行 import plan 开始导入。

$ terraformer import plan generated/google/my-project/terraformer/plan.json

资源结构

Terraformer 默认将每个资源分成一个文件,放入给定的服务目录中。

资源文件的默认路径是 {output}/{provider}/{service}/{resource}.tf,对于每个提供商可能会有所不同。

可以通过以下方式调整生成的结构:

  1. 使用 --compact 参数将单个服务内的资源文件分组到一个 resources.tf 文件中
  2. 调整 --path-pattern 参数并传递例如 --path-pattern {output}/{provider}/ 以在一个目录中生成所有服务的资源

可以组合使用 --compact--path-pattern 参数。

安装

需要安装 Terraformer 和 Terraform 提供商插件。

Terraformer

从包管理器安装

  • Homebrew 用户可以使用 brew install terraformer
  • MacPorts 用户可以使用 sudo port install terraformer
  • Chocolatey 用户可以使用 choco install terraformer

从发布版安装 这会安装所有提供商,如果您只需要其中一个,将 PROVIDER 设置为 googleawskubernetes 之一。

  • Linux
export PROVIDER=all
curl -LO "https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64"
chmod +x terraformer-${PROVIDER}-linux-amd64
sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
  • MacOS
export PROVIDER=all
curl -LO "https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-darwin-amd64"
chmod +x terraformer-${PROVIDER}-darwin-amd64
sudo mv terraformer-${PROVIDER}-darwin-amd64 /usr/local/bin/terraformer
  • Windows
  1. 安装 Terraform - https://www.terraform.io/downloads
  2. 从这里下载所需提供商的 exe 文件 - https://github.com/GoogleCloudPlatform/terraformer/releases
  3. 将 exe 文件路径添加到路径变量

从源代码安装

  1. 运行 git clone <terraformer repo> && cd terraformer/
  2. 运行 go mod download
  3. 运行 go build -v 用于所有提供商,或者使用一个提供商构建 go run build/main.go {google,aws,azure,kubernetes,etc} 下载Terraform提供程序插件的链接:

提供程序插件的信息: https://www.terraform.io/docs/configuration/providers.html

添加新提供程序的高级步骤

  • 在cmd/root.go中初始化提供程序详情,并在terraformer/cmd文件夹中创建提供程序初始化文件
  • 在terraformer/providers/下为你的提供程序创建一个文件夹
  • 在此文件夹下创建两个文件
    • <provide_name>_provider.go
    • <provide_name>_service.go
  • 在<provide_name>_provider.go文件中初始化所有提供程序支持的服务
  • 在同一文件夹中为每个支持的服务创建脚本

贡献

如果您有改进或修复,我们非常欢迎您的贡献。 请阅读CONTRIBUTING.md以了解更多关于我们希望贡献者遵循的流程。

开发

Terraformer的设计使您可以轻松添加各种新的提供程序。

生成tf/json + tfstate文件的过程:

  1. 调用GCP/AWS/其他API并获取资源列表。
  2. 遍历资源并仅获取ID(我们不需要映射字段!)。
  3. 调用提供程序获取只读字段。
  4. 调用基础设施并获取tf + tfstate。

基础设施

  1. 使用刷新方法调用提供程序并获取所有数据。
  2. 将刷新数据转换为go结构。
  3. 生成HCL文件 - tf/json文件。
  4. 生成tfstate文件。

所有资源映射均由提供程序和Terraform完成。升级仅需要针对提供程序进行。

GCP计算资源

对于GCP计算资源,请使用providers/gcp/gcp_compute_code_generator中生成的代码。

要重新生成代码:

go run providers/gcp/gcp_compute_code_generator/*.go

类似项目

terraforming

Terraformer的优势
  • 添加新提供程序和资源更简单 - 已支持AWS、GCP、GitHub、Kubernetes和Openstack。Terraforming仅支持AWS。
  • 对HCL + tfstate的更好支持,包括Terraform 0.12的更新。
  • 如果提供程序向资源添加新属性,无需更改Terraformer代码 - 只需在您的笔记本电脑上更新Terraform提供程序。
  • 自动支持HCL文件中资源之间的连接。
比较

Terraforming从云API获取所有属性,并通过模板创建HCL和tfstate文件。API中的每个属性都需要映射到Terraform中的属性。从模板生成的文件可能会因非法语法而出错。当提供程序添加新属性时,需要更新terraforming代码。

Terraformer则使用Terraform提供程序文件进行属性映射,使用Hashicorp的HCL库,以及Terraform代码。

看看terraforming中的S3支持和官方S3支持 Terraforming对资源的覆盖不全面 - 例如,您可以看到70%的S3选项不受支持:

随时间变化的Star数

随时间变化的Star数

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号