本文最初撰写于 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. 添加 runatlantis 仓库。
helm repo add runatlantis https://runatlantis.github.io/helm-charts
2. 创建文件 values.yaml 并执行:
helm inspect values runatlantis/atlantis > values.yaml
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"
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-*
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
6. 在这里配置环境变量,避免下载 Terraform 的其他版本,并指示 Terragrunt 从何处获取 OpenTofu 二进制文件。
# envs
environment:
ATLANTIS_TF_DOWNLOAD: false
TERRAGRUNT_TFPATH: /plugins/tofu
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]
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 所做的所有更改。
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
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
分享给你的朋友们吧!
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)微信公众号。