Compare commits

...

3 Commits

6 changed files with 255 additions and 14 deletions

View File

@@ -4,13 +4,13 @@
get_fedora_latest_rawhide_url() {
local base_url="https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Cloud/x86_64/images/"
# Method 1: Try fetching the latest link from the directory
# Method: Try fetching the latest link from the directory
local temp_dir
temp_dir=$(mktemp -d)
# Download the HTML directory listing
if curl -s -o "$temp_dir/listing.html" "$base_url"; then
# Look for lines with qcow2 files that match our pattern
# Look for the most recent Fedora-Cloud-Base-Generic-Rawhide qcow2 file
local latest_file
latest_file=$(grep -i "Fedora-Cloud-Base-Generic-Rawhide.*\.qcow2" "$temp_dir/listing.html" | \
sort -r | head -1 | sed -E 's/.*href="([^"]*)".*/\1/')
@@ -18,15 +18,15 @@ get_fedora_latest_rawhide_url() {
if [[ -n "$latest_file" ]]; then
echo "${base_url}${latest_file}"
else
# If we can't find a specific file, try to find any valid Fedora image
# If we can't find Fedora-Cloud-Base-Generic-Rawhide specifically,
# look for any Fedora image with a qcow2 extension
local any_file
any_file=$(grep -i "Fedora-Cloud-Base-Generic.*\.qcow2" "$temp_dir/listing.html" | \
any_file=$(grep -i "Fedora.*\.qcow2" "$temp_dir/listing.html" | \
head -1 | sed -E 's/.*href="([^"]*)".*/\1/')
if [[ -n "$any_file" ]]; then
echo "${base_url}${any_file}"
else
# Return empty string if we can't find any valid file
echo ""
fi
fi
@@ -39,6 +39,24 @@ get_fedora_latest_rawhide_url() {
rm -rf "$temp_dir"
}
# Function to check if a Fedora Rawhide image already exists in the target directory
check_fedora_rawhide_exists() {
local target_dir="$1"
# Look for any existing Fedora Rawhide image by pattern
if [[ -d "$target_dir" ]]; then
local exists
exists=$(find "$target_dir" -maxdepth 1 -type f -name "*Fedora-Cloud-Base-Generic-Rawhide*.qcow2" 2>/dev/null | head -1)
if [[ -n "$exists" ]]; then
echo "true"
else
echo "false"
fi
else
echo "false"
fi
}
# Image URLs with dynamic Fedora URL handling
IMAGES=(
"https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.raw"
@@ -49,10 +67,13 @@ IMAGES=(
"https://cloud.centos.org/centos/10-stream/x86_64/images/CentOS-Stream-GenericCloud-x86_64-10-latest.x86_64.qcow2"
)
# Add Fedora image if we can get a valid URL
FEDORA_URL=$(get_fedora_latest_rawhide_url)
if [[ -n "$FEDORA_URL" ]]; then
IMAGES+=("$FEDORA_URL")
# Add Fedora image if we can get a valid URL AND no Fedora Rawhide image exists
FEDORA_EXISTS=$(check_fedora_rawhide_exists "/var/lib/libvirt/images")
if [[ "$FEDORA_EXISTS" == "false" ]]; then
FEDORA_URL=$(get_fedora_latest_rawhide_url)
if [[ -n "$FEDORA_URL" ]]; then
IMAGES+=("$FEDORA_URL")
fi
fi
# Target directory

192
main_launcher.sh Executable file
View File

@@ -0,0 +1,192 @@
#!/bin/bash
# Main launcher script for terraform image management tools
# This script provides a menu interface to run the other scripts in proper order
# Function to display usage
usage() {
echo "Usage: $0 [options]"
echo " options:"
echo " -h, --help Display this help message"
echo " -y, --yes Automatically answer 'yes' to all prompts"
echo " -n, --no Automatically answer 'no' to all prompts"
echo ""
echo "Example:"
echo " $0 # Interactive mode with default 'yes'"
echo " $0 -y # Non-interactive mode with auto 'yes'"
echo " $0 -n # Non-interactive mode with auto 'no'"
exit 1
}
# Parse command line arguments
AUTO_YES=false
AUTO_NO=false
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
usage
;;
-y|--yes)
AUTO_YES=true
shift
;;
-n|--no)
AUTO_NO=true
shift
;;
*)
echo "Unknown option: $1"
usage
;;
esac
done
# Function to get user confirmation
confirm() {
local prompt="$1"
local default="$2" # "yes" or "no"
if [[ "$AUTO_YES" = true ]]; then
echo "$prompt [Y/n]: yes"
return 0
elif [[ "$AUTO_NO" = true ]]; then
echo "$prompt [y/N]: no"
return 1
fi
# Default behavior - yes is default
if [[ "$default" = "no" ]]; then
echo -n "$prompt [y/N]: "
else
echo -n "$prompt [Y/n]: "
fi
read -r answer
# If empty answer, use default
if [[ -z "$answer" ]]; then
answer="$default"
fi
# Convert to lowercase for comparison
answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')
if [[ "$answer" = "y" || "$answer" = "yes" ]]; then
return 0
else
return 1
fi
}
# Function to check if a script exists and is executable
check_script() {
local script="$1"
if [[ ! -f "$script" ]] || [[ ! -x "$script" ]]; then
echo "Error: Script '$script' not found or not executable"
return 1
fi
return 0
}
# Function to run a script with proper error handling
run_script() {
local script="$1"
local description="$2"
local args="$3"
echo "=== $description ==="
if check_script "$script"; then
if [[ -n "$args" ]]; then
echo "Running: $script $args"
"$script" "$args"
else
echo "Running: $script"
"$script"
fi
local exit_code=$?
if [[ $exit_code -eq 0 ]]; then
echo "$description completed successfully"
return 0
else
echo "$description failed with exit code $exit_code"
return 1
fi
else
echo "$description skipped due to missing script"
return 1
fi
}
# Function to check if libvirt images directory exists
check_images_directory() {
local image_dir="/var/lib/libvirt/images"
if [[ ! -d "$image_dir" ]]; then
echo "Warning: Directory $image_dir does not exist"
if confirm "Would you like to create it?" "yes"; then
if ! sudo mkdir -p "$image_dir"; then
echo "Error: Could not create directory $image_dir"
return 1
fi
echo "Directory $image_dir created successfully"
else
echo "Skipping image directory check"
fi
else
echo "Directory $image_dir exists"
fi
return 0
}
# Main execution logic
main() {
echo "=== Terraform Image Management Launcher ==="
echo
# Validate image directory
if ! check_images_directory; then
echo "Exiting due to image directory issues"
exit 1
fi
echo
# Ask if user wants to download images
if confirm "Do you want to download OS images?" "yes"; then
if ! run_script "./download_images.sh" "Downloading OS Images"; then
echo "Image download failed. Proceeding to update script..."
fi
fi
echo
# Ask if user wants to update image locations
if confirm "Do you want to update image locations to use local files?" "yes"; then
if ! run_script "./update_image_locations.sh" "Updating Image Locations"; then
echo "Image location update failed"
exit 1
fi
fi
echo
# Ask if user wants to update SSH keys
if confirm "Do you want to update SSH keys in terraform files?" "yes"; then
if ! run_script "./update_ssh_keys.sh" "Updating SSH Keys"; then
echo "SSH key update failed"
exit 1
fi
fi
echo
echo "=== All operations completed ==="
}
# Run main function if script is executed directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi

View File

@@ -16,6 +16,18 @@ variable "pool_path" {
default = "/opt/tf_tmp_storage"
}
variable "disk_size_gb" {
description = "Disk size in GB"
type = number
default = 20
}
variable "disk_size_bytes" {
description = "Disk size in bytes"
type = number
default = 20 * 1024 * 1024 * 1024
}
variable "instance_count" {
description = "Number of instances to create"
type = number

View File

@@ -1,9 +1,25 @@
resource "libvirt_volume" "vm_disk" {
count = var.instance_count
name = "${var.vm_name}-${count.index}"
# Base volume (template/parent)
resource "libvirt_volume" "base_vm_image" {
name = "${var.vm_name}-base"
pool = "${var.vm_name}-pool"
source = var.image_location
format = "qcow2"
depends_on = [libvirt_pool.tf_tmp_storage]
depends_on = [
libvirt_pool.tf_tmp_storage
]
}
# Clone volume with resizable size
resource "libvirt_volume" "vm_disk" {
count = var.instance_count
name = "${var.vm_name}-${count.index}"
pool = "${var.vm_name}-pool"
format = "qcow2"
size = var.disk_size_bytes
base_volume_id = libvirt_volume.base_vm_image.id
depends_on = [
libvirt_volume.base_vm_image
]
}