Compare commits
35 Commits
ee39606831
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| 9b20cd9adb | |||
| b4afbc05d0 | |||
| 9748468415 | |||
| 96071811de | |||
| 658a104a6f | |||
| 38e1a94306 | |||
| febd3b76d3 | |||
| aaa3fd5b32 | |||
| 41574c143a | |||
| 5cce3a0337 | |||
| c75eae71b2 | |||
| 9f61021a86 | |||
| 2ee8bdf9cc | |||
| 854393f4de | |||
| a025a70f72 | |||
| 4f12846b60 | |||
| e0ba8a28f3 | |||
| 9ff68afe74 | |||
| 43dd2a0ed0 | |||
| d37d70fcef | |||
| d731aa3814 | |||
| 732d0a4ee8 | |||
| 8cd2eb5a05 | |||
| 03b533f8b1 | |||
| 7dd6a29b08 | |||
| d1367ae99d | |||
| 3cbde1469a | |||
| 9b8d0b5a35 | |||
| d7a5596068 | |||
| c6c3bb3fe9 | |||
| f658307bf4 | |||
| c9e5b68eba | |||
| c0115efbc2 | |||
| b99db7713c | |||
| e2c3ec0f13 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
*.img
|
||||
*.qcow2
|
||||
./openbsd-cloud-image
|
||||
202
README.md
202
README.md
@ -1,19 +1,81 @@
|
||||
# kvm-cloudimage
|
||||
Use cloud images on baremetal using libvirt/kvm
|
||||
|
||||
Use cloud images on bare metal with libvirt/KVM.
|
||||
|
||||
Currently, the following base operating systems are supported for guest VMs:
|
||||
- Debian 12
|
||||
- Ubuntu 20.04
|
||||
- Ubuntu 22.04
|
||||
- FreeBSD 14.3 with UFS filesystem
|
||||
- FreeBSD 14.2 with ZFS filesystem
|
||||
- OpenBSD 7.7
|
||||
|
||||
## Pre-requisites
|
||||
- openssh
|
||||
- mkpass (whois)
|
||||
- arp
|
||||
|
||||
## Links
|
||||
The following tools must be installed on the host system:
|
||||
* `openssh`
|
||||
* `arp`
|
||||
* `wget`
|
||||
* `curl`
|
||||
* `libvirt`
|
||||
|
||||
To create OpenBSD images, you will also need:
|
||||
|
||||
* `python3`
|
||||
* `sudo`
|
||||
* `signify` (Debian: `signify-openbsd` and `signify-openbsd-keys`)
|
||||
* `qemu-system-x86_64`
|
||||
|
||||
## Links and credits
|
||||
Livbirt host installation
|
||||
- [Debian guide](https://wiki.debian.org/KVM)
|
||||
- [Ubuntu guide](https://documentation.ubuntu.com/server/how-to/virtualisation/libvirt/)
|
||||
- [Fedora guide](https://docs.fedoraproject.org/en-US/quick-docs/virtualization-getting-started/)
|
||||
|
||||
Inspirational sites for the project
|
||||
- [https://blog.programster.org/create-debian-12-kvm-guest-from-cloud-image](https://blog.programster.org/create-debian-12-kvm-guest-from-cloud-image)
|
||||
- [https://earlruby.org/2023/02/quickly-create-guest-vms-using-virsh-cloud-image-files-and-cloud-init/](https://earlruby.org/2023/02/quickly-create-guest-vms-using-virsh-cloud-image-files-and-cloud-init/)
|
||||
- [https://sumit-ghosh.com/posts/create-vm-using-libvirt-cloud-images-cloud-init/)](https://sumit-ghosh.com/posts/create-vm-using-libvirt-cloud-images-cloud-init/)
|
||||
|
||||
## Preparing host
|
||||
For OpenBSD images with cloud-init support, this project uses: [hcartiaux's openbsd-cloud-image](https://github.com/hcartiaux/openbsd-cloud-image.git)
|
||||
|
||||
### Create bridge network
|
||||
## Preparing the Host
|
||||
|
||||
1. Configure the [variables](env_scripts/common.sh) file (`env_scripts/common.sh`).
|
||||
It is recommended to place this directory in your home folder to avoid libvirt permission issues.
|
||||
|
||||
2. Run the installation script: `install.sh`
|
||||
|
||||
## Networking
|
||||
|
||||
Two networks are installed when you run `install.sh`:
|
||||
|
||||
| Name | Type |DCHP Range |Default route |Host device |
|
||||
| ----- | -------- |-------------|----------------|--------------|
|
||||
| vmnetwork | NAT |192.168.100.100 - 254| 192.168.100.1| virb1|
|
||||
| host-only | Isolated Network |-|-| -|
|
||||
|
||||
**Table 1:** Default Available Networks
|
||||
|
||||
You can network names changing on [env_scripts/common.sh](env_scripts/common.sh)
|
||||
```
|
||||
VM_NETWORK_HOSTONLY="host-only"
|
||||
VM_USERNAME="user"
|
||||
```
|
||||
|
||||
You can create a VM with isolated network but an extra interface with NAT network if added, because when guest is initialized, it get updated and some packages are installed (dependend on linux-user-metadata). You can delete NAT interface after VM guest is initialized.
|
||||
|
||||
### AppArmor exception (if needed)
|
||||
|
||||
If AppArmor is blocking libvirtd, disable the profile temporarily:
|
||||
|
||||
```shell
|
||||
ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
|
||||
apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
|
||||
```
|
||||
|
||||
|
||||
<!-- ### Create bridge network
|
||||
|
||||
```shell
|
||||
sudo virsh --connect qemu:///session net-define /dev/stdin << EOF
|
||||
@ -23,63 +85,62 @@ sudo virsh --connect qemu:///session net-define /dev/stdin << EOF
|
||||
<bridge name='brbackend' />
|
||||
</network>
|
||||
EOF
|
||||
```
|
||||
|
||||
#### AppArmor exception
|
||||
|
||||
``` -->
|
||||
## Command Usage
|
||||
### Command help
|
||||
```shell
|
||||
ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
|
||||
apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
|
||||
NAME
|
||||
./vm_manage.sh
|
||||
|
||||
USAGE
|
||||
Usage: ./vm_manage.sh create -n NAME [-b BRIDGE] [-r RAM] [-c VCPUS] [-s DISK] [-v]
|
||||
./vm_manage.sh delete NAME
|
||||
./vm_manage.sh info NAME
|
||||
./vm_manage.sh connect NAME
|
||||
./vm_manage.sh install NAME
|
||||
./vm_manage.sh list
|
||||
|
||||
ACTIONS
|
||||
create Create a new virtual machine
|
||||
delete Delete a virtual machine
|
||||
list List all defined virtual machines
|
||||
info Show information about a virtual machine
|
||||
connect Connect to the console of a virtual machine
|
||||
install Install specific software into an existing VM
|
||||
|
||||
OPTIONS
|
||||
-h Show this help message
|
||||
-n NAME Host name (required)
|
||||
-b BRIDGE Bridge interface name
|
||||
-r RAM RAM in MB (default: 1024)
|
||||
-c VCPUS Number of VCPUs (default: 1)
|
||||
-s DISK Disk size in GB (default: 10)
|
||||
-v Verbose mode
|
||||
|
||||
AUTHOR
|
||||
Victor Gracia Enguita <victor@burufalla.ovh>
|
||||
|
||||
COPYRIGHT
|
||||
This is free software; see the source for copying conditions.
|
||||
```
|
||||
|
||||
## Creating VMs
|
||||
### Usage
|
||||
### Create VM
|
||||
Using default values:
|
||||
```shell
|
||||
usage: ./vm_create.sh options
|
||||
|
||||
Quickly create guest VMs using cloud image files and cloud-init.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-n Host name (required)
|
||||
-b bridge interface name (bridge network is used)
|
||||
-r RAM in MB (defaults to 2048)
|
||||
-c Number of VCPUs (defaults to 2)
|
||||
-s Amount of storage to allocate in GB (defaults to 20)
|
||||
-v Verbose
|
||||
./vm_manage.sh create -ntestMachine
|
||||
```
|
||||
__Note__: Default values can be customized in the [env_scripts/common.sh](env_scripts/common.sh) file.
|
||||
|
||||
The only required parameter is the hostname, but you can also set RAM size (in MB), number of VCPUs or storage size (in GB), if these parameters are not set, default values will used:
|
||||
- RAM: 20248MB
|
||||
- VCPUs: 2
|
||||
- DISK: 20GB
|
||||
|
||||
Actually, you can select these base OS for Guests
|
||||
- Debian 12
|
||||
- Ubuntu 20.04
|
||||
- Ubuntu 22.04
|
||||
- FreeBSD 14.1
|
||||
|
||||
### Examples
|
||||
With custom specifications:
|
||||
```shell
|
||||
./vm_create.sh -ntestMachine
|
||||
./vm_manage.sh create -ntestMachine -r4098 -c4 -s100
|
||||
```
|
||||
A VM will ve created with default values
|
||||
|
||||
```shell
|
||||
./vm_create.sh -ntestMachine -r4098 -c4 -s100
|
||||
```
|
||||
A VM will be created with 4098 MB of RAM, 4 vCPUs and 100Gb of storage
|
||||
|
||||
#### FreeBSD VMs
|
||||
|
||||
__Please note that FreeBSD-based VMs do not currently support cloud-init, so once they are created, you need to connect to the machine through the console (using virt-manager or virs-console) and use the root user (without a password). Once inside, you add a password to root and I recommend that you add a non-root user and that the ssh connection is through that user.
|
||||
|
||||
Also note that since there is no cloud-init support, you will have to manually copy the generated ssh keys to the machine. I apologize for the inconvenience but I have not yet been able to make it work any other way.__
|
||||
This creates a VM with 4096 MB of RAM, 4 vCPUs, and 100 GB of disk space.
|
||||
|
||||
## List VMs
|
||||
```shell
|
||||
./vm_list.sh
|
||||
./vm_manage.sh list
|
||||
Id Nombre Estado
|
||||
-------------------------------
|
||||
7 debianTest ejecutando
|
||||
@ -87,14 +148,13 @@ Also note that since there is no cloud-init support, you will have to manually c
|
||||
```
|
||||
## Connect to an VM
|
||||
```shell
|
||||
./vm_connect.sh debianTest
|
||||
./vm_manage.sh connect debianTest
|
||||
```
|
||||
|
||||
## Get ip of VM
|
||||
|
||||
Use as parameter machine name
|
||||
```shell
|
||||
./vm_get_ip.sh ubuntuTest
|
||||
./vm_manage.sh info ubuntuTest
|
||||
192.168.122.234
|
||||
```
|
||||
|
||||
@ -102,7 +162,7 @@ Use as parameter machine name
|
||||
|
||||
Use as parameter machine name
|
||||
```shell
|
||||
./vm_delete.sh ubuntuTest
|
||||
./vm_dmanage.sh delete ubuntuTest
|
||||
Are you sure you want to remove the VM 'ubuntuTest' (y/N)? y
|
||||
Domain 'ubuntuTest' destroyed
|
||||
|
||||
@ -110,6 +170,34 @@ Domain 'ubuntuTest' has been undefined
|
||||
|
||||
VM 'ubuntuTest' removed successfully.
|
||||
```
|
||||
## Install software on VM
|
||||
|
||||
|
||||
`./vm_manage.sh install VM_NAME`
|
||||
|
||||
Example:
|
||||
|
||||
```shell
|
||||
./vm_manage.sh install Debian
|
||||
Select software to install:
|
||||
--------------
|
||||
1. Docker
|
||||
2. Podman
|
||||
3. Gitlab CE
|
||||
4. Gitlab Runner
|
||||
Enter your choice [1-4]:
|
||||
```
|
||||
|
||||
## TODO
|
||||
|
||||
- FreeBSD support is still in progress
|
||||
- Maybe add more BSD flavours guests support
|
||||
- add non debian linux derivatives guests support
|
||||
<!-- ./vm_create.sh: línea 52: mkpasswd: orden no encontrada
|
||||
./vm_create.sh: línea 259: virt-install: orden no encontrada
|
||||
./vm_create.sh: línea 261: virsh: orden no encontrada
|
||||
qemu-img wget curl arp
|
||||
sudo apt install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system whois virtinst net-tools
|
||||
sudo chmod 750 /home/victor
|
||||
sudo usermod -a -G libvirt $(whoami)
|
||||
sudo usermod --append --groups earl libvirt-qemu -->
|
||||
|
||||
|
||||
22
env_scripts/common.sh
Normal file
22
env_scripts/common.sh
Normal file
@ -0,0 +1,22 @@
|
||||
#!/bin/env bash
|
||||
DISTRO=""
|
||||
|
||||
#VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/.local/share/libvirt"}
|
||||
#VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/var/lib/libvirt"}
|
||||
VM_BASE_DIR="${HOME}/vms"
|
||||
VM_BASE_IMAGES="base"
|
||||
VM_DISK_EXTENSION="img"
|
||||
VM_NETWORK_NAT="vmnetwork"
|
||||
VM_NETWORK_HOSTONLY="host-only"
|
||||
VM_NETWORK_TYPE="nat"
|
||||
VM_USERNAME="user"
|
||||
VM_SOFT="";
|
||||
VM_IMAGE_PATH="${VM_BASE_DIR}/images/$1.img"
|
||||
CI_IMAGE_PATH="${VM_BASE_DIR}/images/$1-cidata.iso"
|
||||
LIBVIRT_NET_MODEL="virtio"
|
||||
LIBVIRT_NET_OPTION="network=${VM_NETWORK_NAT},model=${LIBVIRT_NET_MODEL}"
|
||||
OS_JSON_FILE="files/os_options.json"
|
||||
OS_JSON_FILE_INSTALL="files/software.json"
|
||||
|
||||
# REPO_BRANCH="main"
|
||||
# REPO_SOURCE="https://raw.githubusercontent.com/vgenguita/kvm-cloudimage/refs/heads/${REPO_BRANCH}/env_scripts/"
|
||||
666
env_scripts/functions.sh
Normal file
666
env_scripts/functions.sh
Normal file
@ -0,0 +1,666 @@
|
||||
#!/usr/bin/env -S bash
|
||||
|
||||
# Functions
|
||||
pause()
|
||||
{
|
||||
read -s -n 1 -p "Press any key to continue . . ."
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Printe messages
|
||||
print_info() {
|
||||
echo -e "\e[1;34m[INFO]\e[0m $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "\e[1;32m[OK]\e[0m $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "\e[1;31m[ERROR]\e[0m $1"
|
||||
}
|
||||
|
||||
# Detectar distribución
|
||||
detect_distro()
|
||||
{
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
DISTRO=$ID
|
||||
# elif [ -f /etc/centos-release ] || [ -f /etc/fedora-release ]; then
|
||||
# if grep -q "Fedora" /etc/fedora-release; then
|
||||
# DISTRO="fedora"
|
||||
# else
|
||||
# DISTRO="centos"
|
||||
# fi
|
||||
else
|
||||
print_error "No se pudo detectar la distribución."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
install_debian_ubuntu() {
|
||||
print_info "Updating packages..."
|
||||
sudo apt update || { print_error "Error updating packages."; exit 1; }
|
||||
|
||||
print_info "Installing libvirt"
|
||||
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils|| {
|
||||
print_error "Error installing packages."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Habilitar e iniciar el servicio
|
||||
sudo systemctl enable libvirtd || sudo systemctl enable libvirt-bin
|
||||
sudo systemctl start libvirtd || sudo systemctl start libvirt-bin
|
||||
}
|
||||
|
||||
install_arch() {
|
||||
print_info "Updating packages..."
|
||||
sudo pacman -Syu --noconfirm || { print_error "Error updating packages."; exit 1; }
|
||||
|
||||
print_info "Installing libvirt."
|
||||
sudo pacman -S --noconfirm qemu libvirt virt-manager dnsmasq iptables bridge-utils|| {
|
||||
print_error "Error installing packages."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
install_fedora() {
|
||||
print_info "Updating packages..."
|
||||
sudo dnf upgrade -y|| { print_error "Error updating packages."; exit 1; }
|
||||
|
||||
print_info "Installing libvirt."
|
||||
sudo sudo dnf install -y @virtualization qemu libvirt bridge-utils|| {
|
||||
print_error "Error installing packages."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
check_host_os()
|
||||
{
|
||||
local HOST_OS=$(cat /etc/os-release | grep -v VERSION_ID |grep "ID=" | awk -F'=' '{print $2}')
|
||||
if [ $HOST_OS == "debian" ]; then
|
||||
source env_scripts/older_os.sh
|
||||
else
|
||||
source env_scripts/newer_os.sh
|
||||
fi
|
||||
}
|
||||
|
||||
chown_image_permissions(){
|
||||
if [[ "${DISTRO}" == "fedora" ]]; then
|
||||
USER_GROUP="$USER:qemu"
|
||||
else
|
||||
USER_GROUP="$USER:libvirt-qemu"
|
||||
fi
|
||||
}
|
||||
|
||||
generate_openbsd_image()
|
||||
{
|
||||
local CURRENT_PATH="$PWD"
|
||||
VM_BASE_IMAGE_NAME=${VM_BASE_IMAGE%%.*}
|
||||
VM_BASE_IMAGE_EXTENSION=${VM_BASE_IMAGE#*.}
|
||||
git clone https://github.com/hcartiaux/openbsd-cloud-image.git
|
||||
cd openbsd-cloud-image
|
||||
./build_openbsd_qcow2.sh \
|
||||
--image-file ${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION} \
|
||||
--disklabel custom/disklabel.cloud \
|
||||
--size ${VM_DISK_SIZE} \
|
||||
-b
|
||||
if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}"; then
|
||||
mv images/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
|
||||
sudo chown -R ${USER_GROUP} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
|
||||
cd ${CURRENT_PATH}
|
||||
rm -r openbsd-cloud-image
|
||||
else
|
||||
echo "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION} already exists. Delete VM with "delete" option"
|
||||
cd ${CURRENT_PATH}
|
||||
rm -r openbsd-cloud-image
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
show_vm_menu() {
|
||||
# Display dynamic OS selection menu
|
||||
echo "Select VM OS:"
|
||||
echo "--------------"
|
||||
|
||||
# Array to store valid IDs for validation
|
||||
VALID_IDS=()
|
||||
while IFS= read -r entry; do
|
||||
DECODED=$(echo "$entry" | base64 --decode)
|
||||
ID=$(echo "$DECODED" | jq -r '.id')
|
||||
NAME=$(echo "$DECODED" | jq -r '.name')
|
||||
printf "%2s. %s\n" "$ID" "$NAME"
|
||||
VALID_IDS+=("$ID")
|
||||
done < <(jq -r '.os_variants[] | @base64' "$OS_JSON_FILE")
|
||||
|
||||
# Calculate max ID for range validation
|
||||
ID_MAX=$(jq -r '[.os_variants[].id] | max' "$OS_JSON_FILE")
|
||||
ID_MIN=$(jq -r '[.os_variants[].id] | min' "$OS_JSON_FILE")
|
||||
|
||||
# Read user input
|
||||
read -r -p "Enter your choice [${ID_MIN}-${ID_MAX}]: " CHOICE
|
||||
|
||||
# Validate input: must be a number and within range
|
||||
if ! [[ "$CHOICE" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: Please enter a valid number." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if (( CHOICE < ID_MIN || CHOICE > ID_MAX )); then
|
||||
echo "Error: Please enter a number between ${ID_MIN} and ${ID_MAX}." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get selected OS variant
|
||||
SELECTED=$(jq -r ".os_variants[] | select(.id == ${CHOICE})" "$OS_JSON_FILE")
|
||||
|
||||
if [ -z "$SELECTED" ]; then
|
||||
echo "Error: Invalid selection." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Export variables in uppercase
|
||||
VM_OS_VARIANT=$(echo "$SELECTED" | jq -r '.variant')
|
||||
VM_OS_TYPE=$(echo "$SELECTED" | jq -r '.os_type')
|
||||
VM_BASE_IMAGE_URL=$(echo "$SELECTED" | jq -r '.url')
|
||||
VM_BASE_IMAGE=$(echo "$SELECTED" | jq -r '.origin_image_name')
|
||||
VM_BOOT_TYPE=$(echo "$SELECTED" | jq -r '.boot_type')
|
||||
VM_CHECKSUMS_URL=$(echo "$SELECTED" | jq -r '.md5sum')
|
||||
|
||||
# Optional: Debug
|
||||
# echo "Selected OS variant: ${VM_OS_VARIANT}"
|
||||
}
|
||||
compare_checksum()
|
||||
{
|
||||
CHECKSUM_TMP_FOLDER=$(mktemp)
|
||||
curl -L -o "${CHECKSUM_TMP_FOLDER}" \
|
||||
"${VM_CHECKSUMS_URL}"
|
||||
# wget --recursive \
|
||||
# --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
|
||||
# -O "${CHECKSUM_TMP_FOLDER}" \
|
||||
# "${VM_CHECKSUMS_URL}"
|
||||
|
||||
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
if [[ "${VM_BASE_IMAGE}" == *"zfs"* ]]; then
|
||||
VM_BASE_IMAGE_CHECKSUM=$(grep "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT" "${CHECKSUM_TMP_FOLDER}" | grep "zfs.qcow2.xz" | awk '{print $4}')
|
||||
else
|
||||
VM_BASE_IMAGE_CHECKSUM=$(grep "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT" "${CHECKSUM_TMP_FOLDER}" | grep "ufs.qcow2.xz" | awk '{print $4}')
|
||||
fi
|
||||
else
|
||||
#Fedora things
|
||||
if [[ "${VM_OS_VARIANT}" == "fedora41" ]]; then
|
||||
VM_BASE_IMAGE_CHECKSUM=$(grep "${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}" "${CHECKSUM_TMP_FOLDER}" | grep -v \# | awk '{print $4}')
|
||||
else
|
||||
VM_BASE_IMAGE_CHECKSUM=$(grep "${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}" "${CHECKSUM_TMP_FOLDER}" | awk '{print $1}')
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "${VM_CHECKSUMS_URL}" == *"SHA256"* || "${VM_CHECKSUMS_URL}" == *"sha256"* ]]; then
|
||||
HASH_CMD="sha256sum"
|
||||
elif [[ "${VM_CHECKSUMS_URL}" == *"SHA512"* ]]; then
|
||||
HASH_CMD="sha512sum"
|
||||
#Fedora things
|
||||
else
|
||||
if grep -qi "SHA256" "${CHECKSUM_TMP_FOLDER}"; then
|
||||
HASH_CMD="sha256sum"
|
||||
elif grep -qi "SHA512" "${CHECKSUM_TMP_FOLDER}"; then
|
||||
HASH_CMD="sha512sum"
|
||||
else
|
||||
echo "ERROR: Cannot determinate checksum type on ${CHECKSUM_TMP_FOLDER}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
BASE_FILE_CHECKSUM=$(${HASH_CMD} ${VM_BASE_IMAGE_LOCATION} | awk '{print $1}')
|
||||
if [ "${BASE_FILE_CHECKSUM}" = "${VM_BASE_IMAGE_CHECKSUM}" ]; then
|
||||
echo "Checksum OK: ${BASE_FILE_CHECKSUM}"
|
||||
else
|
||||
echo "ERROR: MD5 checksum does NOT match!"
|
||||
echo "Expected: ${VM_BASE_IMAGE_CHECKSUM}"
|
||||
echo "Got: ${BASE_FILE_CHECKSUM}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
## List Installed VMS
|
||||
vm_list()
|
||||
{
|
||||
virsh list
|
||||
}
|
||||
|
||||
vm_net_get_mac()
|
||||
{
|
||||
local VM=$1
|
||||
MAC_VM=$(virsh domiflist "${VM}" | grep "${VM_NETWORK_NAT}"| awk '{ print $5 }' | tail -2 | head -1)
|
||||
echo $MAC_VM
|
||||
}
|
||||
## Get VM ip (only on NAT)
|
||||
vm_net_get_ip()
|
||||
{
|
||||
local VM="$1"
|
||||
# Obtener la dirección MAC de la interfaz de red
|
||||
MAC_VM=$(vm_net_get_mac $VM)
|
||||
if [[ -z "$MAC_VM" ]]; then
|
||||
echo "Error: The MAC address could not be found for '$VM'"
|
||||
return 1
|
||||
fi
|
||||
# Obtener la dirección IP a partir de la dirección MAC
|
||||
VM_IP_ADDRESS=$(arp -a | grep "$MAC_VM" | awk '{ print $2 }' | sed 's/[()]//g')
|
||||
if [[ -z "$VM_IP_ADDRESS" ]]; then
|
||||
echo "Error: Could not find IP address for MAC address '$MAC_VM'"
|
||||
return 1
|
||||
fi
|
||||
echo "$VM_IP_ADDRESS"
|
||||
}
|
||||
|
||||
vm_net_create_netplan()
|
||||
{
|
||||
local VM=$1
|
||||
local MAV_VM=$2
|
||||
cat <<EOF > "$VM_BASE_DIR/init/${VM}-netplan"
|
||||
# This file is generated from information provided by the datasource. Changes
|
||||
# to it will not persist across an instance reboot. To disable cloud-init's
|
||||
# network configuration capabilities, write a file
|
||||
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
|
||||
# network: {config: disabled}
|
||||
network:
|
||||
ethernets:
|
||||
enp1s0:
|
||||
addresses:
|
||||
- ${IP}/24
|
||||
nameservers:
|
||||
addresses:
|
||||
- 208.67.222.222
|
||||
- 208.67.220.220
|
||||
match:
|
||||
macaddress: ${MAC_VM}
|
||||
set-name: enp1s0
|
||||
version: 2
|
||||
EOF
|
||||
}
|
||||
|
||||
vm_net_bridge_set_ip()
|
||||
{
|
||||
local VM="$1"
|
||||
local IP="$2"
|
||||
MAC_VM=$(vm_net_get_mac "$VM")
|
||||
CURRENT_IP=$(vm_net_get_ip "$VM")
|
||||
define_netplan
|
||||
# Obtener la dirección IP de la máquina virtual
|
||||
scp -i ${VM_BASE_DIR}/ssh/${VM} \
|
||||
-r $VM_BASE_DIR/init/${VM}-netplan \
|
||||
${VM_USERNAME}@${CURRENT_IP}:50-cloud-init.yaml
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${CURRENT_IP} "bash -s" -- < ../vm_example_scripts/apply_netplan.sh
|
||||
}
|
||||
|
||||
vm_net_set_network_type()
|
||||
{
|
||||
if [[ "${VM_NETWORK_TYPE}" == "bridge" ]]; then
|
||||
LIBVIRT_NET_OPTION="model=virtio,bridge=${VM_BRIDGE_INT}"
|
||||
fi
|
||||
}
|
||||
## Connect to an existent VM using ssh
|
||||
vm_connect()
|
||||
{
|
||||
local VM=$1
|
||||
local VM_IP=$(vm_net_get_ip "$VM")
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${VM_IP}
|
||||
}
|
||||
|
||||
## Delete VM
|
||||
vm_delete ()
|
||||
{
|
||||
local VM=$1
|
||||
if [[ -f "$VM_IMAGE_PATH" ]]; then
|
||||
# Safely remove the VM with confirmation
|
||||
read -p "Are you sure you want to remove the VM '$VM' (y/N)? " confirm
|
||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||||
# Attempt to stop the VM before deleting
|
||||
virsh destroy "$VM" 2>/dev/null || true
|
||||
# Delete VM definition and associated images
|
||||
virsh undefine "$VM" 2>/dev/null || true
|
||||
rm -fv "$VM_IMAGE_PATH" "$CI_IMAGE_PATH"
|
||||
rm ${VM_BASE_DIR}/xml/$1.xml
|
||||
rm ${VM_BASE_DIR}/ssh/$1
|
||||
rm ${VM_BASE_DIR}/ssh/$1.pub
|
||||
rm ${VM_BASE_DIR}/init/$1-user-data
|
||||
rm ${VM_BASE_DIR}/init/$1-meta-data
|
||||
else
|
||||
echo "VM removal cancelled."
|
||||
fi
|
||||
else
|
||||
# Handle case where VM image is not found
|
||||
echo "Cannot find VM image file '$VM_IMAGE_PATH'. No action taken."
|
||||
fi
|
||||
}
|
||||
vm_download_base_image()
|
||||
{
|
||||
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
if [[ "${VM_BASE_IMAGE}" == *"zfs"* ]]; then
|
||||
VM_BASE_IMAGE_NAME="${VM_OS_VARIANT}-zfs"
|
||||
else
|
||||
VM_BASE_IMAGE_NAME="${VM_OS_VARIANT}-ufs"
|
||||
fi
|
||||
VM_BASE_IMAGE_EXTENSION="qcow2.xz"
|
||||
else
|
||||
VM_BASE_IMAGE_NAME=${VM_BASE_IMAGE%%.*}
|
||||
VM_BASE_IMAGE_EXTENSION=${VM_BASE_IMAGE#*.}
|
||||
fi
|
||||
VM_BASE_IMAGE_LOCATION="${VM_BASE_DIR}/${VM_BASE_IMAGES}/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}"
|
||||
if ! test -f "${VM_BASE_IMAGE_LOCATION}"; then
|
||||
# wget \
|
||||
# --user-agent="Mozilla/5.0 (X11; Linux x86_64)" \
|
||||
# -O "${VM_BASE_IMAGE_LOCATION}" \
|
||||
# ${VM_BASE_IMAGE_URL}
|
||||
|
||||
curl -L ${VM_BASE_IMAGE_URL} \
|
||||
-o ${VM_BASE_IMAGE_LOCATION} \
|
||||
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
vm_create_guest_image()
|
||||
{
|
||||
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.qcow"; then
|
||||
xz -d ${VM_BASE_IMAGE_LOCATION}
|
||||
fi
|
||||
VM_BASE_IMAGE_EXTENSION="qcow2"
|
||||
VM_BASE_IMAGE_LOCATION="${VM_BASE_DIR}/${VM_BASE_IMAGES}/${VM_BASE_IMAGE_NAME}.${VM_BASE_IMAGE_EXTENSION}"
|
||||
fi
|
||||
if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}"; then
|
||||
qemu-img convert \
|
||||
-O qcow2 \
|
||||
"${VM_BASE_IMAGE_LOCATION}" \
|
||||
"${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}"
|
||||
qemu-img resize \
|
||||
"${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}" \
|
||||
"${VM_DISK_SIZE}G"
|
||||
sudo chown -R ${USER_GROUP} ${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION}
|
||||
else
|
||||
echo "${VM_BASE_DIR}/images/${VM_HOSTNAME}.${VM_DISK_EXTENSION} already exists. Delete VM with "delete" option"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
vm_generate_ssh_hey()
|
||||
{
|
||||
ssh-keygen -t rsa -b 4096 -N '' -f "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}"
|
||||
chmod 600 ${VM_BASE_DIR}/ssh/${VM_HOSTNAME}.pub
|
||||
SSH_PUB_KEY=$(cat "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}.pub")
|
||||
#ssh-keygen -y -f "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}" > "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt
|
||||
#SSH_PUB_KEY=$(cat "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt)
|
||||
#rm "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt
|
||||
}
|
||||
|
||||
# vm_gen_user_data()
|
||||
# {
|
||||
# VM_USER_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 8; echo)
|
||||
# VM_USER_PASS_HASH=$(mkpasswd --method=SHA-512 --rounds=4096 ${VM_USER_PASS})
|
||||
# #FREEBSD GUEST
|
||||
# if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
# VM_ROOT_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 8; echo)
|
||||
# VM_ROOT_PASS_HASH=$(mkpasswd --method=SHA-512 --rounds=4096 ${VM_ROOT_PASS})
|
||||
# cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
# #cloud-config
|
||||
# hostname: ${VM_HOSTNAME}
|
||||
# package_reboot_if_required: true
|
||||
# package_update: true
|
||||
# package_upgrade: true
|
||||
# packages:
|
||||
# - sudo
|
||||
# - vim
|
||||
# ssh_pwauth: false
|
||||
# users:
|
||||
# - name: root
|
||||
# lock_passwd: false
|
||||
# hashed_passwd: ${VM_ROOT_PASS_HASH}
|
||||
# - name: ${VM_USERNAME}
|
||||
# ssh_authorized_keys:
|
||||
# - ${SSH_PUB_KEY}
|
||||
# lock_passwd: true
|
||||
# groups: wheel
|
||||
# shell: /bin/tcsh
|
||||
|
||||
# write_files:
|
||||
# - path: /usr/local/etc/sudoers
|
||||
# content: |
|
||||
# %wheel ALL=(ALL) NOPASSWD: ALL
|
||||
# append: true
|
||||
# EOF
|
||||
# #OPENBSD
|
||||
# elif [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then
|
||||
# #"disable_root": true
|
||||
# cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
# #cloud-config
|
||||
# "hostname": ${VM_HOSTNAME}
|
||||
# "package_upgrade": true
|
||||
# "packages":
|
||||
# - "bash"
|
||||
# - "vim--no_x11"
|
||||
# "ssh_pwauth": false
|
||||
# "users":
|
||||
# - "name": ${VM_USERNAME}
|
||||
# "sudo": "ALL=(ALL) NOPASSWD:ALL"
|
||||
# "groups": wheel
|
||||
# "hashed_passwd": "!"
|
||||
# "lock_passwd": true
|
||||
# "shell": "/usr/local/bin/bash"
|
||||
# "ssh_authorized_keys":
|
||||
# - ${SSH_PUB_KEY}
|
||||
# - "name": "root"
|
||||
# "hashed_passwd": "!"
|
||||
# "lock_passwd": true
|
||||
# write_files:
|
||||
# - path: /etc/sudoers
|
||||
# content: |
|
||||
# %wheel ALL=(ALL) NOPASSWD: ALL
|
||||
# append: true
|
||||
# EOF
|
||||
# else
|
||||
# cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
# #cloud-config
|
||||
# hostname: ${VM_HOSTNAME}
|
||||
# # manage_etc_hosts: false
|
||||
# ssh_pwauth: true
|
||||
# disable_root: true
|
||||
# users:
|
||||
# - name: ${VM_USERNAME}
|
||||
# hashed_passwd: ${VM_USER_PASS_HASH}
|
||||
# sudo: ALL=(ALL) NOPASSWD:ALL
|
||||
# shell: /bin/bash
|
||||
# lock-passwd: false
|
||||
# ssh_authorized_keys:
|
||||
# - ${SSH_PUB_KEY}
|
||||
# EOF
|
||||
# fi
|
||||
# }
|
||||
|
||||
|
||||
vm_gen_user_data()
|
||||
{
|
||||
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
VM_USER_DATA_FILE="files/freebsd-user-data"
|
||||
elif [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then
|
||||
VM_USER_DATA_FILE="files/openbsd-user-data"
|
||||
else
|
||||
VM_USER_DATA_FILE="files/linux-user-data"
|
||||
fi
|
||||
cp ${VM_USER_DATA_FILE} "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
sed -i "s|__SSH_PUB_KEY__|${SSH_PUB_KEY}|g" "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
sed -i "s|__VM_USERNAME__|${VM_USERNAME}|g" "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
}
|
||||
|
||||
vm_gen_meta_data()
|
||||
{
|
||||
cp files/meta-data "$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data"
|
||||
sed -i "s|__VMname__|${VM_HOSTNAME}|g" "$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data"
|
||||
}
|
||||
|
||||
vm_set_guest_type()
|
||||
{
|
||||
if [[ "$VM_OS_TYPE" == "BSD" ]]; then
|
||||
if [[ "${VM_OS_VARIANT}" == *"freebsd"* ]]; then
|
||||
VM_OS_VARIANT=${GUEST_OS_TYPE_FREEBSD}
|
||||
fi
|
||||
if [[ "${VM_OS_VARIANT}" == *"openbsd"* ]]; then
|
||||
VM_OS_VARIANT=${GUEST_OS_TYPE_OPENBSD}
|
||||
fi
|
||||
elif [[ "${VM_OS_VARIANT}" == *"debian13"* ]]; then
|
||||
VM_OS_VARIANT=${GUEST_OS_TYPE_DEBIAN}
|
||||
fi
|
||||
}
|
||||
|
||||
vm_guest_install()
|
||||
{
|
||||
VM_INSTALL_OPTS=""
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --name ${VM_HOSTNAME}"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --memory ${VM_MEM_SIZE}"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --vcpus ${VM_VCPUS}"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --os-variant=${VM_OS_VARIANT}"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --network ${LIBVIRT_NET_OPTION}"
|
||||
if [[ "${VM_NETWORK_TYPE}" == "isolated" ]]; then
|
||||
LIBVIRT_NET_OPTION="network=${VM_NETWORK_HOSTONLY},model=${LIBVIRT_NET_MODEL}"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --network ${LIBVIRT_NET_OPTION}"
|
||||
fi
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --autostart"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --import --noautoconsole"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --cloud-init user-data=${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data,meta-data=$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data"
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --channel unix,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0"
|
||||
if [ "$VM_BOOT_TYPE" = "UEFI" ]; then
|
||||
VM_INSTALL_OPTS="${VM_INSTALL_OPTS} --boot uefi"
|
||||
fi
|
||||
eval virt-install $VM_INSTALL_OPTS
|
||||
|
||||
virsh dumpxml "${VM_HOSTNAME}" > "${VM_BASE_DIR}/xml/${VM_HOSTNAME}.xml"
|
||||
#clear
|
||||
echo "VM ${VM_HOSTNAME} Created!"
|
||||
echo "NOTE: It may take some time for the virtual machine to be available if it is a BSD flavor. You can check the status of the virtual machine with the following command:"
|
||||
echo "root pass is(only for BSD flavour): ${VM_USER_PASS}"
|
||||
echo "user pass is: ${VM_USER_PASS}"
|
||||
echo "virsh console ${VM_HOSTNAME} --safe"
|
||||
}
|
||||
vm_get_guest_info()
|
||||
{
|
||||
# Obtener el ID del sistema operativo
|
||||
# Obtener el ID del sistema operativo
|
||||
OS_ID=$(grep -o 'id="[^"]*"' "$1" | tr -d '"' | awk '{print $1}')
|
||||
|
||||
# Eliminar el protocolo y el dominio del ID
|
||||
OS_ID=$(echo "$OS_ID" | cut -d '/' -f 2-)
|
||||
#echo $OS_ID
|
||||
# Convertir la URL a un nombre de distribución y versión
|
||||
VM_DISTRO=$(echo "$OS_ID" | awk -F '/' '{print $3}')
|
||||
VM_VERSION=$(echo "$OS_ID" | awk -F '/' '{print $4}')
|
||||
}
|
||||
|
||||
show_software_menu() {
|
||||
# Display dynamic OS selection menu
|
||||
echo "Select software to install:"
|
||||
echo "--------------"
|
||||
|
||||
# Array to store valid IDs for validation
|
||||
VALID_IDS=()
|
||||
while IFS= read -r entry; do
|
||||
DECODED=$(echo "$entry" | base64 --decode)
|
||||
ID=$(echo "$DECODED" | jq -r '.id')
|
||||
NAME=$(echo "$DECODED" | jq -r '.show_name')
|
||||
printf "%2s. %s\n" "$ID" "$NAME"
|
||||
VALID_IDS+=("$ID")
|
||||
done < <(jq -r '.software[] | @base64' "$OS_JSON_FILE_INSTALL")
|
||||
|
||||
# Calculate max ID for range validation
|
||||
ID_MAX=$(jq -r '[.software[].id] | max' "$OS_JSON_FILE_INSTALL")
|
||||
ID_MIN=$(jq -r '[.software[].id] | min' "$OS_JSON_FILE_INSTALL")
|
||||
|
||||
# Read user input
|
||||
read -r -p "Enter your choice [${ID_MIN}-${ID_MAX}]: " CHOICE
|
||||
|
||||
# Validate input: must be a number and within range
|
||||
if ! [[ "$CHOICE" =~ ^[0-9]+$ ]]; then
|
||||
echo "Error: Please enter a valid number." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if (( CHOICE < ID_MIN || CHOICE > ID_MAX )); then
|
||||
echo "Error: Please enter a number between ${ID_MIN} and ${ID_MAX}." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get selected OS variant
|
||||
SELECTED=$(jq -r ".software[] | select(.id == ${CHOICE})" "$OS_JSON_FILE_INSTALL")
|
||||
|
||||
if [ -z "$SELECTED" ]; then
|
||||
echo "Error: Invalid selection." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Export variables in uppercase
|
||||
VM_SOFT=$(echo "$SELECTED" | jq -r '.name')
|
||||
|
||||
}
|
||||
|
||||
vm_install_utils()
|
||||
{
|
||||
local VM=$1
|
||||
local SCRIPT=''
|
||||
local VM_DISTRO=''
|
||||
local VM_VERSION=''
|
||||
local VM_IP=$(vm_net_get_ip "$VM")
|
||||
vm_get_guest_info ${VM_BASE_DIR}/xml/${VM}.xml
|
||||
case ${VM_SOFT} in
|
||||
docker)
|
||||
if [[ "$VM_DISTRO" == "debian" ]]; then
|
||||
SCRIPT='vm_example_scripts/docker_debian.sh'
|
||||
elif [[ "$VM_DISTRO" == "ubuntu" ]]; then
|
||||
SCRIPT='vm_example_scripts/docker_ubuntu.sh'
|
||||
elif [[ "$VM_DISTRO" == "fedora" ]]; then
|
||||
SCRIPT='vm_example_scripts/docker_fedora.sh'
|
||||
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
|
||||
echo "Automated installation for Docker on ${VM_DISTRO} is not available."
|
||||
echo "It's better to use Pidman instead"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
podman)
|
||||
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
|
||||
SCRIPT='vm_example_scripts/podman_deb.sh'
|
||||
elif [[ "$VM_DISTRO" == "fedora" ]]; then
|
||||
SCRIPT='vm_example_scripts/podman_fedora.sh'
|
||||
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
|
||||
SCRIPT='vm_example_scripts/podman_freebsd.sh'
|
||||
fi
|
||||
;;
|
||||
gitlab_ce)
|
||||
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
|
||||
SCRIPT='vm_example_scripts/gitlab_ce_deb.sh'
|
||||
elif [[ "$VM_DISTRO" == "fedora" || "$VM_DISTRO" == "freebsd" ]]; then
|
||||
#SCRIPT='vm_example_scripts/gitlab_ce_fedora.sh'
|
||||
echo "Automated installation for Gitlab CE on ${VM_DISTRO} is not available by the moment."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
gitlab_runner)
|
||||
if [[ "$VM_DISTRO" == "debian" || "$VM_DISTRO" == "ubuntu" ]]; then
|
||||
SCRIPT='vm_example_scripts/gitlab_runner_deb.sh'
|
||||
elif [[ "$VM_DISTRO" == "fedora" ]]; then
|
||||
SCRIPT='vm_example_scripts/gitlab_runner_fedora.sh'
|
||||
elif [[ "$VM_DISTRO" == "freebsd" ]]; then
|
||||
SCRIPT='vm_example_scripts/gitlab_runner_freebsd.sh'
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Unknown action: ${ACTION}" >&2
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
#Exec script
|
||||
#bash ${SCRIPT}
|
||||
if [[ "$VM_DISTRO" == "freebsd" ]]; then
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${VM_IP} "sudo sh -s" - < ${SCRIPT}
|
||||
else
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USERNAME} ${VM_IP} "sudo bash -s" - < ${SCRIPT}
|
||||
fi
|
||||
}
|
||||
@ -0,0 +1,4 @@
|
||||
#!/bin/env bash
|
||||
GUEST_OS_TYPE_DEBIAN="debian13"
|
||||
GUEST_OS_TYPE_FREEBSD="freebsd14.2"
|
||||
GUEST_OS_TYPE_OPENBSD="openbsd7.6"
|
||||
|
||||
@ -1,2 +1,4 @@
|
||||
#!/bin/env bash
|
||||
GUEST_OS_TYPE_DEBIAN="debian11"
|
||||
GUEST_OS_TYPE_DEBIAN="debian11"
|
||||
GUEST_OS_TYPE_FREEBSD="freebsd13.1"
|
||||
GUEST_OS_TYPE_OPENBSD="openbsd7.0"
|
||||
|
||||
36
files/freebsd-user-data
Normal file
36
files/freebsd-user-data
Normal file
@ -0,0 +1,36 @@
|
||||
#cloud-config
|
||||
package_reboot_if_required: true
|
||||
package_update: true
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- sudo
|
||||
- vim
|
||||
- git
|
||||
- qemu-guest-agent
|
||||
ssh_pwauth: false
|
||||
config:
|
||||
- type: physical
|
||||
name: vtnet0
|
||||
subnets:
|
||||
- type: dhcp
|
||||
users:
|
||||
- name: __VM_USERNAME__
|
||||
sudo: "ALL=(ALL) NOPASSWD:ALL"
|
||||
groups: wheel
|
||||
hashed_passwd: "!"
|
||||
lock_passwd: true
|
||||
shell: /bin/tcsh
|
||||
ssh_authorized_keys:
|
||||
- __SSH_PUB_KEY__
|
||||
- name: root
|
||||
hashed_passwd: "!"
|
||||
lock_passwd: true
|
||||
write_files:
|
||||
- path: /usr/local/etc/sudoers
|
||||
content: |
|
||||
%wheel ALL=(ALL) NOPASSWD: ALL
|
||||
append: true
|
||||
runcmd:
|
||||
- sysrc qemu_guest_agent_enable=YES
|
||||
- sysrc ifconfig_vtnet0="DHCP -tso4 -tso6 -lro -vlanhwtso"
|
||||
- sysrc ifconfig_DEFAULT=""
|
||||
19
files/linux-user-data
Normal file
19
files/linux-user-data
Normal file
@ -0,0 +1,19 @@
|
||||
#cloud-config
|
||||
ssh_pwauth: true
|
||||
disable_root: true
|
||||
package_reboot_if_required: true
|
||||
package_update: true
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- sudo
|
||||
- vim
|
||||
- git
|
||||
- qemu-guest-agent
|
||||
users:
|
||||
- name: __VM_USERNAME__
|
||||
ssh_authorized_keys:
|
||||
- __SSH_PUB_KEY__
|
||||
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
|
||||
groups: sudo
|
||||
shell: /bin/bash
|
||||
lock-passwd: true
|
||||
2
files/meta-data
Normal file
2
files/meta-data
Normal file
@ -0,0 +1,2 @@
|
||||
instance-id: __VMname__
|
||||
local-hostname: __VMname__
|
||||
5
files/network-host-only.xml
Normal file
5
files/network-host-only.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<network>
|
||||
<name>YOURNETWORK</name>
|
||||
<bridge name='YOURNETWORK' stp='on' delay='0'/>
|
||||
<!-- <domain name='hostonly.local'/> -->
|
||||
</network>
|
||||
14
files/network-nat.xml
Normal file
14
files/network-nat.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<network>
|
||||
<name>YOURNETWORK</name>
|
||||
<forward mode='nat'>
|
||||
<nat>
|
||||
<port start='1024' end='65535'/>
|
||||
</nat>
|
||||
</forward>
|
||||
<bridge name='virbr1' stp='on' delay='0'/>
|
||||
<ip address='192.168.100.1' netmask='255.255.255.0'>
|
||||
<dhcp>
|
||||
<range start='192.168.100.100' end='192.168.100.254'/>
|
||||
</dhcp>
|
||||
</ip>
|
||||
</network>
|
||||
28
files/openbsd-user-data
Normal file
28
files/openbsd-user-data
Normal file
@ -0,0 +1,28 @@
|
||||
#cloud-config
|
||||
package_reboot_if_required: true
|
||||
package_update: true
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- sudo
|
||||
- vim
|
||||
- git
|
||||
- qemu-guest-agent
|
||||
|
||||
ssh_pwauth: false
|
||||
users:
|
||||
- name: __VM_USERNAME__
|
||||
sudo: "ALL=(ALL) NOPASSWD:ALL"
|
||||
groups: wheel
|
||||
hashed_passwd: "!"
|
||||
lock_passwd: true
|
||||
shell: /usr/local/bin/bash
|
||||
ssh_authorized_keys:
|
||||
- __SSH_PUB_KEY__
|
||||
- name: root
|
||||
hashed_passwd: "!"
|
||||
lock_passwd: true
|
||||
write_files:
|
||||
- path: /etc/sudoers
|
||||
content: |
|
||||
%wheel ALL=(ALL) NOPASSWD: ALL
|
||||
append: true
|
||||
112
files/os_options.json
Normal file
112
files/os_options.json
Normal file
@ -0,0 +1,112 @@
|
||||
{
|
||||
"os_variants": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Debian Stable",
|
||||
"variant": "debian13",
|
||||
"os_type": "GNULinux",
|
||||
"url": "http://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2",
|
||||
"origin_image_name": "debian-13-generic-amd64.qcow2",
|
||||
"md5sum": "http://cloud.debian.org/images/cloud/trixie/latest/SHA512SUMS",
|
||||
"boot_type": "bios"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Ubuntu 20.04 server",
|
||||
"variant": "ubuntu20.04",
|
||||
"os_type": "GNULinux",
|
||||
"url": "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "focal-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/focal/current/SHA256SUMS",
|
||||
"boot_type": "bios"
|
||||
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Ubuntu 20.04 minimal",
|
||||
"variant": "ubuntu20.04",
|
||||
"os_type": "GNULinux",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/focal/release/ubuntu-20.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-20.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/focal/release/SHA256SUMS",
|
||||
"boot_type": "bios"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Ubuntu 22.04 server",
|
||||
"variant": "ubuntu22.04",
|
||||
"os_type": "GNULinux",
|
||||
"url": "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "jammy-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/jammy/current/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Ubuntu 22.04 minimal",
|
||||
"variant": "ubuntu22.04",
|
||||
"os_type": "GNULinux",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-22.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/jammy/release/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "Ubuntu 24.04 server",
|
||||
"variant": "ubuntu22.04",
|
||||
"os_type": "GNULinux",
|
||||
"url": "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "noble-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/noble/current/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "Ubuntu 24.04 minimal",
|
||||
"os_type": "GNULinux",
|
||||
"variant": "ubuntu22.04",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-24.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/noble/release/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
} ,
|
||||
{
|
||||
"id": 8,
|
||||
"name": "Fedora CLoud",
|
||||
"os_type": "GNULinux",
|
||||
"variant": "fedora41",
|
||||
"url": " https://download.fedoraproject.org/pub/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
|
||||
"origin_image_name": "Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2",
|
||||
"md5sum": "https://fedora.mirrorservice.org/fedora/linux/releases/42/Cloud/x86_64/images/Fedora-Cloud-42-1.1-x86_64-CHECKSUM",
|
||||
"boot_type": "bios"
|
||||
} ,
|
||||
{
|
||||
"id": 9,
|
||||
"name": "FreeBSD 14.3 UFS",
|
||||
"os_type": "BSD",
|
||||
"variant": "freebsd14.2",
|
||||
"url": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz",
|
||||
"origin_image_name": "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz",
|
||||
"md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512"
|
||||
} ,
|
||||
{
|
||||
"id": 10,
|
||||
"name": "FreeBSD 14.3 ZFS",
|
||||
"os_type": "BSD",
|
||||
"variant": "freebsd14.2",
|
||||
"url": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT-zfs.qcow2.xz",
|
||||
"origin_image_name": "FreeBSD-14.3-STABLE-amd64-BASIC-CLOUDINIT-zfs.qcow2.xz",
|
||||
"md5sum": "https://download.freebsd.org/ftp/snapshots/VM-IMAGES/14.3-STABLE/amd64/Latest/CHECKSUM.SHA512"
|
||||
} ,
|
||||
{
|
||||
"id": 11,
|
||||
"name": "OpenBSD 7.7 generic",
|
||||
"os_type": "BSD",
|
||||
"variant": "openbsd7.6",
|
||||
"url": "",
|
||||
"origin_image_name": "openbsd-generic.qcow2",
|
||||
"md5sum": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
24
files/software.json
Normal file
24
files/software.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"software": [
|
||||
{
|
||||
"id": 1,
|
||||
"show_name": "Docker",
|
||||
"name": "docker"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"show_name": "Podman",
|
||||
"name": "podman"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"show_name": "Gitlab CE",
|
||||
"name": "gitlab_ce"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"show_name": "Gitlab Runner",
|
||||
"name": "gitlab_runner"
|
||||
}
|
||||
]
|
||||
}
|
||||
44
install.sh
Executable file
44
install.sh
Executable file
@ -0,0 +1,44 @@
|
||||
#!/bin/env bash
|
||||
#Define variable names on env_scripts/common.sh
|
||||
#VM_NETWORK=
|
||||
#VM_BASE_DIR=
|
||||
#Install dependencies
|
||||
source env_scripts/common.sh
|
||||
source env_scripts/functions.sh
|
||||
detect_distro
|
||||
|
||||
case $DISTRO in
|
||||
ubuntu|debian)
|
||||
install_debian_ubuntu
|
||||
;;
|
||||
arch)
|
||||
install_arch
|
||||
;;
|
||||
fedora)
|
||||
install_fedora
|
||||
;;
|
||||
*)
|
||||
print_error "Distribution not supported: $DISTRO"
|
||||
print_info "Supported: Ubuntu, Debian, Arch, Fedora"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
sudo usermod -aG libvirt $(whoami)
|
||||
sudo usermod -aG kvm $(whoami)
|
||||
sudo systemctl enable libvirtd
|
||||
sudo systemctl start libvirtd
|
||||
|
||||
mkdir -p "${VM_BASE_DIR}"/{images,xml,init,base,ssh}
|
||||
#Isolated network
|
||||
cp files/network-host-only.xml ${VM_BASE_DIR}/xml/network-host-only.xml
|
||||
sed -i "s/YOURNETWORK/${VM_NETWORK_HOSTONLY}/g" ${VM_BASE_DIR}/xml/network-host-only.xml
|
||||
virsh net-define ${VM_BASE_DIR}/xml/network-host-only.xml
|
||||
virsh net-autostart ${VM_NETWORK_HOSTONLY}
|
||||
virsh net-start ${VM_NETWORK_HOSTONLY}
|
||||
#NAT
|
||||
cp files/network-nat.xml ${VM_BASE_DIR}/xml/network-nat.xml
|
||||
sed -i "s/YOURNETWORK/${VM_NETWORK_NAT}/g" ${VM_BASE_DIR}/xml/network-nat.xml
|
||||
virsh net-define ${VM_BASE_DIR}/xml/network-nat.xml
|
||||
virsh net-autostart ${VM_NETWORK_NAT}
|
||||
virsh net-start ${VM_NETWORK_NAT}
|
||||
newgrp libvirt
|
||||
68
os_option_test.json
Normal file
68
os_option_test.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"os_variants": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Debian 12",
|
||||
"variant": "$GUEST_OS_TYPE_DEBIAN",
|
||||
"url": "https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2",
|
||||
"origin_image_name": "debian-12-generic-amd64.qcow2",
|
||||
"md5sum": "https://cdimage.debian.org/images/cloud/bookworm/latest/SHA512SUMS",
|
||||
"boot_type": "bios"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Ubuntu 20.04 server",
|
||||
"variant": "ubuntu20.04",
|
||||
"url": "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "focal-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/focal/current/SHA256SUMS",
|
||||
"boot_type": "bios"
|
||||
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Ubuntu 20.04 minimal",
|
||||
"variant": "ubuntu20.04",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/focal/release/ubuntu-20.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-20.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/focal/release/SHA256SUMS",
|
||||
"boot_type": "bios"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Ubuntu 22.04 server",
|
||||
"variant": "ubuntu22.04",
|
||||
"url": "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "jammy-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/jammy/current/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Ubuntu 22.04 minimal",
|
||||
"variant": "ubuntu22.04",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-22.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/jammy/release/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "Ubuntu 24.04 server",
|
||||
"variant": "ubuntu22.04",
|
||||
"url": "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img",
|
||||
"origin_image_name": "noble-server-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/noble/current/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "Ubuntu 24.04 minimal",
|
||||
"variant": "ubuntu22.04",
|
||||
"url": "https://cloud-images.ubuntu.com/minimal/releases/noble/release/ubuntu-24.04-minimal-cloudimg-amd64.img",
|
||||
"origin_image_name": "ubuntu-24.04-minimal-cloudimg-amd64.img",
|
||||
"md5sum": "https://cloud-images.ubuntu.com/minimal/releases/noble/release/SHA256SUMS",
|
||||
"boot_type": "uefi"
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
#!/bin/env bash
|
||||
#Variables
|
||||
VM="$1"
|
||||
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
|
||||
VM_USER="user"
|
||||
#Functions
|
||||
usage() {
|
||||
cat << EOF
|
||||
USO: $0 VM
|
||||
|
||||
Este script conecta por ssh con la maquina virtual seleccionada.
|
||||
EOF
|
||||
}
|
||||
|
||||
connect_vm() {
|
||||
local VM_IP=$(./vm_get_ip.sh ${VM})
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USER} ${VM_IP}
|
||||
}
|
||||
if [[ -z "$VM" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
connect_vm
|
||||
289
vm_create.sh
289
vm_create.sh
@ -1,289 +0,0 @@
|
||||
#!/bin/env bash
|
||||
VM_HOSTNAME=
|
||||
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
|
||||
VM_DISK_SIZE=20
|
||||
VM_DISK_FORMAT=qcow2
|
||||
VM_MEM_SIZE=2048
|
||||
VM_VCPUS=2
|
||||
VM_BASE_IMAGE=
|
||||
VM_OS_VARIANT=
|
||||
VM_USERNAME="user"
|
||||
VM_BRIDGE_INT=
|
||||
VM_NET_USED="PU-internalTests"
|
||||
LIBVIRT_NET_OPTION="network=$VM_NET_USED,model=e1000"
|
||||
HAT_STREAM="stable"
|
||||
# Functions
|
||||
usage()
|
||||
{
|
||||
cat << EOF
|
||||
usage: $0 options
|
||||
|
||||
Quickly create guest VMs using cloud image files and cloud-init.
|
||||
|
||||
OPTIONS:
|
||||
-h Show this message
|
||||
-n Host name (required)
|
||||
-b bridge interface name (bridge network is used)
|
||||
-r RAM in MB (defaults to ${VM_MEM_SIZE})
|
||||
-c Number of VCPUs (defaults to ${VM_VCPUS})
|
||||
-s Amount of storage to allocate in GB (defaults to ${VM_DISK_SIZE})
|
||||
-v Verbose
|
||||
EOF
|
||||
}
|
||||
|
||||
HOST_OS=$(cat /etc/os-release | grep -v VERSION_ID |grep "ID=" | awk -F'=' '{print $2}')
|
||||
if [ "$HOST_OS" == "debian" ]; then
|
||||
source env_scripts/older_os.sh
|
||||
else
|
||||
source env_scripts/newer_os.sh
|
||||
fi
|
||||
|
||||
download_base_image()
|
||||
{
|
||||
if ! test -f "${VM_BASE_DIR}/base/$VM_OS_VARIANT.qcow2"; then
|
||||
if [[ "$VM_OS_VARIANT" == "freebsd14.2" ]]; then
|
||||
VM_DISK_FORMAT="qcow2.xz"
|
||||
cd ${VM_BASE_DIR}/base/
|
||||
wget -v -O "${VM_BASE_DIR}/base/$VM_OS_VARIANT.${VM_DISK_FORMAT}" ${VM_BASE_IMAGE}
|
||||
xz -d $VM_OS_VARIANT.${VM_DISK_FORMAT}
|
||||
mv $VM_OS_VARIANT.${VM_DISK_FORMAT} $VM_OS_VARIANT.img
|
||||
cd -
|
||||
elif [[ "$VM_OS_VARIANT" == "fedora-coreos-stable" ]]; then
|
||||
podman run --pull=always --rm \
|
||||
-v /dev:/dev -v /run/udev:/run/udev \
|
||||
-v $VM_BASE_DIR/base:/data -w /data \
|
||||
quay.io/coreos/coreos-installer:release \
|
||||
download -s ${HAT_STREAM} -p qemu -f qcow2.xz --decompress -C .
|
||||
mv $VM_BASE_DIR/base/fedora-coreos-*.qcow2 $VM_BASE_DIR/base/"$VM_OS_VARIANT".qcow2
|
||||
else
|
||||
wget -v -O "${VM_BASE_DIR}/base/$VM_OS_VARIANT.${VM_DISK_FORMAT}" ${VM_BASE_IMAGE}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
gen_coreos_data()
|
||||
{
|
||||
cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data.bu"
|
||||
variant: fcos
|
||||
version: 1.6.0
|
||||
passwd:
|
||||
users:
|
||||
- name: core
|
||||
ssh_authorized_keys:
|
||||
- ${SSH_PUB_KEY}
|
||||
EOF
|
||||
}
|
||||
|
||||
gen_linux_user_data()
|
||||
{
|
||||
VM_USER_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 8; echo)
|
||||
VM_USER_PASS_HASH=$(mkpasswd --method=SHA-512 --rounds=4096 ${VM_USER_PASS})
|
||||
cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
#cloud-config
|
||||
hostname: ${VM_HOSTNAME}
|
||||
# manage_etc_hosts: false
|
||||
ssh_pwauth: true
|
||||
disable_root: true
|
||||
users:
|
||||
- name: ${VM_USERNAME}
|
||||
hashed_passwd: ${VM_USER_PASS_HASH}
|
||||
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||
shell: /bin/bash
|
||||
lock-passwd: false
|
||||
ssh_authorized_keys:
|
||||
- ${SSH_PUB_KEY}
|
||||
EOF
|
||||
}
|
||||
|
||||
gen_freebsd_user_data()
|
||||
{
|
||||
#VM_ROOT_PASS=$(tr -dc A-Za-z0-9 </dev/urandom | head -c 16; echo)
|
||||
VM_ROOT_PASS="changeme"
|
||||
echo "Generated root passwd: ${VM_ROOT_PASS}"
|
||||
VM_ROOT_PASS_HASH=$(mkpasswd --method=SHA-512 --rounds=4096 ${VM_ROOT_PASS})
|
||||
# Write FreeBSD 13.2 user-data
|
||||
VM_USER_PASS="sasasa123"
|
||||
VM_USER_PASS_HASH=$(mkpasswd --method=SHA-512 --rounds=4096 ${VM_USER_PASS})
|
||||
cat <<EOF > "$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data"
|
||||
#cloud-config
|
||||
users:
|
||||
- name: root
|
||||
lock_passwd: false
|
||||
hashed_passwd: ${VM_ROOT_PASS}
|
||||
- name: ${VM_USERNAME}
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa ${SSH_PUB_KEY}
|
||||
groups: wheel
|
||||
ssh_pwauth: true
|
||||
hashed_passwd: ${VM_USER_PASS_HASH}
|
||||
write_files:
|
||||
- path: /usr/local/etc/sudoers
|
||||
content: |
|
||||
%wheel ALL=(ALL) NOPASSWD: ALL
|
||||
append: true
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
|
||||
while getopts "h:n:net:b:r:c:s:v" option; do
|
||||
case "${option}"
|
||||
in
|
||||
h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
n) VM_HOSTNAME=${OPTARG};;
|
||||
b) VM_BRIDGE_INT=${OPTARG};;
|
||||
r) VM_MEM_SIZE=${OPTARG};;
|
||||
c) VM_VCPUS=${OPTARG};;
|
||||
s) VM_DISK_SIZE=${OPTARG};;
|
||||
v) VERBOSE=1;;
|
||||
*)
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ -z $VM_HOSTNAME ]]; then
|
||||
echo "ERROR: Host name is required"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -n $VERBOSE ]]; then
|
||||
echo "Building ${VM_HOSTNAME} in $VM_IMAGE_DIR"
|
||||
set -xv
|
||||
fi
|
||||
|
||||
if [[ -n $VM_BRIDGE_INT ]]; then
|
||||
LIBVIRT_NET_OPTION="model=virtio,bridge=${VM_BRIDGE_INT}"
|
||||
fi
|
||||
|
||||
mkdir -p "$VM_BASE_DIR"/{images,xml,init,base,ssh}
|
||||
|
||||
## VM Base image
|
||||
if [ -n "$VM_BASE_IMAGE" ] && [ -f "$VM_BASE_IMAGE" ]; then
|
||||
download_base_image
|
||||
else
|
||||
while true; do
|
||||
read -r -p $'Select VM OS:\n 1.Debian12\n 2.Ubuntu 20.04\n 3.Ubuntu 22.04\n 4.Ubuntu 24.04 \n 5.FreeBSD 14\n 6.Alpine Linux\n 7.Fedora CoreOS' -n1 answer
|
||||
case $answer in
|
||||
[1]* ) VM_OS_VARIANT='debian11'
|
||||
VM_BASE_IMAGE='https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2'
|
||||
break;;
|
||||
[2]* ) VM_OS_VARIANT='ubuntu20.04'
|
||||
VM_BASE_IMAGE='https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img'
|
||||
break;;
|
||||
[3]* ) VM_OS_VARIANT='ubuntu22.04'
|
||||
VM_BASE_IMAGE='https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img'
|
||||
break;;
|
||||
[4]* ) VM_OS_VARIANT='ubuntu24.04'
|
||||
VM_BASE_IMAGE='https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img'
|
||||
break;;
|
||||
[5]* ) VM_OS_VARIANT='freebsd14.2'
|
||||
VM_BASE_IMAGE='https://download.freebsd.org/ftp/releases/VM-IMAGES/14.2-RELEASE/amd64/Latest/FreeBSD-14.2-RELEASE-amd64-BASIC-CLOUDINIT.ufs.qcow2.xz'
|
||||
break;;
|
||||
[6]* ) VM_OS_VARIANT='alpinelinux3.20'
|
||||
VM_BASE_IMAGE='https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-tiny-r0.qcow2"'
|
||||
break;;
|
||||
[7]* ) VM_OS_VARIANT='fedora-coreos-stable'
|
||||
#VM_BASE_IMAGE='https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-tiny-r0.qcow2"'
|
||||
break;;
|
||||
* ) echo "Please answer 1,2,3,4,5,6,7.";;
|
||||
esac
|
||||
done
|
||||
download_base_image
|
||||
fi
|
||||
|
||||
|
||||
echo "Creating a qcow2 image file ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img that uses the cloud image file ${VM_BASE_DIR}/base/$VM_OS_VARIANT.${VM_DISK_FORMAT} as its base"
|
||||
if ! test -f "${VM_BASE_DIR}/images/${VM_HOSTNAME}.img"; then
|
||||
qemu-img create -b "${VM_BASE_DIR}/base/${VM_OS_VARIANT}.qcow2" -f qcow2 -F qcow2 "${VM_BASE_DIR}/images/${VM_HOSTNAME}.img" "${VM_DISK_SIZE}G"
|
||||
else
|
||||
echo "El fichero ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img ya existe"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# VM ssh keys gen
|
||||
if [ -f "${VM_BASE_IMAGE}/ssh/${VM_HOSTNAME}" ]; then
|
||||
echo "Ya existe una clave ssh para la maquina ${VM_HOSTNAME}"
|
||||
else
|
||||
ssh-keygen -t rsa -b 4096 -N '' -f "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}"
|
||||
chmod 600 ${VM_BASE_DIR}/ssh/${VM_HOSTNAME}.pub
|
||||
ssh-keygen -y -f "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}" > "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt
|
||||
SSH_PUB_KEY=$(cat "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt)
|
||||
rm "${VM_BASE_DIR}/ssh/${VM_HOSTNAME}".pub.txt
|
||||
fi
|
||||
#cloud-init VM meta-data
|
||||
cat > "$VM_BASE_DIR/init/${VM_HOSTNAME}-meta-data" << EOF
|
||||
instance-id: ${VM_HOSTNAME}
|
||||
local-hostname: ${VM_HOSTNAME}
|
||||
EOF
|
||||
#cloud-init VM user-data
|
||||
if [[ "$VM_OS_VARIANT" == "freebsd14.2" ]]; then
|
||||
gen_freebsd_user_data
|
||||
# genisoimage \
|
||||
# -output ${VM_BASE_DIR}/images/${VM_HOSTNAME}-cidata.iso \
|
||||
# -V cidata -r \
|
||||
# -J ${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data ${VM_BASE_DIR}/init/${VM_HOSTNAME}-meta-data
|
||||
# virt-install \
|
||||
# --name ${VM_HOSTNAME} \
|
||||
# --memory ${VM_MEM_SIZE} \
|
||||
# --vcpus="${VM_VCPUS}" \
|
||||
# --os-variant=${VM_OS_VARIANT} \
|
||||
# --disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio \
|
||||
# --disk path=${VM_BASE_DIR}/images/${VM_HOSTNAME}-cidata.iso,device=cdrom \
|
||||
# --network ${LIBVIRT_NET_OPTION} \
|
||||
# --autostart \
|
||||
# --import --noautoconsole \
|
||||
# --cloud-init root-password-generate=on,user-data=${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data
|
||||
elif [[ "$VM_OS_VARIANT" == "fedora-coreos-stable" ]]; then
|
||||
gen_coreos_data
|
||||
else
|
||||
gen_linux_user_data
|
||||
fi
|
||||
if [[ "$VM_OS_VARIANT" == "fedora-coreos-stable" ]]; then
|
||||
IGNITION_CONFIG="${VM_BASE_DIR}/init/${VM_HOSTNAME}.ign"
|
||||
BUTANE_CONFIG="$VM_BASE_DIR/init/${VM_HOSTNAME}-user-data.bu"
|
||||
IGNITION_DEVICE_ARG=(--qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${IGNITION_CONFIG}")
|
||||
#Generate ignition config
|
||||
podman run --interactive --rm quay.io/coreos/butane:release \
|
||||
--pretty --strict < ${BUTANE_CONFIG} > ${IGNITION_CONFIG}
|
||||
chown ${USERNAME}:libvirt-qemu /home/victor/vms/init/*
|
||||
#Install
|
||||
virt-install \
|
||||
--connect="qemu:///system" \
|
||||
--name ${VM_HOSTNAME} \
|
||||
--memory ${VM_MEM_SIZE} \
|
||||
--vcpus="${VM_VCPUS}" \
|
||||
--os-variant=${VM_OS_VARIANT} \
|
||||
--disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio \
|
||||
--autostart \
|
||||
--import --noautoconsole \
|
||||
--network ${LIBVIRT_NET_OPTION} "${IGNITION_DEVICE_ARG[@]}"
|
||||
#https://unix.stackexchange.com/questions/578086/virt-install-error-cant-load-ignit
|
||||
else
|
||||
virt-install \
|
||||
--name ${VM_HOSTNAME} \
|
||||
--memory ${VM_MEM_SIZE} \
|
||||
--vcpus="${VM_VCPUS}" \
|
||||
--os-variant=${VM_OS_VARIANT} \
|
||||
--disk ${VM_BASE_DIR}/images/${VM_HOSTNAME}.img,device=disk,bus=virtio \
|
||||
--network ${LIBVIRT_NET_OPTION} \
|
||||
--autostart \
|
||||
--import --noautoconsole \
|
||||
--cloud-init root-password-generate=on,user-data=${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data
|
||||
# cloud-localds \
|
||||
# ${VM_BASE_DIR}/images/${VM_HOSTNAME}.iso \
|
||||
# ${VM_BASE_DIR}/init/${VM_HOSTNAME}-user-data
|
||||
fi
|
||||
virsh dumpxml "${VM_HOSTNAME}" > "${VM_BASE_DIR}/xml/${VM_HOSTNAME}.xml"
|
||||
|
||||
if [ -n $VERBOSE ]; then
|
||||
set +xv
|
||||
fi
|
||||
# Show running VMs
|
||||
virsh list
|
||||
42
vm_delete.sh
42
vm_delete.sh
@ -1,42 +0,0 @@
|
||||
#!/bin/env bash
|
||||
|
||||
# Function for usage message
|
||||
usage() {
|
||||
cat << EOF
|
||||
Usage: $0 vm_name
|
||||
|
||||
This script removes a virtual machine managed by virsh.
|
||||
|
||||
EOF
|
||||
}
|
||||
VM_BASE_DIR="${VM_BASE_DIR:-${HOME}/vms}"
|
||||
VM_IMAGE_PATH="${VM_BASE_DIR}/images/$1.img"
|
||||
CI_IMAGE_PATH="${VM_BASE_DIR}/images/$1-cidata.iso"
|
||||
|
||||
# Validate VM name argument
|
||||
if [[ -z "$1" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if VM exists
|
||||
if [[ -f "$VM_IMAGE_PATH" ]]; then
|
||||
# Safely remove the VM with confirmation
|
||||
read -p "Are you sure you want to remove the VM '$1' (y/N)? " confirm
|
||||
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||||
# Attempt to stop the VM before deleting
|
||||
virsh destroy "$1" 2>/dev/null || true
|
||||
# Delete VM definition and associated images
|
||||
virsh undefine "$1" 2>/dev/null || true
|
||||
rm -fv "$VM_IMAGE_PATH" "$CI_IMAGE_PATH"
|
||||
rm ${VM_BASE_DIR}/xml/$1.xml
|
||||
rm ${VM_BASE_DIR}/ssh/$1*
|
||||
rm ${VM_BASE_DIR}/init/$1-user-data
|
||||
rm ${VM_BASE_DIR}/init/$1-meta-data
|
||||
else
|
||||
echo "VM removal cancelled."
|
||||
fi
|
||||
else
|
||||
# Handle case where VM image is not found
|
||||
echo "Cannot find VM image file '$VM_IMAGE_PATH'. No action taken."
|
||||
fi
|
||||
@ -1,3 +1,3 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
sudo mv /home/user/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml
|
||||
sudo netplan apply
|
||||
150
vm_example_scripts/dnsmasq_freebsd.sh
Normal file
150
vm_example_scripts/dnsmasq_freebsd.sh
Normal file
@ -0,0 +1,150 @@
|
||||
#!/bin/sh -
|
||||
|
||||
#VARIABLES
|
||||
|
||||
# === Security and initialization ===
|
||||
IFS=' ' # Reset IFS to prevent parsing attacks
|
||||
# === Default values ===
|
||||
ENABLE_DNS="yes"
|
||||
ENABLE_DHCP="no"
|
||||
ENABLE_PXE="no"
|
||||
DNSMASQ_DCONF_DIR="/usr/local/etc/dnsmasq.conf.d"
|
||||
DNSMASQ_CONFIG_FILE="/usr/local/etc/dnsmasq.conf"
|
||||
LOCAL_NETWORK="192.168.1"
|
||||
LOCAL_NETWORK_GATEWAY="${LOCAL_NETWORK}.1"
|
||||
LOCAL_NETWORK_RANGE="${LOCAL_NETWORK}.0/24"
|
||||
LOCAL_NETWORK_DHCP_FIRST_IP="50"
|
||||
LOCAL_NETWORK_DHCP_LAST_IP="254"
|
||||
LOCAL_NETWORK_NETMASK="255.255.255.0"
|
||||
LOCAL_NETWORK_DHCP_LEASE="12h"
|
||||
LOCAL_DOMAIN="pozal.lan"
|
||||
|
||||
#FUNCTIONS
|
||||
# === Function: print header ===
|
||||
print_header()
|
||||
{
|
||||
printf '%s\n' "================================"
|
||||
printf '%s\n' " Dnsmasq Service Enabler"
|
||||
printf '%s\n' "================================"
|
||||
}
|
||||
|
||||
# === Function: ask yes/no ===
|
||||
ask_yes_no()
|
||||
{
|
||||
# Usage: ask_yes_no "Question?" default(y/n)
|
||||
prompt="$1"
|
||||
default="$2"
|
||||
|
||||
while true; do
|
||||
printf '%s ' "${prompt} (y/n) [${default}]: "
|
||||
read -r response
|
||||
case "${response:-${default}}" in
|
||||
[Yy]|[Yy][Ss])
|
||||
echo "yes"
|
||||
return 0
|
||||
;;
|
||||
[Nn]|[Nn][Oo])
|
||||
echo "no"
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
printf '%s\n' "Please answer yes or no."
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
change_config()
|
||||
{
|
||||
REPLACEMENTS_FILE=$1
|
||||
if [ ! -f "${DNSMASQ_CONFIG_FILE}" ]; then
|
||||
echo "Error: Config file '${DNSMASQ_CONFIG_FILE}' not found." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -r "${REPLACEMENTS_FILE}" ]; then
|
||||
echo "Error: Replacements file '${REPLACEMENTS_FILE}' not found or not readable." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cp "${DNSMASQ_CONFIG_FILE}" "${DNSMASQ_CONFIG_FILE}.bak" || {
|
||||
echo "Error: Failed to create backup." >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
while IFS='@@@' read -r old new || [ -n "${old}" ]; do
|
||||
# Saltar líneas vacías o comentarios
|
||||
case "${old}" in
|
||||
""|\#*) continue ;;
|
||||
esac
|
||||
|
||||
# Aplicar sustitución con sed (usando | como delimitador)
|
||||
if ! sed -i '' "s|${old}|${new}|g" "${DNSMASQ_CONFIG_FILE}"; then
|
||||
echo "Error: Failed to replace '${old}' with '${new}'." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Replaced: '${old}' -> '${new}'"
|
||||
done < "${REPLACEMENTS_FILE}"
|
||||
|
||||
echo "All replacements applied successfully."
|
||||
}
|
||||
|
||||
change_dnsmasq_config()
|
||||
{
|
||||
if [ "${ENABLE_DNS}" = "yes" ]; then
|
||||
enable_dns
|
||||
fi
|
||||
|
||||
if [ "${ENABLE_DHCP}" = "yes" ]; then
|
||||
enable_dhcp
|
||||
fi
|
||||
|
||||
if [ "${ENABLE_PXE}" = "yes" ]; then
|
||||
enable_pxe
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
enable_dns()
|
||||
{
|
||||
change_config vm_template_files/dnsmasq_conf_dns
|
||||
echo "dhcp-option=6,\"${JAIL_IP_ADDRESS},1.1.1.1\"" >> "${DNSMASQ_CONFIG_FILE}"
|
||||
DNSMASQ_LISTS="vm_template_files/dnsmasq_lists.txt"
|
||||
while IFS='@@@' read -r url file|| [ -n "${url}" ]; do
|
||||
# Saltar líneas vacías o comentarios
|
||||
case "${url}" in
|
||||
""|\#*) continue ;;
|
||||
esac
|
||||
curl -L -o "${file}" \
|
||||
"${{url}}"
|
||||
|
||||
done < "${DNSMASQ_LISTS}"
|
||||
|
||||
}
|
||||
|
||||
enable_dhcp()
|
||||
{
|
||||
change_config vm_template_files/dnsmasq_conf_dhcp
|
||||
}
|
||||
|
||||
enable_pxe()
|
||||
{
|
||||
#change_config vm_template_files/dnsmasq_conf_pxe
|
||||
echo "dhcp-option=66,\"0.0.0.0\"" >> "${DNSMASQ_CONFIG_FILE}"
|
||||
}
|
||||
|
||||
|
||||
|
||||
#MAIN
|
||||
#Install package
|
||||
pkg install dnsmasq
|
||||
#Apply config
|
||||
# === Main ===
|
||||
print_header
|
||||
# Ask for each service
|
||||
ENABLE_DHCP="$(ask_yes_no "Enable DHCP server" "n")"
|
||||
ENABLE_PXE="$(ask_yes_no "Enable PXE boot server" "n")"
|
||||
change_dnsmasq_config
|
||||
sysrc dnsmasq_enable="YES"
|
||||
sysrc dnsmasq_conf="/usr/local/etc/dnsmasq.conf"
|
||||
@ -1,20 +1,36 @@
|
||||
#!/bin/sh
|
||||
#SOURCE: https://docs.docker.com/engine/install/debian/
|
||||
# https://docs.docker.com/engine/install/linux-postinstall/
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
|
||||
# Add Docker's official GPG key:
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install ca-certificates curl gnupg
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
# Add the repository to Apt sources:
|
||||
echo \
|
||||
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
|
||||
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
sudo usermod -aG docker $USER
|
||||
#!/usr/bin/env bash
|
||||
# SOURCE: https://docs.docker.com/engine/install/debian/
|
||||
# https://docs.docker.com/engine/install/linux-postinstall/
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Remove old conflicting packages
|
||||
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do
|
||||
apt-get remove -y "$pkg" 2>/dev/null || true
|
||||
done
|
||||
|
||||
# Add Docker's official GPG key
|
||||
apt-get update
|
||||
apt-get -y install ca-certificates curl gnupg
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
|
||||
# Add the repository to Apt sources
|
||||
# shellcheck disable=SC2027,SC2046 # We handle word splitting safely here
|
||||
# shellcheck source=/dev/null
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||
tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
# Update and install Docker
|
||||
apt-get update
|
||||
apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
|
||||
# Add user to docker group
|
||||
usermod -aG docker "${USER}"
|
||||
|
||||
# Refresh group membership (optional, user may need to log out)
|
||||
newgrp docker
|
||||
24
vm_example_scripts/docker_fedora.sh
Executable file
24
vm_example_scripts/docker_fedora.sh
Executable file
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
#SOURCE: https://docs.docker.com/engine/install/fedora/
|
||||
# https://docs.docker.com/engine/install/linux-postinstall/
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
dnf -y remove docker \
|
||||
docker-client \
|
||||
docker-client-latest \
|
||||
docker-common \
|
||||
docker-latest \
|
||||
docker-latest-logrotate \
|
||||
docker-logrotate \
|
||||
docker-selinux \
|
||||
docker-engine-selinux \
|
||||
docker-engine
|
||||
dnf -y install dnf-plugins-core
|
||||
dnf-3 config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
|
||||
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
systemctl enable --now docker
|
||||
usermod -aG docker "$USER"
|
||||
echo "To use docker execute :"
|
||||
echo "newgrp docker"
|
||||
@ -1,18 +1,50 @@
|
||||
#!/bin/bash
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
|
||||
# Add Docker's official GPG key:
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ca-certificates curl
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||
# Add the repository to Apt sources:
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
sudo usermod -aG docker $USER
|
||||
newgrp docker
|
||||
#!/usr/bin/env bash
|
||||
# SOURCE: https://docs.docker.com/engine/install/ubuntu/
|
||||
# https://docs.docker.com/engine/install/linux-postinstall/
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Remove old or conflicting packages
|
||||
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
|
||||
apt-get remove -y "$pkg" 2>/dev/null || true
|
||||
done
|
||||
|
||||
# Install prerequisites
|
||||
apt-get update
|
||||
apt-get install -y ca-certificates curl gnupg
|
||||
|
||||
# Create keyrings directory and add Docker GPG key
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
|
||||
gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
|
||||
# Add Docker repository
|
||||
# shellcheck source=/dev/null
|
||||
. /etc/os-release
|
||||
ARCH=$(dpkg --print-architecture)
|
||||
CODENAME="$VERSION_CODENAME"
|
||||
|
||||
echo "deb [arch=$ARCH signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $CODENAME stable" | \
|
||||
tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
# Update and install Docker
|
||||
apt-get update
|
||||
apt-get install -y \
|
||||
docker-ce \
|
||||
docker-ce-cli \
|
||||
containerd.io \
|
||||
docker-buildx-plugin \
|
||||
docker-compose-plugin
|
||||
|
||||
# Add user to docker group
|
||||
usermod -aG docker "$USER"
|
||||
|
||||
# Refresh group membership
|
||||
echo "Docker installation completed."
|
||||
echo "To use Docker without sudo, run:"
|
||||
echo " newgrp docker"
|
||||
echo "Or log out and back"
|
||||
@ -1,13 +1,17 @@
|
||||
#!/bin/sh
|
||||
#!/usr/bin/env bash
|
||||
#SOURCE: https://about.gitlab.com/install/#debian
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
NET_DEVICE='enp1s0'
|
||||
GITLAB_URL=$(ip -o -4 addr list ${NET_DEVICE} | awk '{print $4}' | cut -d/ -f1)
|
||||
#Base dependencies
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl openssh-server ca-certificates perl
|
||||
apt-get update
|
||||
apt-get install -y curl openssh-server ca-certificates perl
|
||||
#OPTIONAL: postfix
|
||||
#sudo apt-get install -y postfix
|
||||
#apt-get install -y postfix
|
||||
#Add gitlab repo
|
||||
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
|
||||
sudo EXTERNAL_URL="${GITLAB_URL}" apt-get install gitlab-ee
|
||||
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | bash
|
||||
EXTERNAL_URL="${GITLAB_URL}" apt-get install gitlab-ee
|
||||
20
vm_example_scripts/gitlab_ce_fedora.sh
Executable file
20
vm_example_scripts/gitlab_ce_fedora.sh
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
#Source: https://docs.gitlab.com/install/package/almalinux/?tab=Community+Edition
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
NET_DEVICE='enp1s0'
|
||||
GITLAB_URL=$(ip -o -4 addr list ${NET_DEVICE} | awk '{print $4}' | cut -d/ -f1)
|
||||
|
||||
#Enable sshd. enabled on cloud-image by default
|
||||
#systemctl enable --now sshd
|
||||
#Set firewall rules
|
||||
firewall-cmd --permanent --add-service=http
|
||||
firewall-cmd --permanent --add-service=https
|
||||
firewall-cmd --permanent --add-service=ssh
|
||||
systemctl reload firewalld
|
||||
#Add repo
|
||||
curl "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh" | bash
|
||||
#Install Gitlab CE
|
||||
EXTERNAL_URL="${GITLAB_URL}" dnf install gitlab-ce
|
||||
@ -1,12 +0,0 @@
|
||||
#!/bin/sh
|
||||
#SOURCE: https://about.gitlab.com/install/#debian
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-gitlab-runner.pref
|
||||
Explanation: Prefer GitLab provided packages over the Debian native ones
|
||||
Package: gitlab-runner
|
||||
Pin: origin packages.gitlab.com
|
||||
Pin-Priority: 1001
|
||||
EOF
|
||||
sudo apt-get update
|
||||
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
|
||||
sudo apt-get -y install gitlab-runner
|
||||
16
vm_example_scripts/gitlab_runner_deb.sh
Executable file
16
vm_example_scripts/gitlab_runner_deb.sh
Executable file
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
#SOURCE: https://about.gitlab.com/install/#debian
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
# cat <<EOF | tee /etc/apt/preferences.d/pin-gitlab-runner.pref
|
||||
# Explanation: Prefer GitLab provided packages over the Debian native ones
|
||||
# Package: gitlab-runner
|
||||
# Pin: origin packages.gitlab.com
|
||||
# Pin-Priority: 1001
|
||||
# EOF
|
||||
apt-get update
|
||||
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash
|
||||
apt-get -y install gitlab-runner
|
||||
8
vm_example_scripts/gitlab_runner_fedora.sh
Executable file
8
vm_example_scripts/gitlab_runner_fedora.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
#SOURCE: https://docs.gitlab.com/runner/install/
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
|
||||
sudo dnf -Y install gitlab-runner
|
||||
60
vm_example_scripts/gitlab_runner_freebsd.sh
Executable file
60
vm_example_scripts/gitlab_runner_freebsd.sh
Executable file
@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env sh
|
||||
#SOURCE: https://docs.gitlab.com/runner/install/
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
#Creating gitlab user
|
||||
sudo pw group add -n gitlab-runner
|
||||
sudo pw user add -n gitlab-runner -g gitlab-runner -s /bin/sh
|
||||
sudo mkdir /home/gitlab-runner
|
||||
sudo chown gitlab-runner:gitlab-runner /home/gitlab-runner
|
||||
|
||||
#Downloading binary and giving permissions
|
||||
sudo fetch -o /usr/local/bin/gitlab-runner https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/binaries/gitlab-runner-freebsd-amd64
|
||||
sudo chmod +x /usr/local/bin/gitlab-runner
|
||||
|
||||
#Creating logfile and giving permissions
|
||||
sudo touch /var/log/gitlab_runner.log && sudo chown gitlab-runner:gitlab-runner /var/log/gitlab_runner.log
|
||||
|
||||
#Creating rc service
|
||||
mkdir -p /usr/local/etc/rc.d
|
||||
sudo sh -c 'cat > /usr/local/etc/rc.d/gitlab_runner' << "EOF"
|
||||
#!/bin/sh
|
||||
# PROVIDE: gitlab_runner
|
||||
# REQUIRE: DAEMON NETWORKING
|
||||
# BEFORE:
|
||||
# KEYWORD:
|
||||
|
||||
. /etc/rc.subr
|
||||
|
||||
name="gitlab_runner"
|
||||
rcvar="gitlab_runner_enable"
|
||||
|
||||
user="gitlab-runner"
|
||||
user_home="/home/gitlab-runner"
|
||||
command="/usr/local/bin/gitlab-runner"
|
||||
command_args="run"
|
||||
pidfile="/var/run/${name}.pid"
|
||||
|
||||
start_cmd="gitlab_runner_start"
|
||||
|
||||
gitlab_runner_start()
|
||||
{
|
||||
export USER=${user}
|
||||
export HOME=${user_home}
|
||||
if checkyesno ${rcvar}; then
|
||||
cd ${user_home}
|
||||
/usr/sbin/daemon -u ${user} -p ${pidfile} ${command} ${command_args} > /var/log/gitlab_runner.log 2>&1
|
||||
fi
|
||||
}
|
||||
|
||||
load_rc_config $name
|
||||
run_rc_command $1
|
||||
EOF
|
||||
|
||||
sudo chmod +x /usr/local/etc/rc.d/gitlab_runner
|
||||
|
||||
echo "Now register a runner and then:"
|
||||
echo "sudo sysrc gitlab_runner_enable=YES"
|
||||
echo "sudo service gitlab_runner start"
|
||||
@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
HAPROXY_URL="https://github.com/haproxytech/kubernetes-ingress/releases/download/v1.10.11/haproxy-ingress-controller_1.10.11_Linux_x86_64.tar.gz"
|
||||
# Install HAProxy
|
||||
apt update
|
||||
|
||||
0
vm_example_scripts/init_freebsd.sh
Normal file → Executable file
0
vm_example_scripts/init_freebsd.sh
Normal file → Executable file
@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
helm repo add jenkins https://charts.jenkins.io
|
||||
helm repo update
|
||||
kubectl create namespace jenkins
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
|
||||
VM_USER="user"
|
||||
VM=$1
|
||||
|
||||
7
vm_example_scripts/podman_deb.sh
Executable file
7
vm_example_scripts/podman_deb.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
apt-get update
|
||||
apt-get -y install podman buildah
|
||||
7
vm_example_scripts/podman_fedora.sh
Executable file
7
vm_example_scripts/podman_fedora.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Exit on error, undefined vars, and pipe failures
|
||||
set -euo pipefail
|
||||
|
||||
dnf update
|
||||
dnf -y install podman buildah
|
||||
62
vm_example_scripts/podman_freebsd.sh
Normal file
62
vm_example_scripts/podman_freebsd.sh
Normal file
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env sh
|
||||
# Source: https://podman.io/docs/installation#installing-on-freebsd-140
|
||||
|
||||
# Variables
|
||||
LINE='fdesc /dev/fd fdescfs rw 0 0'
|
||||
FSTAB="/etc/fstab"
|
||||
FD_MOUNTPOINT="/dev/fd"
|
||||
FSTYPE="fdescfs"
|
||||
SERVICE_NAME='linux'
|
||||
|
||||
# Enable Linux compatibility
|
||||
sysrc linux_enable=YES
|
||||
|
||||
# Start the service if not running
|
||||
if ! service "${SERVICE_NAME}" status >/dev/null 2>&1; then
|
||||
if ! service "${SERVICE_NAME}" start; then
|
||||
echo "Error: Cannot start ${SERVICE_NAME}." >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "Service ${SERVICE_NAME} started"
|
||||
fi
|
||||
|
||||
# Add fdescfs to /etc/fstab if not present
|
||||
if ! grep -q 'fdesc[[:space:]]\+/dev/fd[[:space:]]\+fdescfs[[:space:]]\+rw[[:space:]]\+0[[:space:]]\+0' "$FSTAB"; then
|
||||
printf '%s\n' "$LINE" | tee -a "$FSTAB" > /dev/null
|
||||
fi
|
||||
|
||||
# Install and enable Podman
|
||||
pkg install -y podman-suite
|
||||
service podman enable
|
||||
|
||||
# Mount fdescfs if not already mounted
|
||||
if ! mount | grep -w "${FD_MOUNTPOINT}" | grep -q "$FSTYPE"; then
|
||||
mount -t fdescfs fdesc /dev/fd
|
||||
fi
|
||||
|
||||
# Configure pf firewall
|
||||
cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf
|
||||
sed -i '' 's/ix0/vtnet0/g' /etc/pf.conf
|
||||
|
||||
# Enable pf at boot
|
||||
if ! grep -q 'pf_load="YES"' "/boot/loader.conf"; then
|
||||
echo 'pf_load="YES"' | tee -a /boot/loader.conf > /dev/null
|
||||
fi
|
||||
|
||||
# Load pf module and enable local filtering
|
||||
kldload pf
|
||||
sysctl net.pf.filter_local=1
|
||||
|
||||
if ! grep -q 'net.pf.filter_local=1' "/etc/sysctl.conf.local"; then
|
||||
echo 'net.pf.filter_local=1' | tee -a /etc/sysctl.conf.local > /dev/null
|
||||
fi
|
||||
|
||||
service pf enable
|
||||
service pf restart
|
||||
|
||||
# Configure storage backend
|
||||
if pgrep -x zfskern >/dev/null 2>&1; then
|
||||
zfs create -o mountpoint=/var/db/containers zroot/containers
|
||||
else
|
||||
sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf
|
||||
fi
|
||||
41
vm_get_ip.sh
41
vm_get_ip.sh
@ -1,41 +0,0 @@
|
||||
#!/bin/env bash
|
||||
usage() {
|
||||
cat << EOF
|
||||
USO: $0 VM
|
||||
|
||||
Este script recupera la dirección IP de una máquina virtual administrada por virsh.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# Función para obtener la dirección IP de la máquina virtual
|
||||
get_vm_ip_address() {
|
||||
local VM="$1"
|
||||
|
||||
# Obtener la dirección MAC de la interfaz de red
|
||||
MAC_VM=$(virsh domiflist "$VM" | awk '{ print $5 }' | tail -2 | head -1)
|
||||
if [[ -z "$MAC_VM" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección MAC para '$VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Obtener la dirección IP a partir de la dirección MAC
|
||||
VM_IP_ADDRESS=$(arp -a | grep "$MAC_VM" | awk '{ print $2 }' | sed 's/[()]//g')
|
||||
if [[ -z "$VM_IP_ADDRESS" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección IP para la dirección MAC '$MAC_VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$VM_IP_ADDRESS"
|
||||
}
|
||||
|
||||
# Obtener el nombre del host de la máquina virtual
|
||||
VM="$1"
|
||||
|
||||
if [[ -z "$VM" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtener la dirección IP de la máquina virtual
|
||||
get_vm_ip_address "$VM"
|
||||
@ -1,88 +0,0 @@
|
||||
#!/bin/env bash
|
||||
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
|
||||
VM_USER="user"
|
||||
VM=$1
|
||||
VM_IP=''
|
||||
SCRIPT=''
|
||||
VM_DISTRO=''
|
||||
VM_VERSION=''
|
||||
usage() {
|
||||
cat << EOF
|
||||
USO: $0 VM
|
||||
|
||||
Este script instala algunos programas en la VM seleccionada
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# Función para obtener la dirección IP de la máquina virtual
|
||||
get_vm_ip_address() {
|
||||
local VM="$1"
|
||||
|
||||
# Obtener la dirección MAC de la interfaz de red
|
||||
MAC_VM=$(virsh domiflist "$VM" | awk '{ print $5 }' | tail -2 | head -1)
|
||||
if [[ -z "$MAC_VM" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección MAC para '$VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Obtener la dirección IP a partir de la dirección MAC
|
||||
VM_IP_ADDRESS=$(arp -a | grep "$MAC_VM" | awk '{ print $2 }' | sed 's/[()]//g')
|
||||
if [[ -z "$VM_IP_ADDRESS" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección IP para la dirección MAC '$MAC_VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$VM_IP_ADDRESS"
|
||||
}
|
||||
|
||||
obtener_info_vm() {
|
||||
# Obtener el ID del sistema operativo
|
||||
# Obtener el ID del sistema operativo
|
||||
OS_ID=$(grep -o 'id="[^"]*"' "$1" | tr -d '"' | awk '{print $1}')
|
||||
|
||||
# Eliminar el protocolo y el dominio del ID
|
||||
OS_ID=$(echo "$OS_ID" | cut -d '/' -f 2-)
|
||||
echo $OS_ID
|
||||
# Convertir la URL a un nombre de distribución y versión
|
||||
VM_DISTRO=$(echo "$OS_ID" | awk -F '/' '{print $3}')
|
||||
VM_VERSION=$(echo "$OS_ID" | awk -F '/' '{print $4}')
|
||||
|
||||
}
|
||||
|
||||
# Obtener el nombre del host de la máquina virtual
|
||||
VM="$1"
|
||||
|
||||
if [[ -z "$VM" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Obtener la dirección IP de la máquina virtual
|
||||
VM_IP=$(get_vm_ip_address "$VM")
|
||||
obtener_info_vm ${VM_BASE_DIR}/xml/${VM}.xml
|
||||
while true; do
|
||||
read -r -p $'Select software to install:\n 1.Docker\n 2.Gitlab CE\n 3.Gitlab runner\n 4.Kubernetes Single cluster\n' -n1 answer
|
||||
case $answer in
|
||||
[1]* )
|
||||
if [[ "$VM_DISTRO" == "debian" ]]; then
|
||||
SCRIPT='../vm_example_scripts/docker_debian.sh'
|
||||
elif [[ "$VM_DISTRO" == "ubuntu" ]]; then
|
||||
SCRIPT='../vm_example_scripts/docker_ubuntu.sh'
|
||||
fi
|
||||
break;;
|
||||
[2]* ) SCRIPT='../vm_example_scripts/gitlab_ce.sh'
|
||||
break;;
|
||||
[3]* ) SCRIPT='../vm_example_scripts/gitlab_runner.sh'
|
||||
break;;
|
||||
[4]* ) cd ../vm_example_scripts/
|
||||
./k8s.sh $VM
|
||||
break;;
|
||||
* ) echo "Please answer 1,2,3 or 4.";;
|
||||
esac
|
||||
done
|
||||
if [[ -z "$SCRIPT" ]]; then
|
||||
exit 0
|
||||
else
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USER} ${VM_IP} "bash -s" -- < ${SCRIPT}
|
||||
fi
|
||||
@ -1,2 +0,0 @@
|
||||
#!/bin/env bash
|
||||
virsh list
|
||||
171
vm_manage.sh
Executable file
171
vm_manage.sh
Executable file
@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env -S bash
|
||||
|
||||
source env_scripts/common.sh
|
||||
source env_scripts/functions.sh
|
||||
# Default values for VM creation parameters
|
||||
VM_MEM_SIZE=1024
|
||||
VM_VCPUS=1
|
||||
VM_DISK_SIZE=10
|
||||
|
||||
# Function to display usage message
|
||||
usage() {
|
||||
less << EOF
|
||||
NAME
|
||||
$0
|
||||
|
||||
USAGE
|
||||
Usage: $0 create -n NAME [-b BRIDGE] [-r RAM] [-c VCPUS] [-s DISK] [-v]
|
||||
$0 delete NAME
|
||||
$0 info NAME
|
||||
$0 connect NAME
|
||||
$0 install NAME
|
||||
$0 list
|
||||
|
||||
ACTIONS
|
||||
create Create a new virtual machine
|
||||
delete Delete a virtual machine
|
||||
list List all defined virtual machines
|
||||
info Show information about a virtual machine
|
||||
connect Connect to the console of a virtual machine
|
||||
install Install specific software into an existing VM
|
||||
|
||||
OPTIONS
|
||||
-h Show this help message
|
||||
-n NAME Host name (required)
|
||||
-b BRIDGE Bridge interface name
|
||||
-H Host Only Network
|
||||
-r RAM RAM in MB (default: ${VM_MEM_SIZE})
|
||||
-c VCPUS Number of VCPUs (default: ${VM_VCPUS})
|
||||
-s DISK Disk size in GB (default: ${VM_DISK_SIZE})
|
||||
-v Verbose mode
|
||||
|
||||
AUTHOR
|
||||
Victor Gracia Enguita <victor@burufalla.ovh>
|
||||
|
||||
COPYRIGHT
|
||||
This is free software; see the source for copying conditions.
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
# Check if at least one argument is provided
|
||||
if [ $# -eq 0 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
ACTION="$1"
|
||||
shift
|
||||
|
||||
case "${ACTION}" in
|
||||
create)
|
||||
# Parse options for create command
|
||||
VERBOSE=false
|
||||
NAME_SET=false
|
||||
source env_scripts/common.sh
|
||||
while getopts ":hn:b:Hr:c:s:v" opt; do
|
||||
case "${opt}" in
|
||||
h)
|
||||
usage
|
||||
;;
|
||||
n)
|
||||
VM_HOSTNAME="${OPTARG}"
|
||||
NAME_SET=true
|
||||
;;
|
||||
b)
|
||||
VM_BRIDGE_INT="${OPTARG}"
|
||||
VM_NETWORK_TYPE="bridge"
|
||||
;;
|
||||
H)
|
||||
VM_NETWORK_TYPE="isolated"
|
||||
;;
|
||||
r)
|
||||
VM_MEM_SIZE="${OPTARG}"
|
||||
;;
|
||||
c)
|
||||
VM_VCPUS="${OPTARG}"
|
||||
;;
|
||||
s)
|
||||
VM_DISK_SIZE="${OPTARG}"
|
||||
;;
|
||||
v)
|
||||
VERBOSE=true
|
||||
;;
|
||||
\?)
|
||||
echo "Invalid option: -${OPTARG}" >&2
|
||||
usage
|
||||
;;
|
||||
:)
|
||||
echo "Option -${OPTARG} requires an argument." >&2
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Check that required parameter (-n) was provided
|
||||
if ! ${NAME_SET}; then
|
||||
echo "Error: The -n option is required for create action." >&2
|
||||
usage
|
||||
fi
|
||||
|
||||
detect_distro
|
||||
#Check network type
|
||||
vm_net_set_network_type
|
||||
#Check host os for guest debian type
|
||||
check_host_os
|
||||
#Read os_options.json and generate guests menu
|
||||
#Select guest
|
||||
show_vm_menu
|
||||
#Set guest type based on check_host_os
|
||||
vm_set_guest_type
|
||||
#set image permissions
|
||||
chown_image_permissions
|
||||
if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then
|
||||
generate_openbsd_image
|
||||
else
|
||||
#Download cloud image
|
||||
vm_download_base_image
|
||||
#Compare hashes
|
||||
compare_checksum
|
||||
#Create guest image
|
||||
vm_create_guest_image
|
||||
fi
|
||||
#Generate ssh key
|
||||
vm_generate_ssh_hey
|
||||
#Generate meta-data file for VM
|
||||
vm_gen_meta_data
|
||||
#Generate user-data file for VM
|
||||
vm_gen_user_data
|
||||
#Install VM
|
||||
vm_guest_install
|
||||
;;
|
||||
|
||||
delete|info|connect)
|
||||
# These actions require a NAME directly as first argument after ACTION
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Error: ${ACTION} requires a VM name as argument." >&2
|
||||
usage
|
||||
fi
|
||||
VM_HOSTNAME="$1"
|
||||
source env_scripts/common.sh
|
||||
if [[ "${ACTION}" == 'delete' ]]; then
|
||||
vm_delete ${VM_HOSTNAME}
|
||||
elif [[ "${ACTION}" == 'info' ]]; then
|
||||
vm_net_get_ip ${VM_HOSTNAME}
|
||||
elif [[ "${ACTION}" == 'connect' ]]; then
|
||||
vm_connect ${VM_HOSTNAME}
|
||||
fi
|
||||
;;
|
||||
install)
|
||||
VM_HOSTNAME="$1"
|
||||
show_software_menu
|
||||
vm_install_utils $VM_HOSTNAME
|
||||
;;
|
||||
list)
|
||||
vm_list
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown action: ${ACTION}" >&2
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
exit 0
|
||||
80
vm_set_ip.sh
80
vm_set_ip.sh
@ -1,80 +0,0 @@
|
||||
#!/bin/env bash
|
||||
|
||||
VM_BASE_DIR=${VM_BASE_DIR:-"${HOME}/vms"}
|
||||
VM_USER="user"
|
||||
MAC_VM=
|
||||
usage() {
|
||||
cat << EOF
|
||||
USO: $0 VM
|
||||
|
||||
Este script setea la dirección IP de una máquina virtual administrada por virsh.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# Función para obtener la dirección IP de la máquina virtual
|
||||
get_vm_ip_address() {
|
||||
local VM="$1"
|
||||
|
||||
# Obtener la dirección MAC de la interfaz de red
|
||||
MAC_VM=$(virsh domiflist "$VM" | awk '{ print $5 }' | tail -2 | head -1)
|
||||
if [[ -z "$MAC_VM" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección MAC para '$VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Obtener la dirección IP a partir de la dirección MAC
|
||||
VM_IP_ADDRESS=$(arp -a | grep "$MAC_VM" | awk '{ print $2 }' | sed 's/[()]//g')
|
||||
if [[ -z "$VM_IP_ADDRESS" ]]; then
|
||||
echo "Error: No se pudo encontrar la dirección IP para la dirección MAC '$MAC_VM'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$VM_IP_ADDRESS"
|
||||
}
|
||||
|
||||
|
||||
define_netplan()
|
||||
{
|
||||
cat <<EOF > "$VM_BASE_DIR/init/${VM}-netplan"
|
||||
# This file is generated from information provided by the datasource. Changes
|
||||
# to it will not persist across an instance reboot. To disable cloud-init's
|
||||
# network configuration capabilities, write a file
|
||||
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
|
||||
# network: {config: disabled}
|
||||
network:
|
||||
ethernets:
|
||||
enp1s0:
|
||||
addresses:
|
||||
- ${IP}/24
|
||||
nameservers:
|
||||
addresses:
|
||||
- 208.67.222.222
|
||||
- 208.67.220.220
|
||||
match:
|
||||
macaddress: ${MAC_VM}
|
||||
set-name: enp1s0
|
||||
version: 2
|
||||
EOF
|
||||
}
|
||||
# Obtener el nombre del host de la máquina virtual
|
||||
VM="$1"
|
||||
IP="$2"
|
||||
if [[ -z "$VM" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -z "$IP" ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
MAC_VM=$(virsh domiflist "$VM" | awk '{ print $5 }' | tail -2 | head -1)
|
||||
CURRENT_IP=$(get_vm_ip_address "$VM")
|
||||
define_netplan
|
||||
# Obtener la dirección IP de la máquina virtual
|
||||
scp -i ${VM_BASE_DIR}/ssh/${VM} \
|
||||
-r $VM_BASE_DIR/init/${VM}-netplan \
|
||||
${VM_USER}@${CURRENT_IP}:50-cloud-init.yaml
|
||||
ssh -i ${VM_BASE_DIR}/ssh/${VM} -l${VM_USER} ${CURRENT_IP} "bash -s" -- < ../vm_example_scripts/apply_netplan.sh
|
||||
|
||||
3
vm_template_files/dnsmasq_conf_dhcp
Normal file
3
vm_template_files/dnsmasq_conf_dhcp
Normal file
@ -0,0 +1,3 @@
|
||||
#dhcp-range=192.168.0.50,192.168.0.150,255.255.255.0,12h@@@dhcp-range=${LOCAL_NETWORK}.${LOCAL_NETWORK_DHCP_FIRST_IP},${LOCAL_NETWORK_DHCP_LAST_IP},${LOCAL_NETWORK_DHCP_LEASE}
|
||||
#dhcp-option=121,192.168.1.0/24,1.2.3.4,10.0.0.0/8,5.6.7.8@@@dhcp-option=121,${LOCAL_NETWORK_RANGE},${LOCAL_NETWORK_GATEWAY}
|
||||
#dhcp-option=3,1.2.3.4@@@dhcp-option=3,${LOCAL_NETWORK_GATEWAY}
|
||||
11
vm_template_files/dnsmasq_conf_dns
Normal file
11
vm_template_files/dnsmasq_conf_dns
Normal file
@ -0,0 +1,11 @@
|
||||
#interface=@@@interface=${INTERFACE}
|
||||
#domain-needed@@@domain-needed
|
||||
#bogus-priv@@@bogus-priv
|
||||
#local=/localnet/@@@local=/local/
|
||||
#listen-address=@@@listen-adress=${JAIL_IP_ADDRESS}
|
||||
#bind-interfaces@@@bind-interfaces
|
||||
#no-hosts@@@no-hosts
|
||||
#cache-size=150@@@cache-size=1000
|
||||
#conf-dir=/etc/dnsmasq.d/,*.conf@@@conf-dir=/usr/local/etc/dnsmasq.conf.d/,*.conf
|
||||
#conf-file=/usr/local/share/dnsmasq/trust-anchors.conf@@@conf-file=/usr/local/share/dnsmasq/trust-anchors.conf
|
||||
#dnssec@@@dnssec
|
||||
3
vm_template_files/dnsmasq_conf_pxe
Normal file
3
vm_template_files/dnsmasq_conf_pxe
Normal file
@ -0,0 +1,3 @@
|
||||
#enable-tftp@@@enable-tftp
|
||||
#tftp-root=/var/ftpd@@@tftp-root=/var/lib/tftp
|
||||
#dhcp-boot=pxelinux.0@@@dhcp-boot=netboot.xyz.kpxe
|
||||
3
vm_template_files/dnsmasq_lists.txt
Normal file
3
vm_template_files/dnsmasq_lists.txt
Normal file
@ -0,0 +1,3 @@
|
||||
https://blocklistproject.github.io/Lists/dnsmasq-version/ads-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/01-ads-dnsmasq.conf
|
||||
https://blocklistproject.github.io/Lists/dnsmasq-version/facebook-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/02-facebook-dnsmasq.conf
|
||||
https://blocklistproject.github.io/Lists/dnsmasq-version/tracking-dnsmasq.txt@@@${DNSMASQ_DCONF_DIR}/03-tracking-dnsmasq.conf
|
||||
Reference in New Issue
Block a user