在本地创建 terraform VM 设置,使用 cloudinit 的计数和静态 ips

问题描述 投票:0回答:0

我想使用 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"
  },
]
terraform libvirt cloud-init
© www.soinside.com 2019 - 2024. All rights reserved.