尝试使用 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即可。
正在初始化后端…
正在初始化提供程序插件…
– 正在重用先前版本的 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中与网络相关的部分。