Github Action 发布Terraform基础设施项目
【摘要】 一 背景GitHub Action 集成 Terraform 的方案背景主要有以下几个方面:基础设施即代码:随着云计算技术的发展,基础设施即代码成为了管理云基础设施和应用程序的主流方式。使用基础设施即代码工具,如 Terraform,可以帮助开发者在云端环境中管理基础设施和应用程序,实现自动化部署和流程简化。DevOps 原则:DevOps 是一种软件开发和运维的方法论,强调开发和运维之间...
一 背景
GitHub Action 集成 Terraform 的方案背景主要有以下几个方面:
- 基础设施即代码:随着云计算技术的发展,基础设施即代码成为了管理云基础设施和应用程序的主流方式。使用基础设施即代码工具,如 Terraform,可以帮助开发者在云端环境中管理基础设施和应用程序,实现自动化部署和流程简化。
- DevOps 原则:DevOps 是一种软件开发和运维的方法论,强调开发和运维之间的协作和共同责任,以提高软件交付速度和质量。GitHub Actions 集成 Terraform 可以帮助实现 DevOps 原则,提高开发效率和质量,缩短上线时间。
- 自动化部署:自动化部署是 DevOps 的核心要素之一,可以减少手动干预,提高效率和准确性。使用 GitHub Actions 集成 Terraform,可以实现自动化部署,提高部署的效率和可靠性。
- 与 GitHub 集成:GitHub 是一个广泛使用的代码托管平台,提供了许多与代码管理和协作相关的功能。通过 GitHub Actions 集成 Terraform,可以直接与 GitHub 仓库进行集成,帮助开发者更好地管理代码和部署过程。
综上所述,GitHub Actions 集成 Terraform 方案的背景主要是基础设施即代码、DevOps 原则、自动化部署和与 GitHub 集成等方面的需求和趋势。这种方案可以帮助开发者更好地管理基础设施和应用程序,提高开发效率和质量,缩短上线时间。
二 集成方案特点
GitHub Actions 集成 Terraform 方案的优缺点如下:
2.1 优点
- 自动化部署:通过 GitHub Actions 集成 Terraform,可以实现自动化部署,减少手动干预,提高效率和准确性。
- 简化流程:使用 Terraform 管理云基础设施和应用程序可以简化流程,提高开发和部署的效率,缩短上线时间。
- 可靠性高:Terraform 已经被广泛使用和验证,可以帮助开发者在云端环境中管理基础设施和应用程序,提高可靠性和稳定性。
- 与 GitHub 集成:由于 GitHub Actions 集成 Terraform,可以直接与 GitHub 仓库进行集成,帮助开发者更好地管理代码和部署过程。
2.2 缺点
- 学习成本:使用 Terraform 和 GitHub Actions 集成需要一定的学习成本,需要掌握 Terraform 和 GitHub Actions 的基本知识和技能。
- 复杂性:Terraform 作为一种基础设施即代码工具,需要开发者对基础设施和云服务有一定的了解和认知,否则可能会增加复杂度和风险。
- 安全问题:在使用 GitHub Actions 和 Terraform 集成时,需要注意安全问题,如如何存储和保护访问密钥等敏感信息,否则可能会导致数据泄露和安全问题。
- 成本问题:使用 Terraform 和云服务时,需要考虑成本问题,如如何优化云资源的使用和控制成本等,否则可能会增加开销和费用。
综合来看,GitHub Actions 集成 Terraform 方案具有许多优点,可以帮助开发者实现自动化部署和流程简化,提高开发效率和可靠性。但是,也需要注意学习成本、复杂性、安全问题和成本问题等方面的注意事项。
三 实战
3.1 先决条件
- 使用github进行代码托管包含terraform和github action工作流;
- 使用github action进行terraform集成设施变更;
- 由于使用流水线,terraform state 文件需要放在项目外,利用terraform cloud进行存储remote state;
3.2 代码
- 代码结构
.
├── .github
│ └── workflows
│ └── terraform.yml
├── README.md
├── main.tf
└── variables.tf
- tf代码
provider "alicloud" {
region = var.region
}
terraform {
cloud {
organization = "devopsxuel"
workspaces {
name = "learn-terraform-github-actions-aliyun"
}
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.4.0"
}
}
required_version = ">= 1.2.0"
}
variable "region" {
type = string
default = "cn-hongkong"
}
variable "vpc_cidr" {
type = string
default = "10.0.0.0/16"
}
resource "alicloud_vpc" "tfcloud_githubaction" {
cidr_block = var.vpc_cidr
name = "tfcloud_githubaction"
tags = {
name = "gh-action"
}
}
output "vpc_id" {
value = alicloud_vpc.tfcloud_githubaction.id
}
3.3 Github Action
name: "Terraform Infrastructure Change Management Pipeline with GitHub Actions"
on:
push:
branches:
- main
pull_request: {}
env:
# verbosity setting for Terraform logs
TF_LOG: INFO
ALICLOUD_ACCESS_KEY: ${{ secrets.ALICLOUD_ACCESS_KEY }}
ALICLOUD_SECRET_KEY: ${{ secrets.ALICLOUD_SECRET_KEY }}
jobs:
terraform:
name: "Terraform Infrastructure Change Management"
runs-on: ubuntu-latest
defaults:
run:
shell: bash
# We keep Terraform files in the terraform directory.
working-directory: .
steps:
- name: Checkout the repository to the runner
uses: actions/checkout@v2
- name: Setup Terraform with specified version on the runner
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.3.0
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
- name: Terraform format
id: fmt
run: terraform fmt -check || echo true
- name: Terraform init
id: init
run: terraform init
- name: Terraform validate
id: validate
run: terraform validate
- name: Terraform plan
id: plan
if: github.event_name == 'push'
run: terraform plan -no-color -input=false
continue-on-error: true
# - uses: actions/github-script@v6
# if: github.event_name == 'push'
# env:
# PLAN: "terraform\n${{ steps.plan.outputs.stdout }}"
# with:
# script: |
# const output = `#### Terraform Format and Style 🖌\`${{ steps.fmt.outcome }}\`
# #### Terraform Initialization ⚙️\`${{ steps.init.outcome }}\`
# #### Terraform Validation 🤖\`${{ steps.validate.outcome }}\`
# #### Terraform Plan 📖\`${{ steps.plan.outcome }}\`
# <details><summary>Show Plan</summary>
# \`\`\`\n
# ${process.env.PLAN}
# \`\`\`
# </details>
# *Pushed by: @${{ github.actor }}, Action: \`${{ github.event_name }}\`*`;
# github.rest.issues.createComment({
# issue_number: context.issue.number,
# owner: context.repo.owner,
# repo: context.repo.repo,
# body: output
# })
- name: Terraform Plan Status
if: steps.plan.outcome == 'failure'
run: exit 1
- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve -input=false
配置密钥
TF_API_TOKEN: 用于github action与terraform cloud进行通讯;
ALICLOUD_ACCESS_KEY/ALICLOUD_SECRET_KEY为 阿里云provider信息。
3.4 terraform cloud配置
申请tf 组织token用于存储
配置terraform cloud apply method 为auto apply
四 测试
提交代码变更,查看
查看目标云资源
五 注意事项
- 配置 Terraform Cloud API 密钥:在 GitHub 中,您需要在您的存储库设置中配置 Terraform Cloud API 密钥。此 API 密钥用于与 Terraform Cloud 进行通信并执行 Terraform 部署。确保保护此 API 密钥并遵循最佳安全实践。
- 遵循最佳实践:在使用 Terraform Cloud 和 GitHub Action 进行部署时,请遵循最佳实践和安全性建议,以确保您的基础结构得到保护和管理。
总之,使用 Terraform Cloud 和 GitHub Action 进行自动化基础结构管理是一个强大的工具,可以帮助您节省时间并减少错误。但是,请确保您正确配置并遵循最佳实践和安全性建议,以确保您的基础结构得到保护和管理。
参考链接
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)