前言
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 内容:
代码语言:javascript复制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
参数指定插件路径使用本地插件,问题即可解决。