前言
Terraform 的大名我知道很久了,但是一直没有机会体验。刚好最近正在研究关于 PyVmomi 和 LibCloud,顺便也对 Terraform 进行了简单体验,特此分享给大家。
关于 Terraform
Terraform 是一种开源的基础设施即代码软件工具,它提供了一致的 CLI 工作流来管理数百个云服务。Terraform 将云 API 编码为声明式配置文件。这个声明式配置文件以.tf 结尾。
呆猫
我们通过创建 opensatck 虚机实例来清晰的了解 Terraform 的使用方式。
安装 Terraform
我们可以从 Terraform 官网下载最新版本。
下载链接:https://releases.hashicorp.com/terraform/1.1.6/terraform_1.1.6_windows_amd64.zip
下载完成后,解压压缩包,然后将 Terraform 所在的文件目录添加到环境变量,最后通过 cmd 命令 terraform -version 确定安装是否成功。

下载 terraform-provider-openstack
首先我们创建一个名为 trfm_demo 的文件夹用来作为 terraform 的项目包。
我们计划使用 terraform 对接 openstack,对 openstack 的资源进行操作编排。所以我们首先需要安装 terraform-provider-openstack,这是 terraform 操作 openstack 的插件。
我们可以在配置好 tf 文件后使用 terraform init 进行在线下载,由于国内网速堪忧,所以我们直接到 github 上去找到 terraform-provider-openstack 的 release 包下载,然后将压缩包解压到.trfm_demo.terraformpluginsregistry.terraform.ioterraform-provider-openstackopenstack1.47.0windows_amd64下即可。
编写 tf 文件
我们在 trfm_demo 中创建一个名为 main.tf 的描述文件。
main.tf 文件是对云环境认证,资源编排的描述。
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.47.0"
}
}
}
provider "openstack" {
user_name = "admin"
tenant_name = "admin"
password = "pwd@pwd"
cloud = "default"
region = "RegionOne"
}
resource "openstack_compute_instance_v2" "boot-from-volume" {
name = "boot-from-volume"
flavor_id = "e49548cf-a756-4f01-8967-bfc45be67662"
security_groups = ["default"]
block_device {
uuid = "949b1ee2-0ea1-4b0a-a272-e832aaf81724"
source_type = "image"
volume_size = 55
boot_index = 0
destination_type = "volume"
delete_on_termination = true
}
network {
name = "Net29"
}
}
以上,
openstack的认证信息之所以选择cloud字段,是因为直接使用auth_url存在问题,所以选择使用openstack支持的clous.yaml方式。
clouds.yaml 内容:
clouds:
default:
auth:
auth_url: https://xxx.cloud.com:5000/v3
project_name: admin
tenant_name: admin
username: admina
password: pwd@pwd
user_domain_name: Default
project_domain_name: Default
region_name: RegionOne
verify: False
interface: public
identity_api_version: "3"
terraform init
init之前我们可以采用terraform fmt来对tf文件进行格式化校验。
在完成以上步骤后,我们就可以开始进行初始化了,使用命令 terraform init 完成项目初始化。这个过程中会检查文件合法性和下载依赖,但是因为我们计划使用离线的方式,所以我们在初识化的时候借助参数 -plugin-dir ..terraformplugins 来使用本地插件。

terraform plan
顾名思义,plan 过程是对 tf 中描述的资源进行检查的过程,同时会告诉你将要创建的资源。只会列出资源,不会创建资源。

terraform apply
apply 过程即实际创建过程,这个过程中,terraform 会向你确认是否要创建资源,你确认 yes 后就会开始根据描述文件向 openstack 创建资源了。

我们看到最后提示 add 一个资源成功,即成功创建一个虚机资源。我们前去 openstack 进行确认。

我们可以看到在 openstack 上资源已经开始创建了,是一个从卷启动的虚机,没有任何问题。
Q&A
1、Terraform 怎么支持 https 协议?
问题描述:
当我们的环境 public endpoint 是 https 协议时,我们在 apply 的时候会报 auth_url 证书相关的错误,但是我找了一圈没有找到如何配置忽略证书。
解决方案:
经过查询官方文档,我发现 Terraform 是支持 openstack 的 clouds.yaml 的,在 clouds.yaml 中我们可以配置 https 协议的 auth_url。

provider "openstack" {
user_name = "admin"
tenant_name = "admin"
password = "pwd@pwd"
cloud = "default"
region = "RegionOne"
}

2、Terraform init 很慢怎么办?
问题描述:
我们在 terraform init 过程中,terraform 需要从 github 下载 provider 包,但是由于国内访问 github 慢如牛,所以会出现各种问题。
解决方案:
我们可以复制 github 上的 terraform-provider-openstack 包地址,然后使用 github 加速器进行下载,然后根据上面的教程,将插件放到项目的指定位置,然后在 init 过程中使用 -plugin-dir 参数指定插件路径使用本地插件,问题即可解决。