最近在研究terraform,采了一圈坑,记录一下。

什么是terraform?terraform 通过代码配置实现物理机等一些资源的分配。简单说就是,写一个配置文件,启动,就能帮你购买一台云的机器,或者说申请到oss的资源,或者是别的什么。具体功能见官网。

https://www.terraform.io/docs/index.html

名词解释:provider你可以把它看做各个厂商对terraform提供的插件,terraform可以调用这些插件从而实现对资源的操作管理。
terraform流程:init -> plan -> apply -> destroy
对应为:初始化,计划验证,实际应用,销毁

最小demo

我将用一个最小的demo来演示它怎么干活的:通过terraform来创建一个阿里云的oss
(以下没有利益相关)只是因为阿里云我有账号而已,其他供应商也有。

我的本地环境:macOS

步骤1 下载相关资源

下载对应的客户端:https://www.terraform.io/downloads.html
下载解压后得到:terraform的客户端,将它复制到 /usr/local/bin 目录下

1
2
$ terraform -version
Terraform v0.12.13

验证一下,输出版本正常的话就好了

下载阿里云对应provider:https://releases.hashicorp.com/terraform-provider-alicloud/1.60.0/
我下载的版本为:terraform-provider-alicloud_1.60.0_darwin_amd64.zip

放置到一个你喜欢的目录下,我这边为/Users/LinkinStar/Documents/tf-plugin

步骤2 申请阿里云相关资源

创建你的阿里云账号,这个不多说了。然后需要创建一个ram用户
https://ram.console.aliyun.com/
用户管理 -> 新建用户 -> 保存好AccessKey和Secret

注意!这里还需要对用户进行授权,点击授权给到相关权限就行,我给了全部,方便测试

步骤3 编写文件

随便创建一个工作目录,然后创建一个tf文件main.tf

1
2
3
4
5
6
7
8
9
10
11
# Configure the Alicloud Provider
provider "alicloud" {
access_key = "LTAIaskjfhadsklfhklasdjfhdsakjlfhdask"
secret_key = "6GPashfjksladfhdjskafhdsklajfdhaljfhajfl"
region = "cn-beijing"
}

resource "alicloud_oss_bucket" "bucket-acl" {
bucket = "bucket-123456654321-acl"
acl = "private"
}

其中 access_key 和 secret_key 为你刚才申请ram的信息
bucket 的名称你随便取一个

步骤4 运行命令

init

以下命令均在tf文件当前目录下运行

1
terraform init -plugin-dir=/Users/LinkinStar/Documents/tf-plugin

注意后面的目录是我们刚才下载的provider的目录
出现 Terraform has been successfully initialized! 为成功

plan

然后使用命令 terraform plan 出现以下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  # alicloud_oss_bucket.bucket-acl will be created
+ resource "alicloud_oss_bucket" "bucket-acl" {
+ acl = "private"
+ bucket = "bucket-123456654321-acl"
+ creation_date = (known after apply)
+ extranet_endpoint = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ intranet_endpoint = (known after apply)
+ location = (known after apply)
+ owner = (known after apply)
+ storage_class = "Standard"
}

Plan: 1 to add, 0 to change, 0 to destroy.

apply

运行命令 terraform apply 过程中需要输出yes确认
出现以下信息就证明成功了:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

你可以到:https://oss.console.aliyun.com/overview
查看OSS是否已经被创建

destroy

最后运行命令 terraform destroy 过程中需要输出yes确认
刚才创建的OSS资源就会被销毁,你可以再在网上刷新一下查看

以上就是通过terraform进行的资源操作,同样的,你可以修改tf文件进行更多资源的操作

对ECS进行操作

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
# Configure the Alicloud Provider
provider "alicloud" {
access_key = "LTAIaskjfhadsklfhklasdjfhdsakjlfhdask"
secret_key = "6GPashfjksladfhdjskafhdsklajfdhaljfhajfl"
region = "cn-hangzhou"
}

# Create a new ECS instance for a VPC
resource "alicloud_security_group" "group" {
name = "tf_test_foo"
description = "foo"
vpc_id = "${alicloud_vpc.vpc.id}"
}
resource "alicloud_vpc" "vpc" {
name = "tf_test_foo"
cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vswitch" {
vpc_id = "${alicloud_vpc.vpc.id}"
cidr_block = "172.16.0.0/21"
availability_zone = "cn-hangzhou-i"
}

resource "alicloud_instance" "instance" {
availability_zone = "cn-hangzhou-i"
security_groups = "${alicloud_security_group.group.*.id}"
instance_type = "ecs.t6-c2m1.large"
system_disk_category = "cloud_efficiency"
image_id = "ubuntu_18_04_64_20G_alibase_20190624.vhd"
instance_name = "test_foo"
vswitch_id = "${alicloud_vswitch.vswitch.id}"

internet_max_bandwidth_out = 0
}

需要注意的是你的账户余额必须>100块,否则会提示余额不足,我这边tf里面写的是非常便宜几分钱一个小时的机器,所以问题不大,你要是害怕你可以不测(再说一遍本文没有利益相关)

相关资源总结

provider下载地址:https://releases.hashicorp.com/
provider相关文档:https://www.terraform.io/docs/providers/index.html

坑点

  • 国内的墙导致直接执行init是不可以的,它会去官方拉取provider但是会报错,必须手动下载provider并指定-plugin-dir,呼吸不到外面的新鲜空气有点难受。
  • terraform的文档都是英文的并且provider给到的参数选项不全,不知道该填什么。
  • 阿里云创建的ram用户默认没有权限。
  • 阿里云需要100块?!我充10块钱不行吗?我又花不了那么多,弄得我晚饭都吃不起了。
  • 阿里云很多地区是没有便宜的机器卖的,一直提示我机器没有,很难受。

PS: 以上TF文件均用来测试,所以一些变量没有做抽离,实际使用一些变量如key等会抽离成别的文件统一管理,别被我带跑偏了。

总结

总的来说使用tf对于资源的申请还是非常方便的,一个文件就可以搞定,可以做到随时使用随时销毁,同时也支持多次apply对资源进行更新和操作。它不仅可以对服务器进行操作,还有很多公有云的资源如dns等进行操作,并且现在provider支持的厂商很多。

原理相关的博客后续有机会补充,希望不会鸽。