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, 工作流自动化, 日志审计, 源代码管理, 状态监控, 自动化运维, 自动笔记, 配置漂移