将Atlantis与OpenTofu集成

文摘   2024-07-19 10:06   中国香港  

本文最初撰写于 2024 年 5 月 27 日
原文链接:https://dev.to/jmateusousa/integrating-atlantis-with-opentofu-lnd

我们的动机是什么?

鉴于 Terraform 许可变更,许多公司正将其 IAC 流程迁移到 OpenTofu。考虑到这一点,并了解到他们中许多人使用 Atlantis 和 Terraform 作为基础设施交付自动化工具,我创建了这份文档,展示如何将 Atlantis 与 OpenTofu 集成。

技术栈:Atlantis、Terragrunt、OpenTofu、Github、ALB、EKS。

我们将通过Helm chart[1]来实施:

  1. 1. 添加 runatlantis 仓库。
helm repo add runatlantis https://runatlantis.github.io/helm-charts
  1. 2. 创建文件 values.yaml 并执行:
helm inspect values runatlantis/atlantis > values.yaml
  1. 3. 编辑 values.yaml 文件,添加将在 Atlantis webhook 配置中使用的凭证访问密钥和密钥:参考创建GitHub App[2]的方法。
githubApp:
  id: "CHANGE ME"
  key: |
    -----BEGIN RSA PRIVATE KEY-----
            "CHANGE ME"
    -----END RSA PRIVATE KEY-----
  slug: atlantis
# secret webhook Atlantis
  secret: "CHANGE ME"
  1. 4. 在 orgAllowlist 中指定 Atlantis 将交互的 GitHub 组织和仓库:
# All repositories the org
orgAllowlist: github.com/MY-ORG/*

or
# Just one repository
orgAllowlist: github.com/MY-ORG/MY-REPO-IAC

or
# All repositories that start with MY-REPO-IAC-
orgAllowlist: github.com/MY-ORG/MY-REPO-IAC-*
  1. 5. 接下来,配置初始化 Atlantis Pod 时将执行的脚本。在此步骤中,我们下载并安装 Terragrunt 和 OpenTofu,并将其二进制文件包含在共享目录/plugins 下。
initConfig:
  enabled: true
  image: alpine:latest
  imagePullPolicy: IfNotPresent
  # sharedDir is set as env var INIT_SHARED_DIR
  sharedDir: /plugins
  workDir: /tmp
  sizeLimit: 250Mi
  # example of how the script can be configured to install tools/providers required by the atlantis pod
  script: |
    #!/bin/sh
    set -eoux pipefail# terragrunt
    TG_VERSION="0.55.10"
    TG_SHA256_SUM="1ad609399352348a41bb5ea96fdff5c7a18ac223742f60603a557a54fc8c6cff"
    TG_FILE="${INIT_SHARED_DIR}/terragrunt"
    wget https://github.com/gruntwork-io/terragrunt/releases/download/v${TG_VERSION}/terragrunt_linux_amd64 -O "${TG_FILE}"
    echo "${TG_SHA256_SUM} ${TG_FILE}" | sha256sum -c
    chmod 755 "${TG_FILE}"
    terragrunt -v

    # OpenTofu
    TF_VERSION="1.6.2"
    TF_FILE="${INIT_SHARED_DIR}/tofu"
    wget https://github.com/opentofu/opentofu/releases/download/v${TF_VERSION}/tofu_${TF_VERSION}_linux_amd64.zip
    unzip tofu_${TF_VERSION}_linux_amd64.zip
    mv tofu ${INIT_SHARED_DIR}
    chmod 755 "${TF_FILE}"
    tofu -v
  1. 6. 在这里配置环境变量,避免下载 Terraform 的其他版本,并指示 Terragrunt 从何处获取 OpenTofu 二进制文件。
# envs
environment:
  ATLANTIS_TF_DOWNLOAD: false
  TERRAGRUNT_TFPATH: /plugins/tofu
  1. 7. 最后,我们在这里指定针对仓库的 Atlantis 侧配置。
# repository config
repoConfig: |
  ---
  repos:
  - id: /.*/
    apply_requirements: [approved, mergeable]
    allow_custom_workflows: true
    allowed_overrides: [workflow, apply_requirements, delete_source_branch_on_merge]
  1. 8. 配置 Atlantis webhook 的 Ingress,以下示例中我们使用 AWS ALB。
# ingress config
ingress:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: HTTP
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:certificate
    alb.ingress.kubernetes.io/group.name: external-atlantis
    alb.ingress.kubernetes.io/healthcheck-path: /healthz
    alb.ingress.kubernetes.io/healthcheck-port: "80"
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/success-codes: "200"
    alb.ingress.kubernetes.io/target-type: ip
  apiVersion: networking.k8s.io/v1
  enabled: true
  host: atlantis.your.domain
  ingressClassName: aws-ingress-class-name
  path: /*
  pathType: ImplementationSpecific

保存对 values.yaml 所做的所有更改。

  1. 9. 利用 Atlantis 的自定义工作流选项,我们可以在仓库的根目录下创建一个 atlantis.yaml 文件,下面的例子应能满足大多数场景,根据需要调整。
version: 3
automerge: true
parallel_plan: true
parallel_apply: false
projects:
- name: terragrunt
  dir: .
  workspace: terragrunt
  delete_source_branch_on_merge: true
  autoplan:
    enabled: false
  apply_requirements: [mergeable, approved]
  workflow: terragrunt
workflows:
  terragrunt:
    plan:
      steps:
      - env:
          name: TF_IN_AUTOMATION
          value: 'true'
      - run: find . -name '.terragrunt-cache' | xargs rm -rf
      - run: terragrunt init -reconfigure
      - run:
          command: terragrunt plan -input=false -out=$PLANFILE
          output: strip_refreshing
    apply:
      steps:
        - run: terragrunt apply $PLANFILE
  1. 10. 现在进行安装本身,查看可用的 Atlantis 版本:
helm search repo runatlantis

将 CHART-VERSION 替换为你想安装的版本,然后运行以下命令:

helm upgrade -i atlantis runatlantis/atlantis --version CHART-VERSION -f values.yaml --create-namespace atlantis

接下来,设置 GitHub 仓库上的 Atlantis webhook[3]

了解 Atlantis如何工作[4]

更多信息请访问:

  • https://www.runatlantis.io/guide.html
  • https://opentofu.org/docs/
  • https://github.com/runatlantis/atlantis/issues/3741

分享给你的朋友们吧!

参考资料
[1]

Helm chart: https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart

[2]

GitHub App: https://docs.github.com/pt/apps/creating-github-apps/about-creating-github-apps

[3]

webhook: https://www.runatlantis.io/docs/configuring-webhooks.html

[4]

如何工作: https://www.runatlantis.io/docs/using-atlantis.html


点击【阅读原文】阅读网站原文


文章转载自CNCF点击这里阅读原文了解更多

联系Linux Foundation APAC




Linux基金会是非营利性组织,是技术生态系统的重要组成部分。

Linux基金会通过提供财务和智力资源、基础设施、服务、活动以及培训来支持创建永续开源生态系统。在共享技术的创建中,Linux基金会及其项目通过共同努力形成了非凡成功的投资。请关注LFAPAC(Linux Foundation APAC)微信公众号。

LFAPAC
Linux基金会通过提供财务和智力资源、基础设施、服务、活动以及培训来支持创建永续开源生态系统。在共享技术的创建中,Linux基金会及其项目通过共同努力形成了非凡成功的投资。
 最新文章