尝试使用 terraform-provider-libvirt

首先

使用 Terraform 在本地环境部署虚拟机,记录下了过程。所使用的版本如下:Ubuntu 20.04LTS 版本记录。

$ terraform version
Terraform v0.14.5
+ provider registry.terraform.io/dmacvicar/libvirt v0.6.3

Terraform?

公式网页地址:https://www.terraform.io/

我认为,在介绍中常常会提到基础设施即代码(IaC)工具。这是一个命令行界面工具,基于编写在代码即文本文件中的逻辑来构建基础设施。虽然说是基础设施,但并不意味着可以直接对物理层进行操作,所以基本上可以将其视为在云上构建基础设施。同时,还可以在本地环境中使用KVM或docker进行配置构建。

Terraform的安装

您可以从下载页面获取适用于以下平台的Terraform。

    • macOS

 

    • FreeBSD

 

    • Linux

 

    • OpenBSD

 

    • Solaris

 

    Windows

听起来还有一个可以在云环境中执行的环境,叫做Terraform Cloud。

如果使用Ubuntu,您可以使用sudo apt-get install terraform命令进行安装。其他软件也可能可以通过软件包系统进行安装。

以怎样的方式描述并构建什么

请阅读此链接:https://learn.hashicorp.com/terraform 。虽然我觉得只说“请阅读此链接”有点无所谓,但如果您能阅读它,那将比下面这个简陋的解释更加详细,我想这样会让您感到放心。

因此,为了那些想要体验氛围的人,我将介绍一种如何构建的例子。

准备一个目录

Terraform的配置目标由目录进行管理。我们可以尝试创建一个名为tf-test的目录。代码将放置在此目录中。

mkdir tf-test
cd tf-test

准备一个.tf文件

Terraform 读取并执行的代码文件后缀名为.tf。.tf文件中的内容,也就是描述语言,据说是 Hashicorp Configuration Language (HCL)。

以下是从官方教程视频中借用的内容。这是一个构建AWS EC2实例的示例。我们将其命名为main.tf。根据后缀查找文件,因此不必特别设置为main。

provider "aws" {
  access_key = "ACCESS_KEY"
  secret_key = "SECRET_KEY"
  region = "us-east-1"
}

resource "aws_instance" "example" {
  ami = "ami-2757f631"
  instance-type = "t2.micro"
}

我想你能看出来,但是这样的话它实际上无法运行,所以请只是欣赏一下就好。

试着运行Terraform

首先,只需要进行一次初始化。

terraform init

您可以检查 tf 文件的内容是否正确。(如果不进行检查,但内容有误,将会在运行时出现错误)

terraform validate

你可以确认需要如何变更什么事物。

terraform plan

当执行时,在上述示例下,将创建AWS EC2实例。

terraform apply

您也可以删除实例。

terraform destroy

各种不同的供应商

我已经在给出的tf文件中写明了,但在Terraform中,我们需要指定provider,描述作为该provider资源的内容。除了示例中提供的”aws”之外,还有许多其他提供者可供选择。

    • “aws”

 

    • “azurerm”

 

    • “google”

 

    • “kubernetes”

 

因为数量太多无法全部介绍,请在https://registry.terraform.io/browse/providers 上进行搜索。

供应商分为以下几类。

    • HashiCorpのTerraform registryから提供されていて自動的にダウンロードして利用できるもの

official, verified, communityの3種に分かれます

Terraform registryにないもの

在Terraform注册表中提供的内容,只要写上provider “它”就可以使用。如果本地没有,会自动下载。对于未提供的内容,则需要手动下载或进行其他操作。

terraform-provider-libvirt 的中文释义是“terraform libvirt 提供者”。

terraform-provider-libvirt是一个使用libvirt构建虚拟机环境的Terraform提供程序,可以从名称中推测出来。由于在Terraform注册表中没有提供,因此无法进行自动下载或自动安装。因此,安装和使用会稍微麻烦一些。

安装terraform-provider-libvirt

有许多不同的安装方法可供选择,所以请阅读官方网页上的README.md文件,按照您喜欢的方式进行安装。

例如,如果要在Ubuntu上安装稳定的软件包,则需要按照README.md中的链接进行操作步骤。

