我们已经了解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,用于将基础结构的状态与基础结构本身分开存储。状态文件将许多部署数据以纯文本形式写入,包括变量,资源信息,帐户等。如果这些元素是机密的,则可能会出现问题。
准备工作
从Download Terraform下载Terraform并解压。
win+r
打开run窗口输入sysdm.cpl
,在高级-环境变量中加入Terraform路径。输入
terraform -version
验证Terraform是否安装成功。
C:\Users\admin>terraform -version
Terraform v0.14.5
- 准备可用的Azure账号和Azure CLI
使用Terraform部署Azure资源
Terraform依靠Providers与远程系统进行交互,其中包含Terraform可以管理的一组资源类型或数据源。这里我们使用Azure Provider进行Azure资源的部署。
- 新建Terraform配置文件
main.tf
,使用Azure Provider新建位于eastasia
的myTFResourceGroup
资源组。其中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"
}
- 将配置文件所在文件夹在命令行中打开,首先进行身份验证。
az login
- 初始化你的配置
terraform init
初始化成功后如下- 在创建架构之前,terraform会检查配置文件的执行计划
terraform plan
这个执行计划会指出为了达到指定的理想状态,terraform会做哪些操作- 接着进行部署,如果你已经使用plan检查过执行计划,可以加上
-auto-approve
terraform apply -auto-approve
-
部署完成后,到Azure门户中查看,发现资源组已部署完成。部署完成
查看文件夹,可以发现
terraform.tfstate
文件,包含了Terraform创建的资源的ID和属性,以便管理或销毁这些资源。状态文件包含配置中的所有数据,还可能包含明文形式的敏感值,因此请勿共享或签入源代码。
在GitHub中使用Terraform进行自动化部署
- 新建文件夹terraform,放入main.tf配置文件
provider "azurerm" {
version = "2.37"
features {}
}
resource "azurerm_resource_group" "rg" {
name = "myTFResourceGroup"
location = "eastasia"
}
- 新建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
-
查看运行过程。
Workflow - Plan -
若为push到master branch,则跳过plan阶段。
Workflow - Apply
-
查看资源组是否创建成功。
Succeeded
相关阅读
Introduction - Terraform by HashiCorp
Get Started - Azure | Terraform - HashiCorp Learn
Terraform - GitHub Actions