Terraform-云平台操作神器

1,253 阅读3分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

功能简介

Terraform是IT 基础架构自动化编排工具,它的口号是 "Write,Plan, and create Infrastructure as Code", 基础架构即代码。
通过同一套规则和命令来操作不同的云平台,包括私有云。
# 四种操作云平台的方法
方式一:直接登录到云平台的管理页面,人工点击。这种对于单个或者几个云资源还可以维护,但是当云服务器规模达到成本上千后人工操作变得不再现实、而且容易误操作。
方式二:云平台提供的SDK、AIP。这样是大批量操作成为可能,而且代码能相对于减少误操作。但需要相应的开发能力,而且对复杂需求需要编写大量的代码。
方式三:云平台提供的命令行工具,例如aws cli、阿里云cli等,这样就可以通过命令操作云资源,就如sql一样使用增删改查等操作元素来管理云。
方式四:Terraform闪亮登场,如果方式三中CLI是命令式操作,需要明确告知云服务器本次操作是查询、新增,那么Terraform就是目的式操作。在本地维护一份云服务状态的目标,模板编排成什么样子云服务器就是什么样子。
相对于上面三种,Teeraform优势是我们只需要专注于编排结果即可,不需要关心用什么命令去操作。
Terraform知识

核心文件有个2个,一个是编排文件、另一个是状态文件

  • main.tf文件:是业务编排的主文件,定制了一系列的编排规则。
  • terraform.tfstate:本地状态文件,相当于本地云服务状态的备份,会影响terraform的执行计划。
问:如果本地状态与云服务状态不一样时会怎样?
答:这个不需要担心,前面介绍过Terraform是目的式的编排,会按照预设结果完成编排并最终同步更新本地文件。

安装配置

  • 下载解压
# 官网下载,找寻对应平台
https://www.terraform.io/downloads.html
# 下载解压
wget https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
  • 配置环境变量
vim /etc/profile
export PATH=$PATH:/data/softapps
source /etc/profile
  • 基本操作命令
# 前期初始化操作
1.创建一个工作目录,目录就像git的仓库,或者像软件开发中的workspace。
2.创建一个xx.ft文件,指定provider等信息。
3.执行terraform init命令,就像git init一样对当前目录做初始化,下载tf中的provider,并对后续的操作准备必要环境条件。
# 资源相关操作
1.terraform plan: 预览执行计划,不是必须的但是强烈建议。好明白这次要把云服务器弄成什么样子。后期版本会与apply合并成一个,所以根据自己的版本使用plan命令。
2.terraform apply:真正执行编排计划
3.terraform show:展示现在状态
4.terraform destroy:销毁云服务,将tf中的云服务清理干净

腾讯云Terraform操作

  • Terraform工作流程

mark

  • 创建provider.tf文件
vim provider.tf
//provider.tf
provider "tencentcloud" {
    secret_id  = "RGID*************SG*"
    secret_key = "CBS************GS"
    region     = "ap-shanghai"
}
# 建议将api密钥放在环境变量中配置,不建议直接把密钥写到源代码里避免泄漏。
vim /etc/profile
export TENCENTCLOUD_SECRET_ID="your_accessid"
export TENCENTCLOUD_SECRET_KEY="your_accesskey"
export TENCENTCLOUD_REGION="ap-shanghai"
# 密钥写环境变量里provider.tf文件可省略相关信息
vim provider.tf
provider "tencentcloud" {}
  • 初始化
terraform init:初始化Terraform,erraform会自动检测 provider.tf 文件中的 provider 字段。
发送请求到Terraform官方GitHub下载最新版本腾讯云资源的模块和插件,初始化成功时当前脚本的版本信息也会显示出来。
当腾讯云脚本有新的版本发布时,可以通过 terraform init -upgrade 指令更新脚本,获取最新的应用。

mark

  • 部署腾讯云资源
# 这里展示创建一个vpc
$ vim vpc.tf
// Create a vpc
resource "tencentcloud_vpc" "vpc_test" {
    name = "vpc-test-liyk"
    cidr_block = "10.0.0.0/16"
}

mark mark mark mark

开通云服务器
vim cvm.tf
// Create a cvm
resource "tencentcloud_instance" "cvm_test" {
    instance_name = "cvm-test"
    availability_zone = "ap-hongkong-1"
    image_id = "img-pi0ii46r"
    instance_type = "S2.SMALL1"
    system_disk_type = "CLOUD_PREMIUM"

    security_groups = [
        "${tencentcloud_security_group.sg_test.id}"
    ]

    vpc_id = "${tencentcloud_vpc.vpc_test.id"
    subnet_id = "${tencentcloud_subnet.subnet_test.id}"
    internet_max_bandwidth_out = 10
    count = 1
}
$ vim vpc.tf
// Create a vpc
resource "tencentcloud_vpc" "vpc_test" {
    name = "vpc-test-liyk"
    cidr_block = "10.0.0.0/16"
}
$ vim subnet.tf
// Create a subnet
resource "tencentcloud_subnet" "subnet_test" {
   name = "subnet-test"
   cidr_block = "10.0.1.0/24"
   availability_zone = "ap-hongkong-1"
   vpc_id = "${tencentcloud_vpc.vpc_test.id}"
   route_table_id = "${tencentcloud_route_table.rtb_test.id}"
}
$ vim route_table.tf
// Create a route table
resource "tencentcloud_route_table" "rtb_test" {
    name = "rtb-test"
    vpc_id = "${tencentcloud_vpc.vpc_test.id}"
}
$ vim security_group.tf
// Create a security group and rule
resource "tencentcloud_security_group" "sg_test" {
    name = "sg-test"
}
resource "tencentcloud_security_group_rule" "sg_rule_test" {
    security_group_id = "${tencentcloud_security_group.sg_test.id}"
   type = "ingress"
   cidr_ip = "0.0.0.0/0"
   ip_protocol = "tcp"
   port_range = "22,80"
   policy = "accept"
}

