Terraform 又是什么新工具
帮你建立删除资源。它使用起来很是简单,咱们但愿用户能把精力全都集中开发工做上,而不是考虑管理资源这种杂事上。html
我尽可能让这篇文章通俗易懂,不管你是从事什么工做,只要你的工做内容跟云资源管理有一点点关系,都能从Terraform中受益git
最快的上手的方法永远是先用一下试试,按照下面的方法去作:github
咱们会用一个文件用于描述咱们须要的资源, 在当前目录下建立一个名叫 jdcloud.tf 的文件,并在这个文件里写入下面的内容:ubuntu
provier "jdcloud" {
access_key = "your_access_key"
secret_key = "your_secret_key"
region = "cn-north-1"
}
resource "jdcloud_vpc" "local-name" {
vpc_name = "my-vpc"
cidr_block = "172.16.0.0/20"
description = "terraform rules"
}复制代码
这份配置文件包含了身份信息以及资源信息,已是一份完整可用的配置文件了。api
在配置文件中咱们声明了一个新服务商 - 京东云,为了能使Terraform接入京东云资源管理,Terraform须要去下载京东云插件,这一切都是 Terraform 自动完成的,咱们只须要一个命令安全
$ terraform init
> Initializing provider plugins...
Downloading plugin for provider "jdcloud" (0.0.1)...
* provider.jdcloud: version = "~> 0.0"
Terraform has been successfully initialized!复制代码
经过一个指令,Terraform会为先为你生成一个行动计划,在本示例中则是建立出一个VPC, 等待你确认此次行动,输入“yes”,才会才开始建立bash
$ terraform apply
> Terraform will perform the following actions:
+ jdcloud_vpc.jd-vpc-1
id: <computed>
cidr_block: "172.16.0.0/20"
description: "terraform rules"
vpc_name: "my-vpc"
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
--------------------------------------------------
Enter a value: yes
--------------------------------------------------
jdcloud_vpc.jd-vpc-1: Creating...
cidr_block: "" => "172.16.0.0/20"
description: "" => "vpc1"
vpc_name: "" => "my-vpc-1"
---------------------------------------------------
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
---------------------------------------------------复制代码
建立成功了,咱们能够登录控制台查看这项资源是否被成功建立,果真是在这儿的网络
简单来讲,用户须要去作的,只是在 jdcloud.tf 里修改相应资源, 然后经过 terraform apply 便可完成修改,使用上当前的配置。架构
有的配置例如名称,描述等是可供修改的。在terraform apply的时候会提示一项资源即将修改: app
$ terraform apply
> jdcloud_vpc.jd-vpc-1: Refreshing state... (ID: vpc-qdpipn8mn2)
~ jdcloud_vpc.jd-vpc-1
vpc_name: "my-vpc" => "modified-name"
-------------------------------------------------------
Plan: 0 to add, 1 to change, 0 to destroy
-------------------------------------------------------
jdcloud_vpc.jd-vpc-1: Modifying... (ID: vpc-qdpipn8mn2)
vpc_name: "my-vpc" => "modified-name"
--------------------------------------------------------
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
--------------------------------------------------------复制代码
可是有些配置则是不能修改的,好比VPC的CIDR属性在建立以后就不能修改,若是尝试修改CIDR属性,Terraform会为你销毁当前资源并重建一个。 在下面的日志中 Terraform 会用-/+
的方式提示你,terraform会先销毁当前资源并重建,同时提示你 new resource required
$ terraform apply
> jdcloud_vpc.jd-vpc-1: Refreshing state... (ID: vpc-qdpipn8mn2)
-------------------------------------------------------
-/+ jdcloud_vpc.jd-vpc-1 (new resource required)
-------------------------------------------------------
id: "vpc-qdpipn8mn2" => <computed> (forces new resource)
cidr_block: "172.16.0.0/20" => "172.16.0.1/20" (forces new resource)
description: "vpc1" => "vpc1"
vpc_name: "modified-name" => "modified-name"
---------------------------------------------------------
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
---------------------------------------------------------复制代码
在刚刚的例子中咱们只是建立一个简单的资源,terraform看似平平无奇。只是作了一些全部SDK都能作的事。可是在实际生产中咱们的结构每每是比较复杂的环境,VPC / 子网 / 云主机 / 路由等等穿插交织在一块儿,相互依赖。
这种状况下,就算只是想调整一个VPC的网段都是一件很是复杂的事。首先咱们须要理清有哪些资源建在这个VPC上,除去重建的步骤,理清脉络就是一件很是头痛的事。
Terraform 真正的威力在于【生成执行计划】的步骤上 。 当前的云端架构会被存在本地的 terraform.tfstate的文件里。 当配置文件被修改的时候,它会马上计算出当前的架构,与你指望达到的状态之间的差别。并告诉你有哪些资源只是修改一下属性便可,哪些则须要删除重建。 等待你确认以后才开始执行。
因而用户就避免了繁琐的”理清脉络的过程“,能够将工做重心放在开发工做上,而不是理清繁琐的依赖关系。 经过 terraform apply 确认一下,等待执行完成便可。
事实上,除了直接写,你还能够经过"引用"的方式代表这个属性的值,在一些场景下巧妙的引用会为你省下不少时间,咱们以构建一台云主机为例,为了节省空间咱们省略了一些细节
resource "jdcloud_subnet" "my-subnet" {
...
}
resource "jdcloud_network_security_group" "my-sg" {
...
}
resource "jdcloud_instance" "my-vm" {
...
image_id = "${var.ubuntu_image}"
password = "${var.vm_password}"
subnet_id = "${jdcloud_subnet.my-subnet.id}"
security_group_ids = ["${jdcloud_network_security_group.my-sg.id}"]
...
}复制代码
因而 terraform 便获得了一组依赖关系 : 云主机 my-vm 依赖 my-sg & my-subnet ,下次若是my-subnet 面临删除重建,terraform会提示你它会先重建构建在它之上的 my-vm
以此类推,子网: my-subnet 可能也构建在另外一个VPC资源上,相互依赖的网络就这样被构建出来,若是你尝试删除VPC, terraform 会计算出全部同时也须要删除的资源
大家Terraform支持XX资源吗?
这个问题的答案是: 只要有SDK就是支持的,想要在 terraform 上管理一项新品类的资源,你只须要准备好SDK便可,接下来咱们以 VPC 为例介绍如何引入一项新资源
Schema: map[string]*schema.Schema{
"vpc_name": {
Type: schema.TypeString,
Required: true,
},
"cidr_block": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
},
},
复制代码
func resourceVpcCreate(d *schema.ResourceData, m interface{}) error {
config := m.(*JDCloudConfig)
vpcName := d.Get("vpc_name").(string)
req := apis.NewCreateVpcRequest(config.Region, vpcName)
conn := client.NewVpcClient(config.Credential)
if _, ok := d.GetOk("cidr_block"); ok {
req.AddressPrefix = GetStringAddr(d, "cidr_block")
}
if _, ok := d.GetOk("description"); ok {
req.Description = GetStringAddr(d, "description")
}
resp,err := conn.CreateVpc(req)
if err != nil {
return e
}
return resourceVpcRead(d, m)
}复制代码
以上是VPC的建立函数,每当terraform认为须要建立VPC需求的时候,就会调用函数