安装后,还需要额外的一步。
请按照此文档将文件移动。在Terraform 0.13及更高版本中,如果不这样做,将无法使用”libvirt”提供程序。
请按照此文档的说明移动文件。如果不这样做,在Terraform 0.13以后的版本中将无法使用provider “libvirt”。

使用 “libvirt” 作为提供者来构建虚拟机。

准备需要的物品

光盘映像

需要构建用于虚拟机的磁盘镜像。在构建过程中,它将由virt-install进行复制。可以是任何镜像,但在这里我们决定使用手头恰巧有的debian10-gns3.qcow2镜像。(可以在这里获取)

$ ls -lh
total 2.6G
-rw-rw-r-- 1 masaru masaru 2.6G Nov 11 16:07 debian10-gns3.qcow2

libvirt和qemu

当然,您需要先安装libvirt和qemu。还不要忘记将正在操作的账户添加到libvirt用户组中。

编辑/etc/libvirt/qemu.conf

如果不将security_driver设置为”none”,虚拟机将无法启动。请进行编辑并执行sudo systemd restart libvirt-bin。考虑到组的应用,建议您重新启动一次。

编辑tf文件

创建一个目录,并编辑.tf文件。(当然不需要使用vi)

mkdir libvirt-test
cd libvirt-test
vi main.cf

虽然我只想直接开始写”provider”,但是在.tf文件的开头是需要一段咒语的。

terraform {
  required_version = ">= 0.13"
  required_providers {
    libvirt = {
      version = ">= 0.6.2"
      source = "dmacvicar/libvirt"
    }
  }
}

通過這段描述,可以找到剛才移動過位置的terraform-provider-libvirt。如果找不到,將去Terraform註冊表中尋找,如果hashicorp/libvirt也不存在,則會發生錯誤。

接下来,我将详细地列举provider以下的内容。

provider "libvirt" {
  uri = "qemu:///system"
}

resource "libvirt_volume" "os-image" {
  name = "testvm-disk.qcow2"
  source = "debian10-gns3.qcow2"
  format = "qcow2"
}

resource "libvirt_domain" "domain-testvm" {
  name = "debian"
  memory = 2048
  vcpu = 1

  disk { volume_id = libvirt_volume.os-image.id }

  network_interface {
    network_name = "default"
  }

  console {
    type = "pty"
    target_port = "0"
  }

  graphics {
    type = "spice"
    listen_type = "address"
    autoport = "true"
  }
}

粗略解释如下:
– 使用libvirt提供者声明使用libvirt提供者(以后可以使用libvirt_XXXX资源)。
– 使用resource “libvirt_volume” “os-image”定义卷(存储)。
– 使用resource “libvirt_domain” “domain-testvm”定义域(VM实例)。

最后,在此目录中放置debian10-gns3.qcow2,准备工作就完成了。

终于开始执行

terraform init
terraform validate
terraform apply

当执行terraform apply命令时,会询问是否要执行,回答yes即可。

执行日志(由于在后台运行了另一个繁重的任务,所以花费了一些时间)$ terraform init

正在初始化后端…

正在初始化提供程序插件…
– 正在重用先前版本的 dmacvicar/libvirt (从依赖锁文件中)
– 正在安装 dmacvicar/libvirt v0.6.3…
– 已安装 dmacvicar/libvirt v0.6.3(未经验证)

Terraform 初始化成功!

现在您可以开始使用 Terraform。尝试运行 “terraform plan” 查看对基础架构所需的任何更改。现在所有 Terraform 命令都可以运行。

如果您曾设置或更改过 Terraform 的模块或后端配置,请重新运行此命令以重新初始化您的工作目录。如果您忘记了,其他命令将检测到并在必要时提醒您重新运行。
$ terraform validate
成功!配置有效。
$ terraform apply

已生成执行计划并显示如下。
资源操作使用以下符号表示:
+ 创建

Terraform 将执行以下操作:

