我想使用 libvirt(现在在本地机器上进行测试)并使用 terraform 创建多个虚拟机 (Ubuntu)。我想要一个 nat 网络(没有 dhcp),每个 VM 都有一个静态地址。知道如何配置吗?我不是很擅长网络和第一次这样做:)
问题:一切都在设置,没有错误。但是我无法 ping 机器,当我登录到它们时,它们没有设置任何 ips...
这是我的
network_config_static.cfg
:
version: 2
ethernets:
eth0:
dhcp4: false
# default libvirt network
addresses: [ ${natIp}/28 ]
gateway4: ${natGateway}
nameservers:
addresses: [ ${natGateway} ]
search: [ ${domain} ]
eth1:
dhcp4: false
addresses: [${internalIp}]
我有一个像这样的
Networf.tf
:
resource "libvirt_network" "nat_network" {
name = "nat_network"
mode = "nat"
# Assign IP addresses to NAT network in sequence
addresses = [ var.nat_network_cidr ]
domain = "terraform.challenge"
dns {
enabled = true
local_only = false
forwarders { address = "127.0.0.1" }
}
dhcp {
enabled = false
}
autostart = true
}
resource "libvirt_network" "internal_network" {
name = "internal_network"
mode = "nat"
# Assign IP addresses to internal network in sequence
addresses = [ var.internal_network_cidr]
domain = "terraform.challenge"
dhcp {
enabled = false
}
autostart = true
}
data "template_file" "network_config" {
count = var.vm_count
template = file("network_config_static.cfg")
vars = {
natIp = cidrhost(var.nat_network_cidr, count.index+2)
natGateway = cidrhost(var.nat_network_cidr, 1)
internalIp = cidrhost(var.internal_network_cidr, count.index+2)
domain = var.dns_domain
}
}
这是我的
Cloudinit.tf
:
data "template_file" "user_data" {
count = var.vm_count
template = file("user-data.yml")
vars = {
hostname = "${var.domain}-${count.index + 1}"
ssh_public_key = var.ssh_public_key
password = "linux"
}
}
resource "libvirt_cloudinit_disk" "cloud-init" {
count = var.vm_count
name = "cloud-init-${count.index + 1}.iso"
user_data = data.template_file.user_data[count.index].rendered
network_config = data.template_file.network_config[count.index].rendered
}
和一些变量:
variable "domain" {
description = "The domain/host name of the zone"
default = "ubuntu2204"
}
variable "dns_domain" {
type = string
default="some.domain"
}
variable "vm_count" {
type = number
default = 3
}
variable "ssh_public_key" {
type = string
default = "ssh-rsa dfkadjfkdfdf somethingsomething"
}
variable "vol_size" {
description = "The size of this VM"
# 10G
default = 10 * 1024 * 1024 * 1024
}
variable "nat_network_cidr" {
type = string
default = "10.10.13.12/28"
}
variable "internal_network_cidr" {
type = string
default = "10.10.13.32/28"
}
所以当我应用 terraform 时,所有设置都已完成。但在那之后,我无法 ping 通虚拟机。此外,当我登录时,我看到虚拟机没有分配任何 IP。 我找不到错误...是因为 cloudinit 配置吗?还是网络创建出了问题......
当我用 virsh 看
nat_network
时,它看起来像这样:
<network connections='3'>
<name>nat_network</name>
<uuid>263d9d8e-c8ff-43a5-b1d6-bb19598d92df</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr7' stp='on' delay='0'/>
<mac address='52:54:00:17:4b:11'/>
<domain name='terraform.challenge'/>
<dns enable='yes'>
<forwarder addr='127.0.0.1'/>
</dns>
<ip family='ipv4' address='10.10.13.1' prefix='28'>
</ip>
</network>
我还添加了一个
Output
以查看在 cloudinit 网络文件中设置了什么 Ips:
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
Outputs:
vm_static_ips = [
{
"domain" = "some.domain"
"internalIp" = "10.10.13.34"
"ip" = "10.10.13.2"
"name" = "vm1"
"natGateway" = "10.10.13.1"
},
{
"domain" = "some.domain"
"internalIp" = "10.10.13.35"
"ip" = "10.10.13.3"
"name" = "vm2"
"natGateway" = "10.10.13.1"
},
{
"domain" = "some.domain"
"internalIp" = "10.10.13.36"
"ip" = "10.10.13.4"
"name" = "vm3"
"natGateway" = "10.10.13.1"
},
]