Terraform-云平台操作神器(一)

功能简介

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

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

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

安装配置

  • 下载解压

    1
    2
    3
    4
    # 官网下载,找寻对应平台
    https://www.terraform.io/downloads.html
    # 下载解压
    wget https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
  • 配置环境变量

    1
    2
    3
    vim /etc/profile
    export PATH=$PATH:/data/softapps
    source /etc/profile
  • 基本操作命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 前期初始化操作
    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文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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" {}
  • 初始化

    1
    2
    3
    terraform init:初始化Terraform,erraform会自动检测 provider.tf 文件中的 provider 字段。
    发送请求到Terraform官方GitHub下载最新版本腾讯云资源的模块和插件,初始化成功时当前脚本的版本信息也会显示出来。
    当腾讯云脚本有新的版本发布时,可以通过 terraform init -upgrade 指令更新脚本,获取最新的应用。

mark

  • 部署腾讯云资源
    1
    2
    3
    4
    5
    6
    7
    # 这里展示创建一个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

开通云服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
}
1
2
3
4
5
6
$ vim vpc.tf
// Create a vpc
resource "tencentcloud_vpc" "vpc_test" {
name = "vpc-test-liyk"
cidr_block = "10.0.0.0/16"
}
1
2
3
4
5
6
7
8
9
$ 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}"
}
1
2
3
4
5
6
$ vim route_table.tf
// Create a route table
resource "tencentcloud_route_table" "rtb_test" {
name = "rtb-test"
vpc_id = "${tencentcloud_vpc.vpc_test.id}"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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
1
2
使用HashiCorp自己的声明型语言HCL编写资源编排脚本。
由于是声明型语言,我们熟悉的过程型语言的一些高级特性,比如“for”循环,HCL是不支持的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#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

    1
    2
    Terraform Plan功能可以很好的支持Terraform脚本执行前的检查确认工作。
    Terraform基于脚本、本地状态文件(terraform.tfstate)和云平台三者的一致性来保证执行结果的准确性。
  • Apply

    1
    2
    Terraform apply功能实现基础架构的一键部署。注意,apply前Terraform还是会强制进行资源的确认工作,即Terraform Plan工作。
    Terraform的执行结果会保存在本地状态文件(terraform.tfstate)中。
  • Destroy

    1
    通过以上简单地三个步骤即可实现复杂的资源部署工作,同样的,仅需要一个简单地命令即可实现资源的快速高效释放。
优势
1
2
3
1.更高的部署效率。缩短了资源从开发需求到部署实施的流程,同时在批量部署以及多云部署场景下,IaC可以大幅提升资源部署的效率;
2.增加了基础资源配置的一致性。由于采用声明型语言,资源配置更加易读,降低了人工犯错的几率;
3.降低企业成本。将传统的云迁移工作大大简化,提高资源的利用率,从而有效降低企业云上的OPEX;
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。