在 DevOps 实践中,基础设施即代码如何落地是一个绕不开的话题。Terraform 正是这个时期非常成熟的配置管理工具,它能够用于预配和管理大型和负责的云基础结构,基于模板的配置文件,能够以可重复、可预测的方式定义、预配和配置资源。目前各大云平台对Terraform 也都支持的不错,尤其是IBM Cloud提供对Terraform 托管服务Schematics,交付Terraform-as-a-Service,这样就可以使用高级脚本语言来为IBM Cloud环境中需要的资源建模,并将基础设施即代码启用(IaC)使用起来更简单。本文会详细介绍使用IBM的基础设施作为代码解决方案(IBM Cloud Schematics)部署和配置企业级虚拟私有云(VPC)环境,通过动手实验带大家一起进入Terraform的世界。
现在我们开启Schematics之旅,Schematics在IBM Cloud上是一个免费的服务,但部署的资源会有费用产生,所以开始实验前请准备:
1. 一个IBM Cloud付费账号
2. 了解Terraform开发基础
3. 本机安装git工具
接下来我们将利用现成的示例代码来部署一个VPC环境的虚机,可以参考下图。
Schematics托管服务使用Terraform配置文件以声明的方式定义云资源。Terraform配置文件保存在源代码控制系统中。IBM提供了很多Terraform的模板,可以https://github.com/IBM-Cloud/terraform-provider-ibm/tree/master/examples找到你需要的资源模板示例。
本文用到的是Github的项目vpc-tutorials中的vpc-terraform-multicloud ,首先我们可以fork一个此项目到我们自己的账号下,这样我们可以方便对自己项目中的文件进行任意更改。
Fork完成后可以进入自己项目的 'vpc-terraform-multicloud' 查看,我这边拿我自己的项目为例。
接着,我们要把项目'vpc-tutorials'复制到本地:git clone https://github.com/IBM-Cloud-Platform-Dev/vpc-tutorials.git
下一步,登录IBM Cloud:https://cloud.ibm.com/login
点击左上角菜单按钮并选择'Schematics'。
进入到Sehmatics页面后,我们就可以“创建工作空间”。
在创建工作空间页面,需要填入工作空间名称,填写标记,选择资源组和位置"北美",输入完成后查看订单摘要后点击“创建”。
创建完成后,直接跳转到了Schematics的设置页面,接下来我们要配置模板。在之前的部署中我们fork了模板项目,切换到GitHub,进入vpc-tutorials---->vpc-terraform-multicloud---->multicloud,然后复制URL链接,例如:https://github.com/IBM-Cloud-Platform-Dev/vpc-tutorials/tree/master/vpc-terraform-multicloud/multicloud
回到Schematics设置页面,在“导入Terraform模板”的GitHub处,填入复制的URL,选择Terraform版本后,点击“保存模板信息”。
创建完成后,我们可以看到空间的详细信息和变量。
变量是生成和应用模板的参数,由于我们要部署VPC环境和虚机,需要先设置好SSH Key。选择菜单进入VPC -> SSH KEY,或者直接打开新连接:https://cloud.ibm.com/vpc-ext/compute/sshKeys,如果此过程中跳出选择VPC Gen 1和VPC Gen 2,请务必选择 Gen 2(第二代)。
刚才Schematics我们创建工作空间时,选择了iks-lab资源组和北美区域,所以此处SSH秘钥我们需要选择同样的资源组,区域选择达拉斯,然后添加本地的SSH秘钥。公钥私钥创建不在此文讨论内,如果没有可参考链接 https://cloud.ibm.com/docs/vpc?topic=vpc-ssh-keys 学习如何创建SSH秘钥对。
创建完成后,可以回到Schematics的设置页面,填入“basename”,上一步创建的SSH秘钥名称填入‘ssh_key_name’,然后点击“保存更改”。
然后我们到clone下来的项目里观察下两个tf文件:ibm.tf和part1a.tf
# VPC with one subnet, one VSI and a floating IP
provider ibm {
region = "${var.ibm_region}"
generation = "${var.generation}"
}
resource ibm_is_vpc "vpc" {
name = "${var.basename}"
}
# vsi1 access
resource ibm_is_security_group "sg1" {
name = "${var.basename}-sg1"
vpc = "${ibm_is_vpc.vpc.id}"
}
resource ibm_is_subnet "subnet1" {
name = "${var.basename}-subnet1"
vpc = "${ibm_is_vpc.vpc.id}"
zone = "${var.ibm_zones[0]}"
total_ipv4_address_count = 256
}
data ibm_is_ssh_key "ssh_key" {
name = "${var.ssh_key_name}"
}
data ibm_is_image "ubuntu" {
name = "${var.ubuntu1804[var.generation]}"
}
resource ibm_is_instance "vsi1" {
name = "${var.basename}-vsi1"
vpc = "${ibm_is_vpc.vpc.id}"
zone = "${var.ibm_zones[0]}"
keys = ["${data.ibm_is_ssh_key.ssh_key.id}"]
image = "${data.ibm_is_image.ubuntu.id}"
profile = "${var.profile[var.generation]}"
primary_network_interface = {
subnet = "${ibm_is_subnet.subnet1.id}"
security_groups = ["${local.ibm_vsi1_security_groups}"]
}
user_data = "${local.ibm_vsi1_user_data}"
}
resource ibm_is_floating_ip "vsi1" {
name = "${var.basename}-vsi1"
target = "${ibm_is_instance.vsi1.primary_network_interface.0.id}"
}
output ibm1_public_ip {
value = "${ibm_is_floating_ip.vsi1.address}"
}
output ibm1_private_ip {
value = "${ibm_is_instance.vsi1.primary_network_interface.0.primary_ipv4_address}"
}
ibm.tf文件从变量和variables.tf中捕获配置信息,data是现有资源,resource 将在应用配置时创建。请注意它与上面的图是多么紧密地匹配。
locals {
ibm_vsi1_security_groups = ["${ibm_is_security_group.sg1.id}"]
ibm_vsi1_user_data = <
EOS
}
part1a.tf文件有一些Terraform局部变量,可以搜一下文件 local.ibm_vsi1_security_group in ibm.tf,观察下它是如何使用的。
下一步我们点一下右上方的“应用套餐”,开始自动部署,在这过程中可以查看动态日志。
当看到日志完成是,表示我们Terraform部署成功了。
接下来就是见证奇迹的时刻了,可以看到VPC以及子网和一个VSI都构建好了。
上图中红框是虚机实例,我们要把浮动IP记录下来。
第二个实验,我们要在现有的VPC中部署一个应用到虚机上。
我们可以把本地的multicloud文件夹里的所以文件和文件夹都删掉,然后回到上一级目录,把part1b文件夹里的内容全部复制到multicloud文件夹。
如果你是Linux或macOS,可以执行命令。
$ rm -rf multicloud
$ cp -r part1b multicloud
如果有时间ibm_sg_app.tf文件,其中包含从IBM提供的镜像安装软件所需的安全组规则以及一些可用于 VPC 的端点:https://cloud.ibm.com/docs/vpc?topic=vpc-service-endpoints-for-vpc
复制完成后,我们要推送到github项目中去。
$ git add .
$ git commit -m 'update part1b to deploy app on VSI in VPC gen2'
$ git push
再次回到Schematics的“设置”,由于我们的代码库已经更新,所以我们等不及自动获取代码,我们可以手工“提取最新”,提取完成后,再次点击“应用套餐”,这一次我们部署应用到VPC的虚机中。
创建完成后,我们打开浏览器访问http://52.116.132.233:3000/ 和 http://52.116.132.233:3000/info 来验证应用已成功部署和启动。IP地址记得换成先前复制的“浮动IP”哦。
最后还有Part1c的动手实验,是在不同区域的新子网上创建第二个虚机实例,有兴趣的小伙伴可以参考前面的练习自己玩一下。
IBM的Schematics对于Terraform封装的很好,使用非常方便,用户本地就不用再安装了,只需要提交代码到Github上即可,对于DevOps团队来说可以解决在多云场景中CD的部分。今天发分享就到这里,有机会下次再带点干货给各位小伙伴们。