使用基于 Pull Request 的方式使 Terraform 可以与 Atlantis 集成的建议以及执行 terraform apply 的流程摘要

首先

我一边阅读文件,一边尝试创建一个以Atlantis为基础的Terraform协同工作环境样例。

亚特兰提斯是什么?

Terraform拉取请求自动化工具的功能已经在说明书中写得很清楚了。
实际上,它可以帮助我们构建使用Terraform进行环境部署的流程,并将其集中在GitHub的拉取请求环节。您可以将它理解为一个能够自动化管理Terraform环境构建的工具。请参考下面的图示详细了解。

你能在亚特兰蒂斯做些什么?

可以做这种感觉的事情。

    • あるリポジトリをTerraformを操作するファイル群として構成しておく(つまりtfファイルとか)

 

    • そのリポジトリに対してPull Requestが来た場合に、AtlantisがそれをWeb hook経由で検知して、terraform planを投げる

 

    • その結果はPull Requstのコメントとして表示される

 

    • 結果が問題なければ、自分なりレビュワーが、 terraform apply 決行のためのコメントをPull Requetに付与する

 

    AtlantisがTerraform Applyをして、更に結果をPull Requstにコメントする

下面是将形象描绘成图像的结果。

スクリーンショット 2019-06-19 13.17.49.png

所有内容可以通过Pull Request的方式进行可视化!这似乎是它的优点。
…就在这里写着。

如果由Terraform控制的东西,无论是Enterprise Cloud还是其他都可以在相同的流程中控制。

假设

我实际上已经尝试了创建上述环境的步骤,将其作为记录保留下来。同时,我将在此处提前记录相关前提内容。

    • GCPのインスタンス上にAtlantis環境を作る

このインスタンス上にはTerraform自体も必要なので tfenv を使って構築した(解説の対象外)

Atlantisドキュメント内のGit Hostとしては、 GitHub を利用
Terraform自体の制御をする .tf 群等は、 github.com/keiichi-hikita/terraform_work リポジトリに格納(Private Repository)
このリポジトリへのPull Requestは自身の端末から実施

以下是创建Atlantis环境的步骤流程。
我们将按照这里的安装指南进行操作。
阅读所写内容时,记录自己检查过的事项、实际行动和命令示例等。
本文的后续标题分别对应上述页面左侧的菜单。

要求

    • Git Host的にはGitHub使うから問題なし

 

    • local state以外は全部サポートしているということなので何かしらのremote stateにする

今回はTerraform Cloudなので問題なし

リポジトリの構成については特にどんな形でも問題はないらしいのでOK
workspaceもサポートしている。その場合 atlantis.yaml に書く(のだがTerraform Cloudがworkspace固定になっちゃうので事実上あまり関係がない)

.tfvarsファイルは自動検出すると書いてあるが、 -var-ile引数経由もしくはatlantis.yaml 経由で明示できるように見える
Terraformのバージョンはすべてサポート(0.12含む)

据说没有特别引起问题的地方。

Git主机访问凭证

    • Create an Atlantis user(optional)・・・は無視

 

    • Access Tokenを作る

ここ にやり方が書いてあるが、

Settings / Developer Settings / Personal access tokenns からtokenを作る
Noteに atlantis token とでも入れておき、 repo に対するフルアクセスを与えて Generate token をクリック
生成後にtoken文字列をコピーしておく。じゃないと二度と表示されない

Webhook 密钥

    • Atlantisからの接続を明確に判断するための識別子を自分で生成しておく

こんなやり方でできるよ という例があるのでそれに従って作る
自分は www.nrandom.org 使って作成

部署

建筑概述

有一篇关于建筑的文章

    • Runtime

(自分の場合は)GitHubからのWebhookを受け取ってTerraformコマンドをローカルにて実行する役割
OfficialなDockerイメージもある

Routing

AtlantisとGitHubの間で相互に通信が必要になる
GitHub的ないわゆるパブリックサイトを使っている場合はAtlantis自体を外にさらさないとだめだと書いてある

Data

Atlantis自体は外部Database(おそらく外部データソース的な意味合いで書いてある)を持たない
Atlantisは Terraform plan files をローカルに持つので、基本永続的なディスクを使えるようにしておくこと

部署 (bù shǔ)

    • Atlantis自体をどうやって自身の環境にデプロイするかという話

 

    • この場所が外にさらされていないといけないことになる(GitHubからリーチ可能な場所)

 

    • 自分はGCPの永久無料インスタンス内に、 tfenv を入れた上で、atlantis自体も普通に ここ からバイナリ(v0.8.2)を落としてパスの通るところにおいた

 

    最終的に、GitHub相手の場合はAtlantisを以下のようにして立ち上げる
URL=http://[your host name or ip]:4141
USERNAME=keiichi-hikita
TOKEN=[取得したGitHub token]
SECRET=[作成したWebhook Secret]
REPO_WHITELIST="github.com/keiichi-hikita/terraform_work" # <-- tfとか入っているリポジトリ

