Terraformer
一个基于现有基础设施生成 tf
/json
和 tfstate
文件的命令行工具(反向 Terraform)。
- 免责声明:这不是 Google 的官方产品
- 由 Waze SRE 创建
目录
GCP 演示
功能
- 为所有支持的资源对象生成
tf
/json
+tfstate
文件,从现有基础设施。 - 远程状态可以上传到 GCS 存储桶。
- 使用
terraform_remote_state
连接资源(本地和存储桶)。 - 使用自定义文件夹树模式保存
tf
/json
文件。 - 按资源名称和类型导入。
- 支持 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
注意 sg
的 Name
与 vpc
的不同。
迁移状态版本
对于 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
,对于每个提供商可能会有所不同。
可以通过以下方式调整生成的结构:
- 使用
--compact
参数将单个服务内的资源文件分组到一个resources.tf
文件中 - 调整
--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
设置为 google
、aws
或 kubernetes
之一。
- 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
- 安装 Terraform - https://www.terraform.io/downloads
- 从这里下载所需提供商的 exe 文件 - https://github.com/GoogleCloudPlatform/terraformer/releases
- 将 exe 文件路径添加到路径变量
从源代码安装
- 运行
git clone <terraformer repo> && cd terraformer/
- 运行
go mod download
- 运行
go build -v
用于所有提供商,或者使用一个提供商构建go run build/main.go {google,aws,azure,kubernetes,etc}
下载Terraform提供程序插件的链接:
- 主要云服务
- 云服务
- 基础设施软件
- 网络
- 版本控制系统
- GitHub 提供程序 >=2.2.1 - 点击这里
- 监控与系统管理
- 社区
提供程序插件的信息: 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
文件的过程:
- 调用GCP/AWS/其他API并获取资源列表。
- 遍历资源并仅获取ID(我们不需要映射字段!)。
- 调用提供程序获取只读字段。
- 调用基础设施并获取tf + tfstate。
基础设施
- 使用刷新方法调用提供程序并获取所有数据。
- 将刷新数据转换为go结构。
- 生成HCL文件 -
tf
/json
文件。 - 生成
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选项不受支持:
- terraforming - https://github.com/dtan4/terraforming/blob/master/lib/terraforming/template/tf/s3.erb
- 官方S3支持 - https://www.terraform.io/docs/providers/aws/r/s3_bucket