[global] feat: initial commit
This commit is contained in:
commit
e56e9ccd88
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
variables.pkrvars.hcl
|
41
readme.md
Normal file
41
readme.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# What does this stuff do?
|
||||||
|
Packer is a tool that can create Virtual Machine templates from code. This repository hosts the code for a customized templates used in Siempie's home environment using the Proxmox Hypervisor.
|
||||||
|
|
||||||
|
# Template
|
||||||
|
Inside the template packer does:
|
||||||
|
- Install updates
|
||||||
|
- Install tools; curl, qemu-guest agent, sudo and wget.
|
||||||
|
- Install Ansible user with private key
|
||||||
|
- Clean guest (machine-id, logs, apt cache, etc)
|
||||||
|
|
||||||
|
Other information to know:
|
||||||
|
- Template hostname: `localhost`
|
||||||
|
|
||||||
|
- packer username: `packer`
|
||||||
|
- packer password: `packer`
|
||||||
|
- Ubuntu 24 Template: VM ID 999
|
||||||
|
|
||||||
|
More info: https://developer.hashicorp.com/packer/docs/intro
|
||||||
|
|
||||||
|
| OS | VM Name | VM ID |
|
||||||
|
|----|---------|-------|
|
||||||
|
| Ubuntu 24 | ubuntu.template.siempie.internal | 999 |
|
||||||
|
|
||||||
|
# Install packer
|
||||||
|
Install packer on your system:
|
||||||
|
https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
Copy the `variables.pkrvars.hcl.example` file to `variables.pkrvars.hcl` and change the variables.
|
||||||
|
|
||||||
|
# Initialize the project and install the proxmox provider
|
||||||
|
```
|
||||||
|
packer init -var-file variables.pkrvars.hcl ubuntu24/packer.pkr.hcl
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
Ubuntu 24
|
||||||
|
```
|
||||||
|
packer build -force -var-file variables.pkrvars.hcl ubuntu24/packer.pkr.hcl
|
||||||
|
```
|
||||||
|
Note: the `-force` flag removes an already existing VM or Template with the same ID (999).
|
91
scripts/magic.sh
Normal file
91
scripts/magic.sh
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
# Update the guest operating system
|
||||||
|
echo '> Updating the guest operating system ...'
|
||||||
|
sudo -u root apt update
|
||||||
|
sudo -u root DEBIAN_FRONTEND=noninteractive apt -y upgrade
|
||||||
|
sudo -u root apt autoremove -y
|
||||||
|
|
||||||
|
# install rc.local script
|
||||||
|
cat << 'EOL' | sudo tee /etc/rc.local
|
||||||
|
#!/bin/sh -ef
|
||||||
|
#
|
||||||
|
test -f /etc/ssh/ssh_host_dsa_key || sudo -u root dpkg-reconfigure openssh-server
|
||||||
|
exit 0
|
||||||
|
EOL
|
||||||
|
sudo -u root chmod +x /etc/rc.local
|
||||||
|
|
||||||
|
# grow disk
|
||||||
|
echo '> grow disk ...'
|
||||||
|
sudo -u root lvresize --resizefs -l+100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
|
||||||
|
|
||||||
|
# cloud-init cleanup
|
||||||
|
while [ ! -f /var/lib/cloud/instance/boot-finished ]; do
|
||||||
|
echo '> Waiting for cloud-init...';
|
||||||
|
sleep 1;
|
||||||
|
done
|
||||||
|
sudo -u root rm -f /etc/cloud/cloud.cfg.d/99-installer.cfg
|
||||||
|
sudo -u root cloud-init clean
|
||||||
|
|
||||||
|
# cleaning logs
|
||||||
|
echo '> cleaning logs ...'
|
||||||
|
sudo -u root rm -rf /var/log/*
|
||||||
|
|
||||||
|
# cleans persistent udev rules
|
||||||
|
echo '> cleaning persistent udev rules ...'
|
||||||
|
if [ -f /etc/udev/rules.d/70-persistent-net.rules ]; then
|
||||||
|
sudo -u root rm /etc/udev/rules.d/70-persistent-net.rules
|
||||||
|
fi
|
||||||
|
|
||||||
|
# cleans /tmp directories
|
||||||
|
echo '> cleaning /tmp directories ...'
|
||||||
|
sudo -u root rm -rf /tmp/*
|
||||||
|
sudo -u root rm -rf /var/tmp/*
|
||||||
|
|
||||||
|
# cleans SSH keys
|
||||||
|
echo '> cleaning ssh host keys ...'
|
||||||
|
sudo -u root rm -f /etc/ssh/ssh_host_*
|
||||||
|
|
||||||
|
# sets hostname to localhost
|
||||||
|
echo '> setting hostname to localhost ...'
|
||||||
|
sudo -u root bash -c "cat /dev/null > /etc/hostname"
|
||||||
|
sudo -u root hostnamectl set-hostname localhost
|
||||||
|
|
||||||
|
# cleans apt.
|
||||||
|
echo '> cleaning apt-get ...'
|
||||||
|
sudo -u root apt clean
|
||||||
|
|
||||||
|
# cleans the machine-id
|
||||||
|
echo '> cleaning the machine-id ...'
|
||||||
|
sudo -u root truncate -s 0 /etc/machine-id
|
||||||
|
sudo -u root rm /var/lib/dbus/machine-id
|
||||||
|
sudo -u root ln -s /etc/machine-id /var/lib/dbus/machine-id
|
||||||
|
|
||||||
|
# cleans shell history
|
||||||
|
echo '> cleaning shell history ...'
|
||||||
|
unset HISTFILE
|
||||||
|
history -cw
|
||||||
|
echo > ~/.bash_history
|
||||||
|
sudo -u root rm -fr /root/.bash_history
|
||||||
|
|
||||||
|
# install the ansible user
|
||||||
|
echo '> create ansible user ...'
|
||||||
|
sudo -u root useradd -m ansible
|
||||||
|
|
||||||
|
# configure ansible user
|
||||||
|
sudo -u root mkdir -p /home/ansible/.ssh
|
||||||
|
sudo -u root bash -c "echo \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH9H3XK4IaK2pd8xegsbCm0at70kCi33vYkHDccV3Iyn\" >> /home/ansible/.ssh/authorized_keys"
|
||||||
|
sudo -u root chmod 700 /home/ansible/.ssh
|
||||||
|
sudo -u root chmod 600 /home/ansible/.ssh/authorized_keys
|
||||||
|
sudo -u root chown -R ansible:ansible /home/ansible
|
||||||
|
|
||||||
|
# configure sudo for ansible
|
||||||
|
sudo -u root bash -c "echo \"ansible ALL=(ALL) NOPASSWD: ALL\" >> /etc/sudoers.d/ansible"
|
||||||
|
|
||||||
|
# zero fill the disk
|
||||||
|
echo '> zero fill disk ...'
|
||||||
|
sudo -u root bash -c "cat /dev/zero > /zero.file | exit 0 && sync && rm -f /zero.file"
|
||||||
|
|
||||||
|
# all done
|
||||||
|
echo '> done.'
|
||||||
|
echo '> packer template build -- complete'
|
0
ubuntu24/http/meta-data
Normal file
0
ubuntu24/http/meta-data
Normal file
46
ubuntu24/http/user-data
Normal file
46
ubuntu24/http/user-data
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#cloud-config
|
||||||
|
autoinstall:
|
||||||
|
version: 1
|
||||||
|
locale: en_US
|
||||||
|
keyboard:
|
||||||
|
layout: us
|
||||||
|
storage:
|
||||||
|
layout:
|
||||||
|
name: lvm
|
||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
ethernets:
|
||||||
|
all-en:
|
||||||
|
dhcp4: true
|
||||||
|
match:
|
||||||
|
name: en*
|
||||||
|
all-eth:
|
||||||
|
dhcp4: true
|
||||||
|
match:
|
||||||
|
name: eth*
|
||||||
|
|
||||||
|
# packer user
|
||||||
|
identity:
|
||||||
|
hostname: packer
|
||||||
|
username: packer
|
||||||
|
password: "$6$WUe8MQLrLReDtp7S$cz5dzvQ8CZjL1.YvT7xMvyqC6DJ.vIkCJJHgkuRIS/LICSw.pqA0LgRh/rMUiv.UXZl.IMBIrDAhC.CzG.ASa1"
|
||||||
|
|
||||||
|
# enable ssh
|
||||||
|
ssh:
|
||||||
|
install-server: yes
|
||||||
|
allow-pw: yes
|
||||||
|
|
||||||
|
# create root account
|
||||||
|
user-data:
|
||||||
|
disable_root: false
|
||||||
|
|
||||||
|
# install qemu guest agent
|
||||||
|
packages:
|
||||||
|
- curl
|
||||||
|
- qemu-guest-agent
|
||||||
|
- sudo
|
||||||
|
- wget
|
||||||
|
|
||||||
|
# allow ubuntu user pwless sudo
|
||||||
|
late-commands:
|
||||||
|
- echo 'packer ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/packer
|
109
ubuntu24/packer.pkr.hcl
Normal file
109
ubuntu24/packer.pkr.hcl
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
packer {
|
||||||
|
required_plugins {
|
||||||
|
proxmox = {
|
||||||
|
version = ">=1.1.7"
|
||||||
|
source = "github.com/hashicorp/proxmox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_iso_pool" {
|
||||||
|
type = string
|
||||||
|
default = "cracky-fs-images:iso"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_node" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_password" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_storage_format" {
|
||||||
|
type = string
|
||||||
|
default = "raw"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_storage_pool" {
|
||||||
|
type = string
|
||||||
|
default = "cracky-fs"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_storage_pool_type" {
|
||||||
|
type = string
|
||||||
|
default = "rbd"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_url" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_username" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "template_description" {
|
||||||
|
type = string
|
||||||
|
default = "Ubuntu 24.04 Template"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "template_name" {
|
||||||
|
type = string
|
||||||
|
default = "template.test.siempie.internal"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ubuntu_image" {
|
||||||
|
type = string
|
||||||
|
default = "ubuntu-24.04-live-server-amd64.iso"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "version" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
source "proxmox-iso" "template" {
|
||||||
|
boot_command = ["c", "linux /casper/vmlinuz -- autoinstall ds='nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/'", "<enter><wait><wait>", "initrd /casper/initrd", "<enter><wait><wait>", "boot<enter>"]
|
||||||
|
boot_wait = "10s"
|
||||||
|
cores = "2"
|
||||||
|
disks {
|
||||||
|
disk_size = "20G"
|
||||||
|
format = "${var.proxmox_storage_format}"
|
||||||
|
storage_pool = "${var.proxmox_storage_pool}"
|
||||||
|
type = "virtio"
|
||||||
|
}
|
||||||
|
http_directory = "ubuntu24/http"
|
||||||
|
insecure_skip_tls_verify = true
|
||||||
|
iso_file = "${var.proxmox_iso_pool}/${var.ubuntu_image}"
|
||||||
|
memory = "2048"
|
||||||
|
network_adapters {
|
||||||
|
bridge = "vmbr0"
|
||||||
|
}
|
||||||
|
node = "${var.proxmox_node}"
|
||||||
|
vm_id = "999"
|
||||||
|
tags = "mgmt"
|
||||||
|
os = "l26"
|
||||||
|
password = "${var.proxmox_password}"
|
||||||
|
proxmox_url = "${var.proxmox_url}"
|
||||||
|
scsi_controller = "virtio-scsi-single"
|
||||||
|
ssh_port = 22
|
||||||
|
ssh_timeout = "10m"
|
||||||
|
ssh_username = "${var.template_username}"
|
||||||
|
ssh_password = "${var.template_password}"
|
||||||
|
template_description = "${var.template_description}"
|
||||||
|
template_name = "${var.template_name}"
|
||||||
|
unmount_iso = true
|
||||||
|
username = "${var.proxmox_username}"
|
||||||
|
}
|
||||||
|
|
||||||
|
build {
|
||||||
|
sources = ["source.proxmox-iso.template"]
|
||||||
|
provisioner "shell" {
|
||||||
|
script = "scripts/magic.sh"
|
||||||
|
}
|
||||||
|
}
|
7
variables.pkrvars.hcl.example
Normal file
7
variables.pkrvars.hcl.example
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
proxmox_node = "pve0"
|
||||||
|
proxmox_url = "https://pve0:8006/api2/json"
|
||||||
|
proxmox_storage_pool = "local-lvm"
|
||||||
|
proxmox_username = "packer@pve"
|
||||||
|
proxmox_password = "super-secure"
|
||||||
|
template_username = "packer"
|
||||||
|
template_password = "packer"
|
Loading…
Reference in New Issue
Block a user