总结及案例

使用Terraform的Scripting、Plan、Apply和Destroy四个步骤即可轻松实现基础架构资源的全生命周期管理。下面我们以腾讯云的CVM、MySQl、VPC和Security Group服务为例,搭建一个最简单的基础架构。

  • Scripting
使用HashiCorp自己的声明型语言HCL编写资源编排脚本。
由于是声明型语言,我们熟悉的过程型语言的一些高级特性,比如“for”循环,HCL是不支持的。
#1、Provider info
provider "tencentcloud" {
  secret_id = "AsVv2va1CE5ipdx4"
  secret_key = "KQdafafrtJ"
  region = "ap-shanghai"
}

#2、Create a VPC resource
resource "tencentcloud_vpc" "main" {
  name = "demo-VPC"
  cidr_block = "10.0.0.0/16"
}

#3、Create route tables for web and DB
resource "tencentcloud_route_table" "web" {
  name = "demo-rt_web"
  vpc_id = "${tencentcloud_vpc.main.id}"
}
resource "tencentcloud_route_table" "db" {
  name = "demo-rt_db"
  vpc_id = "${tencentcloud_vpc.main.id}"
}

#4、CVM instances
resource "tencentcloud_instance" "nginx" {
  instance_name = "demo-nginx"
  availability_zone = "ap-shanghai-2"
  image_id      = "img-pi0ii46r"
  instance_type = "S4.SMALL2"

  security_groups = [
    "${tencentcloud_security_group.web.id}"
  ]

  vpc_id    = "${tencentcloud_vpc.main.id}"
  subnet_id = "${tencentcloud_subnet.web.id}"
  internet_max_bandwidth_out = 10
  count = 10
}

#5、Mysql instance
resource "tencentcloud_mysql_instance" "demo-mysql" {
  instance_name = "demo-mysql"
  mem_size = 1000
  root_password = "My_demo_mysql0001"
  volume_size = 50

  availability_zone = "ap-shanghai-2"
  engine_version = "5.7"
  internet_service = 0
  intranet_port = 3306

  parameters = {
    max_connections = "1000"
  }

  security_groups = [
    "${tencentcloud_security_group.db.id}"
  ]

  vpc_id = "${tencentcloud_vpc.main.id}"
  subnet_id = "${tencentcloud_subnet.db.id}"

  tags = {
    name ="demo-project"
  }
}

#6、Create subnets within the VPC
resource "tencentcloud_subnet" "web" {
  name = "demo-SN_web"
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-shanghai-2"
  vpc_id = "${tencentcloud_vpc.main.id}"
  route_table_id = "${tencentcloud_route_table.web.id}"
}
resource "tencentcloud_subnet" "db" {
  name = "demo-SN_db"
  cidr_block = "10.0.2.0/24"
  availability_zone = "ap-shanghai-2"
  vpc_id = "${tencentcloud_vpc.main.id}"
  route_table_id = "${tencentcloud_route_table.db.id}"
}

#7、Create security groups and rules
resource "tencentcloud_security_group" "web" {
  name        = "demo-sg_web"
  description = "Accessible for both HTTP and SSH"
}

resource "tencentcloud_security_group" "db" {
  name        = "demo-sg_db"
  description = "Accessible for both mysql and SSH from web"
}

resource "tencentcloud_security_group_rule" "web-from-public" {
  security_group_id = "${tencentcloud_security_group.web.id}"
  type              = "ingress"
  cidr_ip           = "0.0.0.0/0"
  ip_protocol       = "tcp"
  port_range        = "80,22"
  policy            = "accept"
}

resource "tencentcloud_security_group_rule" "web-to-public" {
  security_group_id = "${tencentcloud_security_group.web.id}"
  type              = "egress"
  ip_protocol       = "tcp"
  cidr_ip           = "0.0.0.0/0"
  port_range        = "80,22"
  policy            = "accept"
}

resource "tencentcloud_security_group_rule" "mysql-from-webtier" {
  security_group_id = "${tencentcloud_security_group.db.id}"
  type              = "ingress"
  cidr_ip           = "10.0.1.0/24"
  ip_protocol       = "tcp"
  port_range        = "22,3306"
  policy            = "accept"
}

resource "tencentcloud_security_group_rule" "mysql-to-webtier" {
  security_group_id = "${tencentcloud_security_group.db.id}"
  type              = "egress"
  cidr_ip           = "0.0.0.0/0"
  ip_protocol       = "tcp"
  port_range        = "22,3306"
  policy            = "accept"
}
  • Plan
Terraform Plan功能可以很好的支持Terraform脚本执行前的检查确认工作。
Terraform基于脚本、本地状态文件(terraform.tfstate)和云平台三者的一致性来保证执行结果的准确性。
  • Apply
Terraform apply功能实现基础架构的一键部署。注意,apply前Terraform还是会强制进行资源的确认工作,即Terraform Plan工作。
Terraform的执行结果会保存在本地状态文件(terraform.tfstate)中。
  • Destroy
通过以上简单地三个步骤即可实现复杂的资源部署工作,同样的,仅需要一个简单地命令即可实现资源的快速高效释放。
优势
1.更高的部署效率。缩短了资源从开发需求到部署实施的流程,同时在批量部署以及多云部署场景下,IaC可以大幅提升资源部署的效率;
2.增加了基础资源配置的一致性。由于采用声明型语言,资源配置更加易读,降低了人工犯错的几率;
3.降低企业成本。将传统的云迁移工作大大简化,提高资源的利用率,从而有效降低企业云上的OPEX;