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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容