创建一个 NAT 模式的虚拟网络,默认的网络地址为 192.168.123.0/24,可通过变量 net_domain 修改。
resource "libvirt_volume" "disk" {
count = length(var.vms)
name = "${var.vms[count.index].name}.qcow2"
pool = "default"
base_volume_name = var.template_img
base_volume_pool = var.templates_pool
}
根据变量 vms 定义的虚拟机实例,创建虚拟机的系统磁盘,基于变量 templates_pool 和 template_image 指定的模板镜像,默认也就是上面我们通过 Packer 创建的系统镜像。
resource "libvirt_domain" "vm" {
count = length(var.vms)
name = var.vms[count.index].name
autostart = true
qemu_agent = true
vcpu = lookup(var.vms[count.index], "cpu", 1)
memory = lookup(var.vms[count.index], "memory", 512)
...
}
}
libvirt_domain 资源定义了需要创建的虚拟机实例,并通过 ansible provisioner 进行是初始化配置(配置静态IP地址和主机名)。
resource "local_file" "ansible_hosts" {
content = templatefile("./tpl/ansible_hosts.tpl", {
vms = var.vms
subnet = var.subnet
gateway = cidrhost(var.subnet, 1)
mask = cidrnetmask(var.subnet)
nameserver = cidrhost(var.subnet, 1)
user = var.user
})
filename = "../ansible/k3s_hosts"
file_permission = 0644
directory_permission = 0755
}
该资源定义通过模板文件创建虚拟机实例的 Ansible Inventory 文件,便于下一步通过 Ansible 进行 K3S 集群的创建。
在应用之前,我们需要配置 vms 变量,来指定我们需要的虚拟机实例信息
❯ cp .k3svms.tfvars k3dcluster.auto.tfvars
vms = [
{
name = "control"
cpu = 1
memory = 1024
ip = 10
groups = ["k3s"]
vars = {
role = "server"
}
},
{
name = "worker1"
cpu = 1
memory = 1024
ip = 21
groups = ["k3s"]
vars = {
role = "agent"
}
},
{
name = "worker2"
cpu = 1
memory = 1024
ip = 22
groups = ["k3s"]
vars = {
role = "agent"
}
}
]
上面定义了3台实例,1台作为k3s集群的 server 节点,2台作为k3s集群的 role 节点,默认IP地址将会被配置为
- control : 192.168.123.10
- worker1 : 192.168.123.21
- worker2 : 192.168.123.22
接下来我们将执行 Terrform 操作
❯ terraform init
❯ terraform plan
❯ terrafrom apply --auto-approve
...
Apply complete! Resources: 8 added, 0 changed, 0 destroyed.
Outputs:
vms_ip_addresses = {
"control" = "192.168.123.10"
"worker1" = "192.168.123.21"
"worker2" = "192.168.123.22"
}
完成之后,3台虚拟机将会创建并运行,同时在 k3scluster/ansible/ 目录中将创建名为 k3s_hosts