Init Project
This commit is contained in:
commit
8a3909ac0f
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
*.hcl
|
||||
*.tfstate*
|
||||
.terraform/
|
17
cdrom-model.xsl
Normal file
17
cdrom-model.xsl
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" ?>
|
||||
<xsl:stylesheet version="1.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:output omit-xml-declaration="yes" indent="yes"/>
|
||||
<xsl:template match="node()|@*">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="node()|@*"/>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="/domain/devices/disk[@device='cdrom']/target/@bus">
|
||||
<xsl:attribute name="bus">
|
||||
<xsl:value-of select="'scsi'"/>
|
||||
</xsl:attribute>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
21
cloud_init.yml
Normal file
21
cloud_init.yml
Normal file
|
@ -0,0 +1,21 @@
|
|||
#cloud-config
|
||||
ssh_pwauth: True
|
||||
chpasswd:
|
||||
list: |
|
||||
root:linux
|
||||
expire: False
|
||||
users:
|
||||
- name: "${login}"
|
||||
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||
plain_text_passwd: "${passwd}"
|
||||
shell: /bin/bash
|
||||
lock-passwd: false
|
||||
ssh_pwauth: True
|
||||
chpasswd: { expire: False }
|
||||
package_update: true
|
||||
packages:
|
||||
- qemu-guest-agent
|
||||
runcmd:
|
||||
- [ netplan, generate ]
|
||||
- [ netplan, apply ]
|
||||
- [ systemctl, enable, --now, qemu-guest-agent ]
|
85
main.tf
Normal file
85
main.tf
Normal file
|
@ -0,0 +1,85 @@
|
|||
data "template_file" "user_data" {
|
||||
count = length(var.domains)
|
||||
template = file("${path.module}/cloud_init.yml")
|
||||
vars = {
|
||||
login = "admin"
|
||||
ip = var.domains[count.index].ip
|
||||
}
|
||||
}
|
||||
|
||||
data "template_file" "network_config" {
|
||||
count = length(var.domains)
|
||||
template = file("${path.module}/network_config.yml")
|
||||
vars = {
|
||||
ip = var.domains[count.index].ip
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
resource "libvirt_pool" "pool" {
|
||||
name = "${var.prefix}pool"
|
||||
type = "dir"
|
||||
target {
|
||||
path = "${var.pool_path}/${var.prefix}pool"
|
||||
}
|
||||
}
|
||||
|
||||
resource "libvirt_volume" "image" {
|
||||
name = var.image.name
|
||||
format = "qcow2"
|
||||
pool = libvirt_pool.pool.name
|
||||
source = var.image.url
|
||||
}
|
||||
|
||||
resource "libvirt_volume" "root" {
|
||||
count = length(var.domains)
|
||||
name = "${var.prefix}${var.domains[count.index].name}-root.qcow2"
|
||||
pool = libvirt_pool.pool.name
|
||||
base_volume_id = libvirt_volume.image.id
|
||||
size = var.domains[count.index].disk
|
||||
format = "qcow2"
|
||||
}
|
||||
|
||||
# resource "libvirt_network" "br0" {
|
||||
# bridge = "br0"
|
||||
# name = "br0"
|
||||
# mode = "bridge"
|
||||
# autostart = true
|
||||
# }
|
||||
|
||||
resource "libvirt_cloudinit_disk" "commoninit" {
|
||||
count = length(var.domains)
|
||||
name = "commoninit-${var.domains[count.index].name}.iso"
|
||||
pool = libvirt_pool.pool.name
|
||||
user_data = data.template_file.user_data[count.index].rendered
|
||||
network_config = data.template_file.network_config[count.index].rendered
|
||||
}
|
||||
|
||||
resource "libvirt_domain" "vm" {
|
||||
count = length(var.domains)
|
||||
name = var.domains[count.index].name
|
||||
memory = var.domains[count.index].ram
|
||||
vcpu = var.domains[count.index].cpu
|
||||
machine = "q35"
|
||||
arch = "x86_64"
|
||||
|
||||
xml {
|
||||
xslt = file("/home/filimonov/t1/cdrom-model.xsl")
|
||||
}
|
||||
|
||||
cloudinit = libvirt_cloudinit_disk.commoninit[count.index].id
|
||||
|
||||
|
||||
cpu {
|
||||
mode = "custom"
|
||||
}
|
||||
|
||||
network_interface {
|
||||
network_name = "br0"
|
||||
}
|
||||
|
||||
disk {
|
||||
volume_id = libvirt_volume.root[count.index].id
|
||||
scsi = "true"
|
||||
}
|
||||
}
|
14
network_config.yml
Normal file
14
network_config.yml
Normal file
|
@ -0,0 +1,14 @@
|
|||
version: 2
|
||||
ethernets:
|
||||
enp1s0:
|
||||
link-local:
|
||||
- ipv4
|
||||
dhcp4: false
|
||||
addresses:
|
||||
- "${ip}/24"
|
||||
routes:
|
||||
- to: default
|
||||
via: 172.16.1.1
|
||||
nameservers:
|
||||
addresses:
|
||||
- 8.8.8.8
|
3
providers.tf
Normal file
3
providers.tf
Normal file
|
@ -0,0 +1,3 @@
|
|||
provider "libvirt" {
|
||||
uri = "qemu:///system"
|
||||
}
|
42
terraform.tfvars
Normal file
42
terraform.tfvars
Normal file
|
@ -0,0 +1,42 @@
|
|||
prefix = "vm-"
|
||||
|
||||
pool_path = "/opt/vm"
|
||||
|
||||
image = {
|
||||
name = "cloud"
|
||||
# url = "http://localhost/gold-ubuntu.qcow2"
|
||||
url = "http://localhost/ubuntu-24.04-server-cloudimg-amd64.img"
|
||||
format = "qcow2"
|
||||
}
|
||||
|
||||
vm = {
|
||||
bridge = "br0"
|
||||
cpu = 1
|
||||
disk = 10 * 1024 * 1024 * 1024
|
||||
ram = 512
|
||||
}
|
||||
|
||||
domains = [
|
||||
{
|
||||
name = "vm-node1"
|
||||
cpu = 1
|
||||
ram = 2048
|
||||
disk = 20 * 1024 * 1024 * 1024
|
||||
ip = "172.16.1.181"
|
||||
},
|
||||
{
|
||||
name = "vm-node2"
|
||||
cpu = 1
|
||||
ram = 2048
|
||||
disk = 20 * 1024 * 1024 * 1024
|
||||
ip = "172.16.1.182"
|
||||
},
|
||||
{
|
||||
name = "vm-master1"
|
||||
cpu = 1
|
||||
ram = 2048
|
||||
disk = 20 * 1024 * 1024 * 1024
|
||||
ip = "172.16.1.180"
|
||||
}
|
||||
|
||||
]
|
37
variables.tf
Normal file
37
variables.tf
Normal file
|
@ -0,0 +1,37 @@
|
|||
variable "prefix" {
|
||||
type = string
|
||||
default = "vm-"
|
||||
}
|
||||
|
||||
variable "pool_path" {
|
||||
type = string
|
||||
default = "/var/lib/libvirt/"
|
||||
}
|
||||
|
||||
variable "image" {
|
||||
type = object({
|
||||
name = string
|
||||
url = string
|
||||
format = string
|
||||
})
|
||||
}
|
||||
|
||||
variable "vm" {
|
||||
type = object({
|
||||
cpu = number
|
||||
ram = number
|
||||
disk = number
|
||||
bridge = string
|
||||
})
|
||||
}
|
||||
|
||||
variable "domains" {
|
||||
description = "List of VMs with specified parameters"
|
||||
type = list(object({
|
||||
name = string,
|
||||
cpu = number,
|
||||
ram = number,
|
||||
disk = number,
|
||||
ip = string
|
||||
}))
|
||||
}
|
9
versions.tf
Normal file
9
versions.tf
Normal file
|
@ -0,0 +1,9 @@
|
|||
terraform {
|
||||
required_version = ">= 0.13"
|
||||
required_providers {
|
||||
libvirt = {
|
||||
source = "dmacvicar/libvirt"
|
||||
version = "0.8.1"
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user