atlantis server \
--atlantis-url="$URL" \
--gh-user="$USERNAME" \
--gh-token="$TOKEN" \
--gh-webhook-secret="$SECRET" \
--repo-whitelist="$REPO_WHITELIST"

顺便说一下,由于要使用Terraform Cloud,所以Atlantis运行服务器的~/.terraformrc文件中必须包含以下内容。

credentials "app.terraform.io" {
  token = "your token"
}

配置网络钩子

    • webhookをorganizationもしくはリポジトリ単位でインストールできるということだが、自分のアカウントのみで完結させるのでリポジトリ単位になる

つまり If installing on a single repository, navigate to the repository home page and click Settings. 相当
リポジトリの Settins に行く
左メニューの Webhooks を選択し、 Add webhook をクリック

Payload URL に先程指定した $URL + /events を入力

Content type を application/json に変更

Secret にWebhook用に作ったSecretをペースト

Which events would you like to trigger this webhook? の問いに対して Let me select individual events. を選択
下図のように、4つを選択

Pull request reviews
Pushes
Issue comments
Pull requests

Active チェックボックスのONはそのままにしておく

Add webhook ボタンをクリック

スクリーンショット 2019-06-19 10.49.56.png

一旦完成之后,Atlantis将会收到请求。如果出现以下类似的日志,就表示正常。

$ atlantis server \
> --atlantis-url="$URL" \
> --gh-user="$USERNAME" \
> --gh-token="$TOKEN" \
> --gh-webhook-secret="$SECRET" \
> --repo-whitelist="$REPO_WHITELIST"

2019/06/19 10:41:07+0900 [INFO] server: Atlantis started - listening on port 4141
2019/06/19 10:41:16+0900 [INFO] server: GET / – from 115.69.226.68:23101
2019/06/19 10:41:16+0900 [INFO] server: GET / – respond HTTP 200
2019/06/19 10:51:46+0900 [INFO] server: POST /events – from 140.82.115.69:28540
2019/06/19 10:51:46+0900 [INFO] server: POST /events – respond HTTP 200

提供者证书

    • Atlantisはシンプルにサーバー上で terraform plan , terraform apply を実行数r

 

    • そのためにはprovider用のクレデンシャルが必要になる

 

    色々なやり方があるよと書かれているが、自分の場合は普通にAtlantisホスト上に定義しておいた

那么尝试提交一份Pull Request。

既经完成了环境设置,现在只需要按照前提,尝试向github.com/keiichi-hikita/terraform_work提交PR。

存储库的结构如下(超级简单)。

.
├── main.tf # <-- 現状空っぽ
├── provider.tf # <-- 認証情報
└── terraform.tf # <-- Remoteステートの設定 for Terraform Cloud

那么,在 main.tf 文件中加入密钥对试试看。

resource "ecl_compute_keypair_v2" "keypair_1" {
  name = "keypair_1"
}

由于从空状态转移到上述状态,我们可以简单地提交一个将一个资源添加到其中的 PR。
分支名称可以命名为 `add_keypair`。

所以,我们打开 Pull Request。
这是正常的流程。

当Pull Request被创建时,Atlantis会自动执行terraform plan,并将结果反映在评论中。
但这次出现了错误。

スクリーンショット 2019-06-19 11.27.38.png

我忘记放置企业云服务提供商的二进制文件了。
也许应该将这些内容,包括这个,转化为Docker镜像就好了吧。

现在,将二进制文件放置在~/.terraform.d/plugins/linux_amd64/目录下,重新集中注意力,再次尝试。

スクリーンショット 2019-06-19 11.41.35.png

这次成功了。
所以,如果想要应用这个计划的结果,请在注释中写上 “atlantis apply -d .” 并提交。

スクリーンショット 2019-06-19 13.24.48.png

哇,申请已经成功了。
我也会确认实际是否有资源可供使用。

% ecl --os-cloud=jp4 compute keypair list
+-----------+-------------------------------------------------+
| Name      | Fingerprint                                     |
+-----------+-------------------------------------------------+
| keypair_1 | ab:ba:7f:a7:32:bf:8a:dc:53:e3:8f:02:45:a1:34:de |
+-----------+-------------------------------------------------+

没问题!

最近在查看Atlantis的日志时,发现有各种各样的流程记录。
看起来好像是在获取Pull Request的内容时,会把仓库克隆到类似”$HOME/.atlantis/repos/keiichi-hikita/terraform_work/2/default”这样的路径下。

可以很清楚地一起管理Pull Request以及Terraform在此情况下的行为。由于可以看到Plan的结果,所以进行审查也更加容易。

将state配置为remote管理,并将tf文件集合管理于git上,以便全员共享最新版本。但是,如果每个人都分别应用,就会变得难以理解(虽然我觉得不会有人这样做),另外,如果通过CI来执行,那么信息会集中在那里。

广告
将在 10 秒后关闭
bannerAds