使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC

在 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环境的虚机,可以参考下图。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第1张图片

Schematics托管服务使用Terraform配置文件以声明的方式定义云资源。Terraform配置文件保存在源代码控制系统中。IBM提供了很多Terraform的模板,可以https://github.com/IBM-Cloud/terraform-provider-ibm/tree/master/examples找到你需要的资源模板示例。

本文用到的是Github的项目vpc-tutorials中的vpc-terraform-multicloud ,首先我们可以fork一个此项目到我们自己的账号下,这样我们可以方便对自己项目中的文件进行任意更改。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第2张图片

Fork完成后可以进入自己项目的 'vpc-terraform-multicloud' 查看,我这边拿我自己的项目为例。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第3张图片

接着,我们要把项目'vpc-tutorials'复制到本地:git clone https://github.com/IBM-Cloud-Platform-Dev/vpc-tutorials.git

下一步,登录IBM Cloud:https://cloud.ibm.com/login

点击左上角菜单按钮并选择'Schematics'。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第4张图片使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第5张图片

进入到Sehmatics页面后,我们就可以“创建工作空间”。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第6张图片

在创建工作空间页面,需要填入工作空间名称,填写标记,选择资源组和位置"北美",输入完成后查看订单摘要后点击“创建”。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第7张图片

创建完成后,直接跳转到了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版本后,点击“保存模板信息”。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第8张图片

创建完成后,我们可以看到空间的详细信息和变量。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第9张图片

变量是生成和应用模板的参数,由于我们要部署VPC环境和虚机,需要先设置好SSH Key。选择菜单进入VPC -> SSH KEY,或者直接打开新连接:https://cloud.ibm.com/vpc-ext/compute/sshKeys,如果此过程中跳出选择VPC Gen 1和VPC Gen 2,请务必选择 Gen 2(第二代)。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第10张图片

刚才Schematics我们创建工作空间时,选择了iks-lab资源组和北美区域,所以此处SSH秘钥我们需要选择同样的资源组,区域选择达拉斯,然后添加本地的SSH秘钥。公钥私钥创建不在此文讨论内,如果没有可参考链接 https://cloud.ibm.com/docs/vpc?topic=vpc-ssh-keys 学习如何创建SSH秘钥对。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第11张图片

创建完成后,可以回到Schematics的设置页面,填入“basename”,上一步创建的SSH秘钥名称填入‘ssh_key_name’,然后点击“保存更改”。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第12张图片

然后我们到clone下来的项目里观察下两个tf文件:ibm.tf和part1a.tf

ibm.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 将在应用配置时创建。请注意它与上面的图是多么紧密地匹配。

part1a.tf

locals {
  ibm_vsi1_security_groups = ["${ibm_is_security_group.sg1.id}"]
  ibm_vsi1_user_data = < #!/bin/sh
EOS
}

part1a.tf文件有一些Terraform局部变量,可以搜一下文件 local.ibm_vsi1_security_group in ibm.tf,观察下它是如何使用的。

下一步我们点一下右上方的“应用套餐”,开始自动部署,在这过程中可以查看动态日志。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第13张图片

当看到日志完成是,表示我们Terraform部署成功了。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第14张图片

接下来就是见证奇迹的时刻了,可以看到VPC以及子网和一个VSI都构建好了。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第15张图片

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第16张图片

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第17张图片

上图中红框是虚机实例,我们要把浮动IP记录下来。

 

第二个实验,我们要在现有的VPC中部署一个应用到虚机上。

我们可以把本地的multicloud文件夹里的所以文件和文件夹都删掉,然后回到上一级目录,把part1b文件夹里的内容全部复制到multicloud文件夹。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第18张图片

如果你是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

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第19张图片

再次回到Schematics的“设置”,由于我们的代码库已经更新,所以我们等不及自动获取代码,我们可以手工“提取最新”,提取完成后,再次点击“应用套餐”,这一次我们部署应用到VPC的虚机中。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第20张图片

创建完成后,我们打开浏览器访问http://52.116.132.233:3000/ 和 http://52.116.132.233:3000/info 来验证应用已成功部署和启动。IP地址记得换成先前复制的“浮动IP”哦。

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第21张图片

使用IBM Cloud Schematics交付Terraform-as-a-Service部署第二代VPC_第22张图片      

 

最后还有Part1c的动手实验,是在不同区域的新子网上创建第二个虚机实例,有兴趣的小伙伴可以参考前面的练习自己玩一下。

IBM的Schematics对于Terraform封装的很好,使用非常方便,用户本地就不用再安装了,只需要提交代码到Github上即可,对于DevOps团队来说可以解决在多云场景中CD的部分。今天发分享就到这里,有机会下次再带点干货给各位小伙伴们。

 

 

你可能感兴趣的:(IBM,Cloud)