DevOps - IaC 基础架构即代码(二)Terraform及GitHub部署实例

我们已经了解IaC是在一个或多个文件中管理基础结构的过程,而不是在用户界面中手动配置资源的过程,介绍了Azure特定的IaC工具Azure Resource Manager,这一篇我们将介绍Terraform。

Terraform

作为最主流的IaC工具之一,Terraform可以管理众多云服务提供商(如Azure,Google Cloud,AWS)的资源,以及定制的内部解决方案。官网上列举了几个典型使用Terraform的应用场景,如

  • 部署应用程序到Heroku平台
  • 构建和管理N-Tier多层架构
  • “自服务”架构
  • 动态调度请求资源
  • 多云部署等

我们可以通过配置文件定义需要的组件,Terraform会生成执行计划,列出达到预期状态所需执行的操作,然后执行该计划以构建所需的基础结构。如果需要对配置进行更改,Terraform能够确定更改的内容并创建可以应用的增量执行计划。

工具比较

Terraform的主要优势之一是多云部署和其语言统一性,使用HCL配置语言将Azure,AWS,GCE,OpenStack和本地部署一起使用。不同于ARM使用Json,声明性代码可以编写复杂但易于阅读的代码。
还有其他一些优势,如在Terraform中,可以随时使用Terraform Destroy功能启动和禁用资源,Terraform Plan验证当前状态,以确保它适合进行中的部署操作。
此外部署后,Terraform将创建一个状态文件terraform.tfstate,用于将基础结构的状态与基础结构本身分开存储。状态文件将许多部署数据以纯文本形式写入,包括变量,资源信息,帐户等。如果这些元素是机密的,则可能会出现问题。


准备工作

  1. 从Download Terraform下载Terraform并解压。

  2. win+r打开run窗口输入sysdm.cpl,在高级-环境变量中加入Terraform路径。

  3. 输入terraform -version验证Terraform是否安装成功。

C:\Users\admin>terraform -version
Terraform v0.14.5
  1. 准备可用的Azure账号和Azure CLI

使用Terraform部署Azure资源

Terraform依靠Providers与远程系统进行交互,其中包含Terraform可以管理的一组资源类型或数据源。这里我们使用Azure Provider进行Azure资源的部署。

  1. 新建Terraform配置文件main.tf,使用Azure Provider新建位于eastasiamyTFResourceGroup资源组。其中resource <_type_>.<_name_>表示新建一个ID为azurerm_resource_group.rg的资源,这个名称用于引用配置中创建的Terraform资源,与Azure中资源组的名称不同。
# Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = ">= 2.26"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "myTFResourceGroup"
  location = "eastasia"
}

  1. 将配置文件所在文件夹在命令行中打开,首先进行身份验证。
az login
  1. 初始化你的配置
terraform init

初始化成功后如下
Output
  1. 在创建架构之前,terraform会检查配置文件的执行计划
terraform plan

这个执行计划会指出为了达到指定的理想状态,terraform会做哪些操作
Output
  1. 接着进行部署,如果你已经使用plan检查过执行计划,可以加上-auto-approve
terraform apply -auto-approve
  1. 部署完成后,到Azure门户中查看,发现资源组已部署完成。
    部署完成
  2. 查看文件夹,可以发现terraform.tfstate文件,包含了Terraform创建的资源的ID和属性,以便管理或销毁这些资源。状态文件包含配置中的所有数据,还可能包含明文形式的敏感值,因此请勿共享或签入源代码。

在GitHub中使用Terraform进行自动化部署

  1. 新建文件夹terraform,放入main.tf配置文件
provider "azurerm" {
  version = "2.37"
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "myTFResourceGroup"
  location = "eastasia"
}
  1. 新建Workflow,环境变量中需要更新service principal的访问密钥,并指定Terraform运行的文件夹,即配置文件所处位置。Pull Request会触发到Plan,当push到master时运行Apply。
name: 'Terraform'

on:
  push:
    branches:
    - master
  pull_request:

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    env:
      ARM_CLIENT_ID: ${{secrets.CLIENTID}}
      ARM_CLIENT_SECRET: ${{secrets.CLIENTSECRET}}
      ARM_SUBSCRIPTION_ID: ${{secrets.SUBSCRIPTIONID}}
      ARM_TENANT_ID: ${{secrets.TENANTID}}

    defaults:
      run:
        shell: bash

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set Terraform
      uses: hashicorp/setup-terraform@v1
   
    - name: Terraform fmt
      uses: hashicorp/terraform-github-actions@master
      with:
        tf_actions_version: 0.12.13
        tf_actions_subcommand: 'fmt'
        tf_actions_working_dir: 'terraform'
        tf_actions_comment: true

    - name: Terraform Init
      uses: hashicorp/terraform-github-actions@master
      with:
        tf_actions_version: 0.12.13
        tf_actions_subcommand: 'init'
        tf_actions_working_dir: 'terraform'
        tf_actions_comment: true

    - name: Terraform Plan
      if: github.event_name == 'pull_request'
      uses: hashicorp/terraform-github-actions@master
      with:
        tf_actions_version: 0.12.13
        tf_actions_subcommand: 'plan'
        tf_actions_working_dir: 'terraform'
        tf_actions_comment: true

    - name: Terraform Apply
      if: github.ref == 'refs/heads/master' && github.event_name == 'push'
      uses: hashicorp/terraform-github-actions@master
      with:
        tf_actions_version: 0.12.13
        tf_actions_subcommand: 'apply'
        tf_actions_working_dir: 'terraform'
        tf_actions_comment: true

  1. 查看运行过程。


    Workflow - Plan
  2. 若为push到master branch,则跳过plan阶段。


    Workflow - Apply
  1. 查看资源组是否创建成功。


    Succeeded
相关阅读

Introduction - Terraform by HashiCorp
Get Started - Azure | Terraform - HashiCorp Learn
Terraform - GitHub Actions

你可能感兴趣的:(DevOps - IaC 基础架构即代码(二)Terraform及GitHub部署实例)