# libvirt_domain.domain-testvm 将被创建
+ resource “libvirt_domain” “domain-testvm” {
+ arch = (after apply 后知)
+ disk = [
+ {
+ block_device = null
+ file = null
+ scsi = null
+ url = null
+ volume_id = (after apply 后知)
+ wwn = null
},
]
+ emulator = (after apply 后知)
+ fw_cfg_name = “opt/com.coreos/config”
+ id = (after apply 后知)
+ machine = (after apply 后知)
+ memory = 2048
+ name = “debian”
+ qemu_agent = false
+ running = true
+ vcpu = 1

+ console {
+ source_host = “127.0.0.1”
+ source_service = “0”
+ target_port = “0”
+ type = “pty”
}

+ graphics {
+ autoport = true
+ listen_address = “127.0.0.1”
+ listen_type = “address”
+ type = “spice”
}

+ network_interface {
+ addresses = (after apply 后知)
+ hostname = (after apply 后知)
+ mac = (after apply 后知)
+ network_id = (after apply 后知)
+ network_name = “default”
}
}

# libvirt_volume.os-image 将被创建
+ resource “libvirt_volume” “os-image” {
+ format = “qcow2”
+ id = (after apply 后知)
+ name = “testvm-disk.qcow2”
+ pool = “default”
+ size = (after apply 后知)
+ source = “debian10-gns3.qcow2”
}

计划:添加 2 个,更改 0 个,销毁 0 个。

您要执行这些操作吗?
Terraform 将执行上述操作。
只有 “yes” 将被接受以批准。

输入一个值:yes

libvirt_volume.os-image: 正在创建…
libvirt_volume.os-image: 仍在创建… [已花费 10s]
libvirt_volume.os-image: 仍在创建… [已花费 20s]
libvirt_volume.os-image: 仍在创建… [已花费 30s]
libvirt_volume.os-image: 仍在创建… [已花费 40s]
libvirt_volume.os-image: 仍在创建… [已花费 50s]
libvirt_volume.os-image: 仍在创建… [已花费 1m0s]
libvirt_volume.os-image: 仍在创建… [已花费 1m10s]
libvirt_volume.os-image: 仍在创建… [已花费 1m20s]
libvirt_volume.os-image: 仍在创建… [已花费 1m30s]
libvirt_volume.os-image: 仍在创建… [已花费 1m40s]
libvirt_volume.os-image: 仍在创建… [已花费 1m50s]
libvirt_volume.os-image: 正在创建… [已花费 2m0s]
libvirt_volume.os-image: 正在创建… [已花费 2m10s]
libvirt_volume.os-image: 创建完成,用时 2m18s [id=/var/lib/libvirt/images/testvm-disk.qcow2]
libvirt_domain.domain-testvm: 正在创建…
libvirt_domain.domain-testvm: 仍在创建… [已花费 10s]
libvirt_domain.domain-testvm: 创建完成,用时 15s [id=33e01c13-97a9-4ec0-ae7a-51853096ad94]

应用完成!资源:2 个已添加,0 个已更改,0 个已销毁。
masaru@tama:~/src/libvirt-test$

在执行terraform apply之后,我们将确认虚拟机是否成功启动。

$ virsh list
 Id   Name     State
------------------------
 37   debian   running

$ 

您可以使用 virt-viewer 连接到控制台窗口。在这个示例中,可以通过 banner 查看登录信息,您可以使用 root/debian 或 debian/debian 登录。

删除 chú)

通过terraform destroy命令,您创建的环境将被完全删除。同时,磁盘镜像也将被删除,因此无论您在VM上登录并进行了各种文件更改,一切都将消失。请注意。

如果遇到错误困扰

如果忘记编辑/var/lib/libvirt/qemu.conf,那么在执行terraform apply时最后会提示Permission denied错误。有些人可能会认为是无法访问/var/lib/libvirt/images导致的,但实际上不需要改变那里的设置。虽然可以通过执行virsh pool-edit default来修改所有者和组权限,但这并不能解决问题。请按照上述所述,编辑qemu.conf。

由于在此状态下执行”terraform destroy”时,libvirt域仍然存在但不完整,因此下一个”terraform apply”将失败。通过在”terraform destroy”之后删除该域,可以避免此问题。

virsh undefine debian

最后

我想进一步解释一下Terraform中的module概念,它非常方便。同时,我也希望能够解释一下terraform-provider-libvirt中与网络相关的部分。

bannerAds