Github Action 发布Terraform基础设施项目

举报
kaliarch 发表于 2023/07/16 10:58:41 2023/07/16
【摘要】 一 背景GitHub Action 集成 Terraform 的方案背景主要有以下几个方面:基础设施即代码:随着云计算技术的发展,基础设施即代码成为了管理云基础设施和应用程序的主流方式。使用基础设施即代码工具,如 Terraform,可以帮助开发者在云端环境中管理基础设施和应用程序,实现自动化部署和流程简化。DevOps 原则:DevOps 是一种软件开发和运维的方法论,强调开发和运维之间...

一 背景

GitHub Action 集成 Terraform 的方案背景主要有以下几个方面:

  1. 基础设施即代码:随着云计算技术的发展,基础设施即代码成为了管理云基础设施和应用程序的主流方式。使用基础设施即代码工具,如 Terraform,可以帮助开发者在云端环境中管理基础设施和应用程序,实现自动化部署和流程简化。
  2. DevOps 原则:DevOps 是一种软件开发和运维的方法论,强调开发和运维之间的协作和共同责任,以提高软件交付速度和质量。GitHub Actions 集成 Terraform 可以帮助实现 DevOps 原则,提高开发效率和质量,缩短上线时间。
  3. 自动化部署:自动化部署是 DevOps 的核心要素之一,可以减少手动干预,提高效率和准确性。使用 GitHub Actions 集成 Terraform,可以实现自动化部署,提高部署的效率和可靠性。
  4. 与 GitHub 集成:GitHub 是一个广泛使用的代码托管平台,提供了许多与代码管理和协作相关的功能。通过 GitHub Actions 集成 Terraform,可以直接与 GitHub 仓库进行集成,帮助开发者更好地管理代码和部署过程。

综上所述,GitHub Actions 集成 Terraform 方案的背景主要是基础设施即代码、DevOps 原则、自动化部署和与 GitHub 集成等方面的需求和趋势。这种方案可以帮助开发者更好地管理基础设施和应用程序,提高开发效率和质量,缩短上线时间。

二 集成方案特点

GitHub Actions 集成 Terraform 方案的优缺点如下:

2.1 优点

  1. 自动化部署:通过 GitHub Actions 集成 Terraform,可以实现自动化部署,减少手动干预,提高效率和准确性。
  2. 简化流程:使用 Terraform 管理云基础设施和应用程序可以简化流程,提高开发和部署的效率,缩短上线时间。
  3. 可靠性高:Terraform 已经被广泛使用和验证,可以帮助开发者在云端环境中管理基础设施和应用程序,提高可靠性和稳定性。
  4. 与 GitHub 集成:由于 GitHub Actions 集成 Terraform,可以直接与 GitHub 仓库进行集成,帮助开发者更好地管理代码和部署过程。

2.2 缺点

  1. 学习成本:使用 Terraform 和 GitHub Actions 集成需要一定的学习成本,需要掌握 Terraform 和 GitHub Actions 的基本知识和技能。
  2. 复杂性:Terraform 作为一种基础设施即代码工具,需要开发者对基础设施和云服务有一定的了解和认知,否则可能会增加复杂度和风险。
  3. 安全问题:在使用 GitHub Actions 和 Terraform 集成时,需要注意安全问题,如如何存储和保护访问密钥等敏感信息,否则可能会导致数据泄露和安全问题。
  4. 成本问题:使用 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。