terraform初体验

2022-06-17 08:22:25 浏览数 (1)

前言

Terraform 的大名我知道很久了,但是一直没有机会体验。刚好最近正在研究关于 PyVmomiLibCloud,顺便也对 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-openstackrelease 包下载,然后将压缩包解压到.trfm_demo.terraformpluginsregistry.terraform.ioterraform-provider-openstackopenstack1.47.0windows_amd64下即可。

编写 tf 文件

我们在 trfm_demo 中创建一个名为 main.tf 的描述文件。

main.tf 文件是对云环境认证,资源编排的描述。

代码语言:javascript复制
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 endpointhttps 协议时,我们在 apply 的时候会报 auth_url 证书相关的错误,但是我找了一圈没有找到如何配置忽略证书。

解决方案:

经过查询官方文档,我发现 Terraform 是支持 openstackclouds.yaml 的,在 clouds.yaml 中我们可以配置 https 协议的 auth_url

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

0 人点赞