摘要:
“腾讯云IaC最佳实践”系列文章希望通过介绍Terraform、Chef和Ansible等生态产品工具及相关案例,使用户能够更好地在腾讯云上实践IaC,为腾讯云用户提供增值服务。本文是“腾讯云IaC最佳实践”系列文章的第1篇。
另外,腾讯云海外产品中心生态产品组专注于云计算生态领域的工具、产品开发与合作,欢迎有需求的小伙伴与我们联系。
IaC与资源编排
IaC(Infrastructure as Code)这一理念随着云技术的普及以及多云时代的到来而被广泛接受和认可,特别是众多生态工具产品的涌现使得IaC由概念逐渐成为现实。
与传统的“ClickOps”管理模式相比,IaC主要可以在以下几个方面为用户带来巨大优势:
- 提高资源部署的速度和效率。所有的云服务都可以通过代码的方式进行部署、维护和管理,极大地提高了规模部署下的生产效率;
- 配置的一致性。由于所有的云服务管理都是通过代码的方式实现,因此相关的软件方法论也可以类似的迁移到IaC使用中来,能够提高开发、测试、运维环境的配置一致性,降低人为失误;
- 节约成本。IaC的引入可以更加高效的应对多云管理,既可以降低Opex,也可以通过多云部署方案降低资源使用成本;
目前,常见的IaC工具主要分为两类:一类是配置管理类,如Chef,Puppet等,该类产品主要优势在于底层的单服务器、单服务的配置管理;另一类是资源编排类,如Terraform、Pulumi等,该类产品主要优势在于更高层面的资源编排,根据资源描述文件创建具有相互依赖关系的云资源或服务并进行配置。值得注意的是,在Terraform里资源的相互依赖关系并不需要被明确指出,Terraform会根据资源之间的互相引用情况自行判断依赖关系,并据此决定资源的先后创建顺序。
腾讯云与terraform
Terraform是由HashiCorp公司在2014年左右推出, 目前几乎所有的主流云服务商都支持Terraform,包括腾讯云、AWS、Azure和GCP等。
Terraform之所以为众多云用户和云服务商青睐,主要是基于:
- 完善的开源生态。只需要一个工具即可完成对多个云厂商的服务进行资源编排;
- 使用声明型语言HCL(HashiCorp Configuration Language)。使用户只关注与自己的需求,而非如何实现;
- 采用客户端单一架构(Client Only),而非CS(Client/Server)架构。降低数据安全风险,同时提高了infrastructure配置的可靠性;
腾讯云在2017年即开始支持terraform进行资源编排,截止目前共有10余款基础产品完美支持terraform,涉及计算、存储、网络、数据库等类别。经过两年的多实践,包括Roit、EF和Unity等在内的众多大客户都在腾讯云上基于terraform构建自己的基础架构。
进入2019年,腾讯云将积极推动全线产品对生态产品的支持力度,计划到今年年底实现50余款核心产品对terraform的支持,同时从资源编排、配置管理以及业务部署三个维度全面引入云生态产品,加速多云业务场景落地,为用户提供更大的价值。
使用Terraform
下面我们通过一个简单地案例来了解Terraform在资源编排上的强大功能以及优势。
使用Terraform前,我们需要首先现下载客户端并配置工作环境。客户端的安装可以选择本地PC,也可以使用云服务器(CVM),详细内容可以参考terraform官方说明。
使用Terraform的Scripting、Plan、Apply和Destroy四个步骤即可轻松实现基础架构资源的全生命周期管理。下面我们以腾讯云的CVM、MySQl、VPC和Security Group服务为例,搭建一个最简单的基础架构,相关Resources的说明参考Tencentcloud Provider。
1、Scripting
使用HashiCorp自己的声明型语言HCL编写资源编排脚本。由于是声明型语言,我们熟悉的过程型语言的一些高级特性,比如“for”循环,HCL是不支持的。
代码语言:txt复制#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"
}
2、Plan
Terraform Plan功能可以很好的支持Terraform脚本执行前的检查确认工作。Terraform基于脚本、本地状态文件(terraform.tfstate)和云平台三者的一致性来保证执行结果的准确性。
3、Apply
Terraform apply功能实现基础架构的一键部署。注意,apply前Terraform还是会强制进行资源的确认工作,即Terraform Plan工作。
Terraform的执行结果会保存在本地状态文件(terraform.tfstate)中。
……
……
4、Destroy
通过以上简单地三个步骤即可实现复杂的资源部署工作,同样的,仅需要一个简单地命令即可实现资源的快速高效释放。
……
……
总结
通过上面的简单案例,我们可以快速的发现相比于传统的Infrastructure管理工作,IaC具有无可比拟的优势:
- 更高的部署效率。缩短了资源从开发需求到部署实施的流程,同时在批量部署以及多云部署场景下,IaC可以大幅提升资源部署的效率;
- 增加了基础资源配置的一致性。由于采用声明型语言,资源配置更加易读,降低了人工犯错的几率;
- 降低企业成本。将传统的云迁移工作大大简化,提高资源的利用率,从而有效降低企业云上的OPEX;
Terraform作为IaC领域的优秀产品已经获得了广泛的认可,我们腾讯云会与生态合作伙伴一起为腾讯云用户提供更多的优秀生态产品和应用案例。
在腾讯云“云 ”社区,我们会持续提供更加详细的产品讲解和应用案例分析,欢迎大家关注我们的“云 ”社区专栏。