cresta/atlantis-drift-detection
GitHub: cresta/atlantis-drift-detection
针对Atlantis用户的Terraform配置漂移检测工具,可自动发现IaC与实际基础设施差异并触发修复流程。
Stars: 114 | Forks: 17
# atlantis-drift-detection
检测 atlantis 中的 terraform drift
# 功能介绍
此仓库的通用工作流程如下:
1. 检出一个 terraform 代码的 mono repo
2. 在仓库中查找 atlantis.yaml 文件
3. 使用 atlantis 对 atlantis.yaml 文件中的每个项目运行 /plan
4. 对于每个存在 drift 的项目
1. 触发一个可以解决该 drift 的 GitHub workflow
2. 在 slack 中评论说明存在 drift
5. 对于 atlantis.yaml 中的每个项目目录
1. 运行 workspace list
2. 如果有任何 workspace 未被 atlantis 跟踪,通知 slack
有一个可选的标志用于在 DynamoDB 中缓存 drift 结果,这样我们就不会在短时间内重复检查同一个目录。
# “触发一个可以解决 drift 的 github workflow”的示例
这是我们用来解决 drift 的示例。此 workflow 会触碰一个 "trigger.txt" 文件,我们配置所有项目监听该文件。
```
name: Force a terraform PR
on:
workflow_dispatch:
inputs:
directory:
description: >-
Which directory to force a terraform workflow upon
required: true
type: string
jobs:
plantrigger:
runs-on: [self-hosted]
name: Force terraform plan PR
steps:
# We use an application to make PRs, rather than hard code a user token
- name: Generate token
id: generate_token
uses: peter-murray/workflow-application-token-action@v1
with:
application_id: $ {{ secrets.OUR_APP_ID_FOR_CREATING_PRS }}
application_private_key: ${{ secrets.OUR_PEM_ID_FOR_CREATING_PRS }}
- name: Checkout
uses: actions/checkout@v2
- run: ./scripts/update_trigger.sh ${DIR}
env:
DIR: ${{ github.event.inputs.directory }}
- name: Create PR to terraform repo
uses: peter-evans/create-pull-request@v3
id: make-pr
with:
token: ${{ steps.generate_token.outputs.token }}
branch: replan-${{ github.event.inputs.directory }}
delete-branch: true
title: "Force replan of directory ${{ github.event.inputs.directory }}"
labels: forced-workflow
committer: Forced Replan
body: "A forced replan of this directory was triggered via github actions"
commit-message: "Regenerated plan for ${{ github.event.inputs.directory }}"
```
我们的脚本 update_trigger.sh
```
#!/bin/bash
set -exou pipefail
# 修改预期触发 atlantis workflow 的目录中的 trigger.txt 文件
if [ ! -d "$1" ]; then
echo "Unable to find directory $1"
exit 1
fi
date > "$1/trigger.txt"
```
# 作为 github action 使用
```
name: Drift detection
on:
workflow_dispatch:
jobs:
drift:
name: detects drift
runs-on: [self-hosted]
steps:
- name: detect drift
uses: cresta/atlantis-drift-detection@v0.0.7
env:
ATLANTIS_HOST: atlantis.atlantis.svc.cluster.local
ATLANTIS_TOKEN: ${{ secrets.ATLANTIS_TOKEN }}
REPO: cresta/terraform-monorepo
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
DYNAMODB_TABLE: atlantis-drift-detection
WORKFLOW_OWNER: cresta
WORKFLOW_REPO: terraform-monorepo
WORKFLOW_ID: force_terraform_workflow.yaml
WORKFLOW_REF: master
GITHUB_APP_ID: 123456
GITHUB_INSTALLATION_ID: 123456
GITHUB_PEM_KEY: ${{ secrets.PR_CREATOR_PEM }}
CACHE_VALID_DURATION: 168h
```
# 配置
| 环境变量 | 描述 | 必填 | 默认值 | 示例 |
|--------------------------|----------------------------------------------------------------------------------|----------|----------------------------|---------------------------------------------------------------------|
| `REPO` | 要检查的 github repo | 是 | | `cresta/terraform-monorepo` |
| `ATLANTIS_HOST` | Atlantis 服务器的主机名 | 是 | | `atlantis.example.com` |
| `ATLANTIS_TOKEN` | Atlantis API token | 是 | | `1234567890` |
| `WORKFLOW_OWNER` | drift 时触发的 workflow 的 github owner | 否 | | `cresta` |
| `WORKFLOW_REPO` | drift 时触发的 workflow 的 github repo | 否 | | `atlantis-drift-detection` |
| `WORKFLOW_ID` | drift 时触发的 workflow 的 ID | 否 | | `drift.yaml` |
| `WORKFLOW_REF` | 触发 workflow 的 git ref | 否 | | `master` |
| `DIRECTORY_WHITELIST` | 以逗号分隔的要检查的目录列表 | 否 | | `terraform,modules` |
| `SLACK_WEBHOOK_URL` | 用于发布更新的 Slack webhook URL | 否 | | `https://hooks.slack.com/services/1234567890/1234567890/1234567890` |
| `SKIP_WORKSPACE_CHECK` | 跳过检查 workspace 是否已 drift | 否 | `false` | `true` |
| `PARALLEL_RUNS` | 使用的并行运行数量 | 否 | `1` | `10` |
| `DYNAMODB_TABLE` | 用于缓存结果的 DynamoDB 表名称 | 否 | `atlantis-drift-detection` | `atlantis-drift-detection` |
| `CACHE_VALID_DURATION` | 先前结果仍然有效的持续时间 | 否 | `24h` | `180h` |
| `GITHUB_APP_ID` | 用于 github API 调用的 application ID | 否 | | `123123` |
| `GITHUB_INSTALLATION_ID` | 用于 github API 调用的 application install ID | 否 | | `123123` |
| `GITHUB_PEM_KEY` | 应用程序的 GitHub PEM key,用于对 app 进行 API 调用的身份验证 | 否 | | `1231DEADBEAF....` |
# 本地开发
在根目录下创建一个名为 `.env` 的文件,并填入正确的变量。
查看 [示例文件](example.env) 或 [配置](#configuration) 了解详情。
此文件不会被提交,因为它在 [.gitignore](.gitignore) 中。
标签:Atlantis, DynamoDB, EC2, ECS, EVTX分析, GitHub Actions, GitOps, IaC, Pull Request, Slack 通知, Terraform, Terraform Plan, 工作流自动化, 日志审计, 源代码管理, 状态监控, 自动化运维, 自动笔记, 配置漂移