Terraform

evescn / 2023-07-29 / 原文

Terraform

https://developer.hashicorp.com/terraform/intro

什么是 Terraform

Terraform 是一种基础设施即代码工具,可让您在人类可读的配置文件中定义云和本地资源,您可以对这些文件进行版本控制、重用和共享。然后,您可以使用一致的工作流程来配置和管理所有基础设施的整个生命周期。Terraform 可以管理计算、存储和网络资源等低级组件,以及 DNS 条目和 SaaS 功能等高级组件。

Terraform 是如何工作的

Terraform 通过应用程序编程接口 (API) 创建和管理云平台和其他服务上的资源。提供商使 Terraform 能够通过可访问的 API 与几乎任何平台或服务配合使用

核心 Terraform 工作流程由三个阶段组成

  • Write(写入):定义资源,这些资源可能跨多个云提供商和服务。例如,您可以创建一个配置,以在具有安全组和负载均衡器的虚拟私有云 (VPC) 网络中的虚拟机上部署应用程序。
  • Plan(计划): Terraform 创建一个执行计划,描述它将根据现有基础设施和您的配置创建、更新或销毁的基础设施。
  • Apply(应用):获得批准后,Terraform 将按照正确的顺序执行建议的操作,并尊重任何资源依赖性。例如,如果您更新 VPC 的属性并更改该 VPC 中的虚拟机数量,Terraform 将在扩展虚拟机之前重新创建 VPC。

安装 Terraform

https://developer.hashicorp.com/terraform/downloads

  • centos
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
  • mac
brew tap hashicorp/tap
brew install hashicorp/tap/terraform

或者直接下载安装包

wget https://releases.hashicorp.com/terraform/1.5.4/terraform_1.5.4_darwin_amd64.zip
unzip terraform_1.5.4_darwin_amd64.zip
mv terraform /usr/local/bin
  • vscode 插件 (自动补全代码)

    • Terraform
    • HashiCorp Terraform

Terraform 语法

配置语法

  • Terraform的配置文件都是以 .tf 为后缀
  • Terraform支持两种模式 HCL、JSON

Provider 插件

providers 地址:https://registry.terraform.io/browse/providers

Terraform 通过 provider 管理基础设施,使用 provider 与云供应商 API 进行交互,每个 Provider 都包含相关的资源和数据源

声明 Provider

每个 Terraform 模块必须声明它需要哪些 Provider ,以便 Terraform 可以安装和使用它们。

提供者要求在一个 required_providers 块中声明。

## versions.tf

terraform {
  required_providers {
    alicloud = {
      // Provider 源地址
      source = "aliyun/alicloud"
      // Provider 版本
      version = "1.208.0"
    }
  }
}
配置 Provider
  • 关键字 provider
  • Provider 名称
 # Configure the Alicloud Provider
provider "PROVIDER_NAME" {
  // 参数配置
  access_key = var.alicloud.access_key
  secret_key = var.alicloud.secret_key
  region     = var.region
}
  • 实例
## provider.tf

provider "alicloud" {
  access_key = var.alicloud.access_key
  secret_key = var.alicloud.secret_key
  region     = var.region 
}
  • 阿里云提供商接受多种输入凭据进行身份验证的方式

    • Static credentials
    • Environment variables
    • Shared credentials/configuration file
    • ECS Role
    • Assume role
    • Sidecar Credentials

详细使用查看官网:https://registry.terraform.io/providers/aliyun/alicloud/latest/docs

alias

配置多个 Provider

可以为同一个Provider定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域。

引用方式:

  • <PROVIDER NAME>.<ALIAS>
  • alicloud.beiling
  • provider.hangzhou

在其他配置文件中指定资源区域时,可以使用此模式引用

## provider.tf

provider "alicloud" {
  access_key = var.alicloud.access_key
  secret_key = var.alicloud.secret_key
}

provider "alicloud" {
  alias = "beijing"
  region = "cn-beijing-b"
}

provider "alicloud" {
  alias = "hangzhou"
  region = "cn-hangzhou-a"
}

Resource 资源

  • 资源来自 Provider ,是 Terraform 中最重要的元素。每个资源块描述一个或多个基础对象,例如网络、计算实例或更高级别的组件,例如 DNS 记录。
  • 资源名称必须以字母或下划线开头,并且只能包含字母、数宇、下划线和破折号。
resource "resource_type" "name" {
  // resource_config
}

Resource-ECS 资源

定义一台ECS实例:

  • 可用区
  • 安全组
  • 实例规格
  • 系统盘类型
  • 名称描达
  • 镜像
  • 实例名称
  • 带宽
  • 交换机
  • 付费类型
  • 账户密码
resource "alicloud_instance" "myecs" {
    availability_zone = var.region
    security_groups = alicloud_security_group. group.*.id
    instance_type = "ecs.n1.tiny"
    system_disk_category = "cloud_efficiency"
    svstem_disk_name = "tf_svstem_disk_name"
    system_disk_description = "tf_system_disk_description"
    image_Id = "centos 7_5_X64_206_allbase_20211130.vhd"
    instance_name = "mytestecs"
    switch_id = alicloud_vswitch.vsw.id
    internet_max_bandwidth_out = 1
    internet_charge_type = "PayByTraffic"
    password = "root@123"
}

Terraform 部署 Docker

Terraform 部署 Kubernetes