使用Terraformer工具来整合多个Datadog组织

总结

我有多个Datadog环境(Organization)用于监视和监控。
我希望能将它们合并到一个Organization中,以便更容易管理。

但是…全部手工操作太麻烦又耗时!所以我想用 Terraform 一口气搞定,真希望成功试试。

前提 – require, condition, prerequisite, premise

该组织有两个,只拥有以下仪表板资源。为简化文章,决定不拥有除仪表板之外的其他资源。

此外,假设各个组织都能够获取到共同的指标。
针对现有的Datadog资源进行terraform化,可以考虑以下方法。

    1. 使用手动方式将所有内容写下来。

 

    1. 使用 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。

datadogapi.png

确认应用密钥

如果从相同的页面中选择”Application Keys have moved to the Teams page”,您将被转到App Key创建和确认页面。
即使您已经创建了密钥,似乎您只能在创建时确认一次密钥。
此外,在创建密钥时,它只具有您个人用户的权限,因此如果您在公司而不是个人使用,应该确认并得到高层人员的同意。

按下”新键”按钮,即可创建并复制Key到剪贴板上。请将其保存备用。

datadogapp.png

准备完毕!现在可以从该组织中通过 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

为了使用生成的文件,不能直接使用它。需要进行两项文件的追加修正。

    1. 进行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 = .*$进行搜索时…
找到了!!!!如果这个存在,就无法应用。
由于全部都不需要,所以让我们用替换将其删除。如果你有点神经质的话,请在删除之前确认一下。
作为一个不够好的工程师,作者认为如果出了问题就可以撤销,所以一切照旧进行替换。

new_vscode.png

直到错误不再出现为止,我们会对其进行详细检查和修正。

$ 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)中查看结果

datadog_apply.png

我在使用Twitter!请关注我的工程师账号和音乐账号。

汪汪和喵喵都很可爱,但如果要选一个的话…??我更喜欢汪汪?????????✨✨✨✨????????

在使用filter时,需要使用Datadog单独分配的ID,而不是资源的名称。例如,从浏览器打开相应的仪表板,会在URL中显示ID,您可以使用该ID。
广告
将在 10 秒后关闭
bannerAds