使用Terraformer工具来整合多个Datadog组织
总结
我有多个Datadog环境(Organization)用于监视和监控。
我希望能将它们合并到一个Organization中,以便更容易管理。
但是…全部手工操作太麻烦又耗时!所以我想用 Terraform 一口气搞定,真希望成功试试。
前提 – require, condition, prerequisite, premise
该组织有两个,只拥有以下仪表板资源。为简化文章,决定不拥有除仪表板之外的其他资源。
此外,假设各个组织都能够获取到共同的指标。
针对现有的Datadog资源进行terraform化,可以考虑以下方法。
-
- 使用手动方式将所有内容写下来。
-
- 使用 Terraform import 命令获取资源,并将其记录在 tf 文件中。
- 使用名为 Terraformer 的导入工具进行自动导入。
最终,选择采用了使用3个terraformer的方法。这是因为根据Datadog官方页面的推荐,并且如果资源较多的话,可以一次性导入,这样从结果上来看,工作量最少。
Datadog环境(例如)
-
- Organizetion1: Yojo_Dog
resourse: Dog_moniter_dashboard
Organization2: Yojo_Cat
resourse: Cat_moniter_dashboard
这次我们将使用terraformer将Yojo_Cat环境的Cat_moniter_dashboard输出为tf文件,然后通过terraform在Yojo_Dog环境中进行apply,从而创建两个dashboard的状态!
使用工具
-
- Terraform: コンピュータやネットワークを自動構築するツール。Datadog用のモジュールが用意されているためDatadogの環境をコード化、自動化できる。
-
- terraformer: 構築済みの既存リソース(AWSやDatadogなど)を読み取り、terraformのコードとして出力してくれるインポートツール
- tfenv: 複数のTerraformバージョンを切り替えして使用できる管理ツール
构建操作步骤 zuò bù
工具的安装和设置
本地环境是适用于Mac的。如果你使用Windows系统,请购买Mac电脑。
或许你可以尝试使用WSL的Ubuntu之类的(漫不经心地说)。
安装tfenv
#Terraformがインストールされている場合エラーになるので一旦消す
$ brew uninstall terraform
#tfenvをインストール
$ brew install tfenv
#tfenvの確認
$ tfenv --version
tfenv 2.2.0
可以通过tfenv安装Terraform。
本次我们将使用v0.13.6版本的terraformer。
#tfenvからterraformをインストール
$ tfenv install 0.13.6
Installing Terraform v0.13.6
Downloading release tarball from https://releases.hashicorp.com/terraform/0.13.6/terraform_0.13.6_darwin_amd64.zip
##################################################################################################################### 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.13.6/terraform_0.13.6_SHA256SUMS
No keybase install found, skipping OpenPGP signature verification
Archive: tfenv_download.TOSAgI/terraform_0.13.6_darwin_amd64.zip
inflating: /usr/local/Cellar/tfenv/2.2.0/versions/0.13.6/terraform
Installation of terraform v0.13.6 successful. To make this your default version, run 'tfenv use 0.13.6'
#インストールされたか確認
$ tfenv list
* 0.13.6 (set by /usr/local/Cellar/tfenv/2.2.0/version)
#インストールしたterraformバージョンを使用する
$ tfenv use 0.13.6
#terraformコマンドの確認
$ terraform --version
Terraform v0.13.6
安装terraformer
$ brew install terraformer
$ terraformer version
Terraformer v0.8.10
准备导入Datadog资源。
要使用Terraformer导入Datadog资源,需要API密钥和APP密钥。请按照以下步骤确认。
检查API密钥
登入Datadog控制台,從左側的菜單選擇Integrations → APIs。
接下來將跳轉到以下畫面,展開API Keys並記下Key。
确认应用密钥
如果从相同的页面中选择”Application Keys have moved to the Teams page”,您将被转到App Key创建和确认页面。
即使您已经创建了密钥,似乎您只能在创建时确认一次密钥。
此外,在创建密钥时,它只具有您个人用户的权限,因此如果您在公司而不是个人使用,应该确认并得到高层人员的同意。
按下”新键”按钮,即可创建并复制Key到剪贴板上。请将其保存备用。
准备完毕!现在可以从该组织中通过 terraformer 导入 tf 文件了!太棒了!
请保留一个组织的Key,使用相同的步骤。
执行terraformer
Terraform的初始配置
首先,让我们快速搭建环境,以便能够执行terraform。
#実行ディレクトリの作成(自由に)
terraform
└── datadog
创建 main.tf
我会按照Datadog官方文档的指示进行编写。
将api_key和app_key写入您的Organization中获取到的Datadog资源。
请注意,由于本文将直接包含密钥,请确保不要错误地将其发布到GitHub上。
由於要將Yojo_Cat的資源新增至Yojo_Dog,因此變成如下所示。
terraform {
required_providers {
datadog = {
source = "Datadog/datadog"
}
}
}
provider "datadog" {
api_key = "Yojo_Dog_api_key"
app_key = "Yojo_Dog_app_key"
}
启动
为了安装Datadog的供应商,执行初始化。
$ terraform init
Terraform has been successfully initialized!
将第一个组织的资源导入 terraformer。
本次只涉及到仪表板,如果还有其他资源的话,可以用–resorces=hoge,fuga,piyo并用逗号分隔来指定。
另外,如果只想输出特定的资源,可以使用–filter=dashboard=Dog_moniter_dashboardID这样的方式来指定。
#Yojo_Dog Organizationのリソースを出力
$ terraformer import datadog --resources=dashboard --api-key "Yojo_Dog_api_key" --app-key "Yojo_Dog_app_key"
2021/03/05 02:58:27 datadog importing... dashboard
2021/03/05 02:58:28 Refreshing state... datadog_dashboard.tfer--dashboard_<Dog_moniter_dashboardID>
2021/03/05 02:58:36 datadog Connecting....
2021/03/05 02:58:36 datadog save dashboard
2021/03/05 02:58:37 datadog save tfstate for dashboard
#generateディレクトリとファイルが出力される
./generated
└── datadog
└── dashboard
├── dashboard.tf
├── outputs.tf
├── provider.tf
└── terraform.tfstate
导入第二个Organization的资源到Terraformer。
如果继续执行,将会全部被覆盖……怎么办!
所以,让我们先把它暂时移到另一个目录中。
terraform
└── datadog
├── Yojo_Dog
│ └── generated
│ └── datadog
│ └── dashboard
│ ├── dashboard.tf
│ ├── outputs.tf
│ ├── provider.tf
│ └── terraform.tfstate
└── main.tf
#Yojo_Cat Organizationのリソースを出力
$ terraformer import datadog --resources=dashboard --api-key "Yojo_Cat_api_key" --app-key "Yojo_Cat_app_key"
2021/03/05 03:16:40 datadog importing... dashboard
2021/03/05 03:16:44 Refreshing state... datadog_dashboard.tfer--dashboard_<Cat_moniter_dashboardID>
2021/03/05 03:16:55 datadog save dashboard
2021/03/05 03:16:56 datadog save tfstate for dashboard
#generateディレクトリとファイルが出力される
.
├── Yojo_Dog
│ └── generated
│ └── datadog
│ └── dashboard
│ ├── dashboard.tf
│ ├── outputs.tf
│ ├── provider.tf
│ └── terraform.tfstate
├── generated
│ └── datadog
│ └── dashboard
│ ├── dashboard.tf
│ ├── outputs.tf
│ ├── provider.tf
│ └── terraform.tfstate
└── main.tf
#統一感だしていこ???笑笑笑
.
├── Yojo_Cat
(略)
├── Yojo_Dog
资源文件的修改 de
为了使用生成的文件,不能直接使用它。需要进行两项文件的追加修正。
-
- 进行tf文件的版本升级
- 删除冲突的ID
升级tf文件版本
根据Datadog官方文档的推荐进行操作,我们将调整通过terraformer导入的tf文件的版本为v0.13.x。
#Yojo_Catに実行
$ pwd
/datadog/Yojo_Cat/datadog/dashboard
$ terraform 0.13upgrade .
Would you like to upgrade the module in the current directory?
Only 'yes' will be accepted to confirm.
Enter a value: yes #yesを入力してエンター
-----------------------------------------------------------------------------
Upgrade complete!
#なんか変わってる。まぁ任せた!!
$ git status
Changes not staged for commit:
modified: provider.tf
Untracked files:
(use "git add <file>..." to include in what will be committed)
versions.tf
#initする
$ terraform init
Terraform has been successfully initialized
.
├── dashboard.tf
├── outputs.tf
├── provider.tf
├── terraform.tfstate
└── versions.tf
#忘れずにYojo_Dogにも適用する
$ pwd
/terraform/datadog/Yojo_Dog/generated/datadog/dashboard
$ terraform 0.13upgrade .
$ terraform init
删除竞合的ID。
作为Terraformer的一个弱点之一,它会将资源的固有ID带到tf文件中。
如果尝试应用这个文件,会与现有资源发生冲突并报错。
我们来确认一下情况。
$ terraform plan
Error: "widget.10.id": this field cannot be set
on dashboard.tf line 125, in resource "datadog_dashboard" "tfer--dashboard_<dashboard_ID>":
125: resource "datadog_dashboard" "tfer--dashboard_<dashboard_ID>" {
Error: "widget.10.id": this field cannot be set
.
.
.
.
echo '天才の僕「ぎゃーーー!!!!」'
因为它详细地说明了哪些资源和小部件出现了错误,所以让我们修正tf文件。
以下是这位作者以“极速工作(笑)”为特长的方法。
$ ls
dashboard.tf outputs.tf provider.tf terraform.tfstate versions.tf
#伝説の武器、VSCodeを起動!!俺のターーーン!!!!!(エンターキーをターン!する)
$ code dashboard.tf
在使用ID = .*$进行搜索时…
找到了!!!!如果这个存在,就无法应用。
由于全部都不需要,所以让我们用替换将其删除。如果你有点神经质的话,请在删除之前确认一下。
作为一个不够好的工程师,作者认为如果出了问题就可以撤销,所以一切照旧进行替换。
直到错误不再出现为止,我们会对其进行详细检查和修正。
$ terraform plan
Error: api_key and app_key must be set unless validate = false
这个上述的是没问题的东西。因为在generated文件夹下进行计划,所以没有密钥是正常的。当错误不再出现时,让我们也修改另一个组织。
请将以下内容用中文进行意译,仅需一种选项:
– “Can you recommend any good restaurants in this area?”
– “Are there any popular tourist attractions nearby?”
– “What is your favorite local dish?”
– “How do I get to the nearest subway station?”
– “Is there a supermarket or convenience store within walking distance?”
– “What is the weather like today?”
– “What are some traditional customs in this region?”
– “Are there any local festivals or events happening soon?”
$ terraform plan
Error: "widget": required field is not set
6731: resource "datadog_dashboard" "tfer--dashboard_<dashboard_ID>" {
初めて見る感じだと、这个仪表板好像是一个没有小部件的测试用仪表板。虽然空荡荡的仪表板可以通过图形界面保存,但在代码上似乎是不被允许的。
只是从文件中删除而无法与tfstate保持一致,会变得混乱。
关于这一点,本次不提及。
换言之,我从图形用户界面上将其物理删除,然后重新导入了!(举例来说,面板现在只有一个,但也介绍了这种错误的例外情况。)
整合资源
终于到了最终章。将两个组织的仪表板整合到一起,使Yojo_Dog环境更强大。
文件移动
让我们转到已导入的数据主目录。
dashboard.t,terraform.tfstate和versions.tf是目标。
$ pwd
/datadog/Yojo_Cat/datadog/dashboard
$ cp dashboard.tf terraform.tfstate versions.tf ../../../
.
├── Yojo_Cat
│ └── datadog
│ └── dashboard
│ ├── dashboard.tf
│ ├── outputs.tf
│ ├── provider.tf
│ ├── terraform.tfstate
│ └── versions.tf
├── Yojo_Dog
│ └── generated
│ └── datadog
│ └── dashboard
│ ├── dashboard.tf
│ ├── outputs.tf
│ ├── provider.tf
│ ├── terraform.tfstate
│ └── versions.tf
├── dashboard.tf
├── main.tf
├── terraform.tfstate
└── versions.tf
通过plan来确认内容。
请注意:请仔细审核此日志。如果随意执行可能会成为破坏和创造的系统故障之神。
请认真地审核日志,并为了以防万一写一份辞职信。
#ファイルが増えているので一旦initしておく
$ terraform init
$ terraform plan
#変更のあるリソースを確認
datadog_dashboard.tfer--dashboard_<Cat_moniter_dashboard_ID>: Refreshing state... [id=Cat_moniter_dashboard_ID]
------------------------------------------------------------------------
#Createdのみなはず。deleteがあるなら要確認
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# datadog_dashboard.tfer--dashboard_<Cat_moniter_dashboard_ID> will be created
+ resource "datadog_dashboard" "<Cat_moniter_dashboard_ID>" {
+ dashboard_lists_removed = (known after apply)
+ description = <<~EOT
## Overall
Dashbord for
(略)
# +が追加される部分です。リソース、ウィジットなど変更点を確認しましょう。
#最後に変更点のカウントが出ます。
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
申请
如果一切顺利,只需应用这个,就可以整合资源了。
让Yojo_Dog吃下Yojo_Cat的所有东西吧!!!
$ terraform apply
datadog_dashboard.tfer--dashboard_<Cat_moniter_dashboard_ID>: Refreshing state... [id=<Cat_moniter_dashboard_ID>]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
(略)
#実行するか聞かれるのでyesを入力します。
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 7 added, 0 changed, 0 destroyed.
Outputs:
datadog_dashboard_tfer--dashboard_<Cat_moniter_dashboard_ID>_id = datadog_dashboard.tfer--dashboard_<Cat_moniter_dashboard_ID>.id
申请完成了!如果有显示”Apply complete!”的话,就表示成功了!辛苦了!
从图形用户界面(GUI)中查看结果
我在使用Twitter!请关注我的工程师账号和音乐账号。
汪汪和喵喵都很可爱,但如果要选一个的话…??我更喜欢汪汪?????????✨✨✨✨????????