Add bolt scripting to create VMs
This commit is contained in:
parent
aecb97e68f
commit
ec854a9c27
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
17
README.md
17
README.md
@ -8,6 +8,8 @@ Note that the following steps are derived from this [guide](https://www.pugetsys
|
|||||||
|
|
||||||
[Autoinstall configuration reference manual](https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html)
|
[Autoinstall configuration reference manual](https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html)
|
||||||
|
|
||||||
|
## Generating the autoinstall ISO
|
||||||
|
|
||||||
1. Install necessary packages
|
1. Install necessary packages
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -111,4 +113,17 @@ sudo apt install yamllint
|
|||||||
yamllint server/user-data
|
yamllint server/user-data
|
||||||
```
|
```
|
||||||
|
|
||||||
Once the `xorriso` command is run successfully, the `ubuntu-22.04-autoinstall.iso` will be created in the `iso-build` directory.
|
Once the `xorriso` command is run successfully, the `ubuntu-22.04-autoinstall.iso` will be created in the `iso-build` directory.
|
||||||
|
|
||||||
|
## Creating the VM using Bolt
|
||||||
|
|
||||||
|
Update the parameters provided to the below plan run command as needed.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd bolt_vm_automation
|
||||||
|
bolt plan run bolt_vm_automation::create_vm \
|
||||||
|
target=roscoe \
|
||||||
|
vm_name=moeny-bank01 \
|
||||||
|
ip_with_cidr=100.40.223.189/24 \
|
||||||
|
hostname=moeny-bank01
|
||||||
|
```
|
7
bolt_vm_automation/.gitignore
vendored
Normal file
7
bolt_vm_automation/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.modules/
|
||||||
|
.resource_types/
|
||||||
|
bolt-debug.log
|
||||||
|
.plan_cache.json
|
||||||
|
.plugin_cache.json
|
||||||
|
.task_cache.json
|
||||||
|
.rerun.json
|
2
bolt_vm_automation/bolt-project.yaml
Normal file
2
bolt_vm_automation/bolt-project.yaml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
name: bolt_vm_automation
|
32
bolt_vm_automation/inventory.yaml
Normal file
32
bolt_vm_automation/inventory.yaml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
groups:
|
||||||
|
- name: remote-host
|
||||||
|
targets:
|
||||||
|
- name: roscoe
|
||||||
|
config:
|
||||||
|
transport: ssh
|
||||||
|
ssh:
|
||||||
|
host: 100.40.223.136
|
||||||
|
user: root
|
||||||
|
host-key-check: false
|
||||||
|
- name: siderack
|
||||||
|
config:
|
||||||
|
transport: ssh
|
||||||
|
ssh:
|
||||||
|
host: 100.40.223.138
|
||||||
|
user: root
|
||||||
|
host-key-check: false
|
||||||
|
|
||||||
|
- name: new-vm
|
||||||
|
targets:
|
||||||
|
- name: vm-template-staging
|
||||||
|
config:
|
||||||
|
transport: ssh
|
||||||
|
ssh:
|
||||||
|
host: 100.40.223.190
|
||||||
|
user: moeny
|
||||||
|
private-key: ~/.ssh/DMMF-20211104
|
||||||
|
host-key-check: false
|
||||||
|
|
||||||
|
config:
|
||||||
|
ssh:
|
||||||
|
native-ssh: true
|
95
bolt_vm_automation/plans/create_vm.yaml
Normal file
95
bolt_vm_automation/plans/create_vm.yaml
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
parameters:
|
||||||
|
target:
|
||||||
|
type: String
|
||||||
|
description: "Target host to create the VM on"
|
||||||
|
default: "roscoe"
|
||||||
|
iso_path:
|
||||||
|
type: String
|
||||||
|
description: "Path to the ISO file"
|
||||||
|
default: "/mnt/nfs/kvm-isos/iso-build/ubuntu-22.04-autoinstall.iso"
|
||||||
|
vm_name:
|
||||||
|
type: String
|
||||||
|
description: "Name of the VM"
|
||||||
|
default: "vm-template-staging"
|
||||||
|
ram:
|
||||||
|
type: Integer
|
||||||
|
description: "Amount of RAM in MB"
|
||||||
|
default: 2048
|
||||||
|
vcpus:
|
||||||
|
type: Integer
|
||||||
|
description: "Number of virtual CPUs"
|
||||||
|
default: 4
|
||||||
|
disk_size:
|
||||||
|
type: Integer
|
||||||
|
description: "Size of the disk in GB"
|
||||||
|
default: 100
|
||||||
|
disk_path:
|
||||||
|
type: String
|
||||||
|
description: "Base path for disk images"
|
||||||
|
default: "/mnt/nfs/kvm-images"
|
||||||
|
network:
|
||||||
|
type: String
|
||||||
|
description: "Network to connect the VM to"
|
||||||
|
default: "wan-verizon"
|
||||||
|
ip_with_cidr:
|
||||||
|
type: String
|
||||||
|
description: "Public IP of the VM"
|
||||||
|
default: "100.40.223.190/24"
|
||||||
|
hostname:
|
||||||
|
type: String
|
||||||
|
description: "Hostname of the VM"
|
||||||
|
default: "vm-template-staging"
|
||||||
|
dhcp:
|
||||||
|
type: Boolean
|
||||||
|
description: "Enable DHCP on the VM"
|
||||||
|
default: false
|
||||||
|
gateway:
|
||||||
|
type: String
|
||||||
|
description: "Gateway for the VM"
|
||||||
|
default: "100.40.223.1"
|
||||||
|
nameserver1:
|
||||||
|
type: String
|
||||||
|
description: "Primary nameserver for the VM"
|
||||||
|
default: "8.8.8.8"
|
||||||
|
nameserver2:
|
||||||
|
type: String
|
||||||
|
description: "Secondary nameserver for the VM"
|
||||||
|
default: "8.8.4.4"
|
||||||
|
nameserver3:
|
||||||
|
type: String
|
||||||
|
description: "Tertiary nameserver for the VM"
|
||||||
|
default: "1.1.1.1"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: create_vm
|
||||||
|
task: bolt_vm_automation::create_vm
|
||||||
|
targets: $target
|
||||||
|
parameters:
|
||||||
|
iso_path: $iso_path
|
||||||
|
vm_name: $vm_name
|
||||||
|
ram: $ram
|
||||||
|
vcpus: $vcpus
|
||||||
|
disk_size: $disk_size
|
||||||
|
disk_path: "${disk_path}/${vm_name}.qcow2"
|
||||||
|
network: $network
|
||||||
|
|
||||||
|
- name: install_docker
|
||||||
|
description: Install Docker on the VM
|
||||||
|
task: bolt_vm_automation::install_docker
|
||||||
|
targets: vm-template-staging
|
||||||
|
|
||||||
|
- name: system_setup
|
||||||
|
task: bolt_vm_automation::system_setup
|
||||||
|
targets: vm-template-staging
|
||||||
|
parameters:
|
||||||
|
ip_with_cidr: $ip_with_cidr
|
||||||
|
hostname: $hostname
|
||||||
|
dhcp: $dhcp
|
||||||
|
gateway: $gateway
|
||||||
|
nameserver1: $nameserver1
|
||||||
|
nameserver2: $nameserver2
|
||||||
|
nameserver3: $nameserver3
|
||||||
|
|
||||||
|
return:
|
||||||
|
message: "VM ${vm_name} created and updated successfully!"
|
40
bolt_vm_automation/tasks/create_vm.json
Normal file
40
bolt_vm_automation/tasks/create_vm.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"description": "Creates a new VM using virt-install",
|
||||||
|
"parameters": {
|
||||||
|
"iso_path": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Path to the autoinstall ISO",
|
||||||
|
"default": "/mnt/nfs/kvm-isos/iso-build/ubuntu-22.04-autoinstall.iso"
|
||||||
|
},
|
||||||
|
"vm_name": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Name of the VM",
|
||||||
|
"default": "vm-template-staging"
|
||||||
|
},
|
||||||
|
"ram": {
|
||||||
|
"type": "Integer",
|
||||||
|
"description": "Amount of RAM in MB",
|
||||||
|
"default": 2048
|
||||||
|
},
|
||||||
|
"vcpus": {
|
||||||
|
"type": "Integer",
|
||||||
|
"description": "Number of virtual CPUs",
|
||||||
|
"default": 4
|
||||||
|
},
|
||||||
|
"disk_size": {
|
||||||
|
"type": "Integer",
|
||||||
|
"description": "Size of the VM disk in GB",
|
||||||
|
"default": 100
|
||||||
|
},
|
||||||
|
"disk_path": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Base path for disk images",
|
||||||
|
"default": "/mnt/nfs/kvm-images/vm-template-staging.qcow2"
|
||||||
|
},
|
||||||
|
"network": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Network to connect the VM to",
|
||||||
|
"default": "wan-verizon"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
bolt_vm_automation/tasks/create_vm.sh
Normal file
31
bolt_vm_automation/tasks/create_vm.sh
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Input Variables
|
||||||
|
ISO_PATH=$PT_iso_path
|
||||||
|
VM_NAME=$PT_vm_name
|
||||||
|
RAM=$PT_ram
|
||||||
|
VCPUS=$PT_vcpus
|
||||||
|
DISK_SIZE=$PT_disk_size
|
||||||
|
DISK_PATH=$PT_disk_path
|
||||||
|
NETWORK=$PT_network
|
||||||
|
|
||||||
|
# Create VM disk if not already exists
|
||||||
|
if [ ! -f "$DISK_PATH" ]; then
|
||||||
|
qemu-img create -f qcow2 "$DISK_PATH" "$DISK_SIZE"G > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create VM
|
||||||
|
virt-install \
|
||||||
|
--name "$VM_NAME" \
|
||||||
|
--ram "$RAM" \
|
||||||
|
--vcpus "$VCPUS" \
|
||||||
|
--os-variant ubuntu22.04 \
|
||||||
|
--disk path="$DISK_PATH",format=qcow2 \
|
||||||
|
--cdrom "$ISO_PATH" \
|
||||||
|
--network network="$NETWORK" \
|
||||||
|
--graphics vnc \
|
||||||
|
--noautoconsole \
|
||||||
|
--autostart \
|
||||||
|
--wait -1
|
||||||
|
|
||||||
|
sleep 45
|
39
bolt_vm_automation/tasks/install_docker.sh
Normal file
39
bolt_vm_automation/tasks/install_docker.sh
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Update package list and install prerequisites
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
gnupg
|
||||||
|
|
||||||
|
# Add Docker's official GPG key
|
||||||
|
sudo install -m 0755 -d /etc/apt/keyrings
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/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/ubuntu \
|
||||||
|
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
|
||||||
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
|
||||||
|
# Update package list again and install Docker
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
# Add current user to docker group
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
|
||||||
|
# Start and enable Docker service
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo systemctl enable docker
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
if docker --version > /dev/null 2>&1; then
|
||||||
|
echo "Docker installed successfully"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "Docker installation failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
40
bolt_vm_automation/tasks/system_setup.json
Normal file
40
bolt_vm_automation/tasks/system_setup.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"description": "Configures system network settings using netplan",
|
||||||
|
"parameters": {
|
||||||
|
"ip_with_cidr": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "IP address for the VM",
|
||||||
|
"default": "100.40.223.190/24"
|
||||||
|
},
|
||||||
|
"hostname": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Hostname for the VM",
|
||||||
|
"default": "vm-template-staging"
|
||||||
|
},
|
||||||
|
"dhcp": {
|
||||||
|
"type": "Boolean",
|
||||||
|
"description": "Whether to use DHCP for network configuration",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"gateway": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Gateway IP address",
|
||||||
|
"default": "100.40.223.1"
|
||||||
|
},
|
||||||
|
"nameserver1": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Primary DNS nameserver",
|
||||||
|
"default": "8.8.8.8"
|
||||||
|
},
|
||||||
|
"nameserver2": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Secondary DNS nameserver",
|
||||||
|
"default": "8.8.4.4"
|
||||||
|
},
|
||||||
|
"nameserver3": {
|
||||||
|
"type": "String",
|
||||||
|
"description": "Tertiary DNS nameserver",
|
||||||
|
"default": "1.1.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
bolt_vm_automation/tasks/system_setup.sh
Normal file
51
bolt_vm_automation/tasks/system_setup.sh
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Using Bolt's environment variables
|
||||||
|
IP="${PT_ip_with_cidr}"
|
||||||
|
HOSTNAME="${PT_hostname}"
|
||||||
|
DHCP="${PT_dhcp}"
|
||||||
|
GATEWAY="${PT_gateway}"
|
||||||
|
NAMESERVER1="${PT_nameserver1}"
|
||||||
|
NAMESERVER2="${PT_nameserver2}"
|
||||||
|
NAMESERVER3="${PT_nameserver3}"
|
||||||
|
|
||||||
|
# Check if all required parameters are provided
|
||||||
|
if [ -z "$IP" ] || [ -z "$HOSTNAME" ] || [ -z "$DHCP" ] || [ -z "$GATEWAY" ] || [ -z "$NAMESERVER1" ] || [ -z "$NAMESERVER2" ] || [ -z "$NAMESERVER3" ]; then
|
||||||
|
echo "Missing required parameters. All parameters must be provided."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create the new netplan configuration
|
||||||
|
sudo tee /etc/netplan/50-cloud-init.yaml << EOL
|
||||||
|
network:
|
||||||
|
version: 2
|
||||||
|
ethernets:
|
||||||
|
enp1s0:
|
||||||
|
dhcp4: ${DHCP}
|
||||||
|
EOL
|
||||||
|
|
||||||
|
# If DHCP is false, add static IP configuration
|
||||||
|
if [ "$DHCP" = "false" ]; then
|
||||||
|
sudo tee -a /etc/netplan/50-cloud-init.yaml << EOL
|
||||||
|
addresses:
|
||||||
|
- ${IP}
|
||||||
|
routes:
|
||||||
|
- to: default
|
||||||
|
via: ${GATEWAY}
|
||||||
|
nameservers:
|
||||||
|
addresses: [${NAMESERVER1}, ${NAMESERVER2}, ${NAMESERVER3}]
|
||||||
|
EOL
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the hostname
|
||||||
|
sudo hostnamectl set-hostname "${HOSTNAME}"
|
||||||
|
echo "${HOSTNAME}" | sudo tee /etc/hostname > /dev/null
|
||||||
|
|
||||||
|
# Update /etc/hosts
|
||||||
|
sudo sed -i "s/127.0.1.1.*/127.0.1.1\t${HOSTNAME}/" /etc/hosts
|
||||||
|
|
||||||
|
echo "System configuration completed successfully"
|
||||||
|
|
||||||
|
# Apply network configuration in the background and exit before it takes effect
|
||||||
|
nohup bash -c "(sleep 2 && sudo netplan apply) &" > /dev/null 2>&1
|
||||||
|
exit 0
|
@ -43,4 +43,4 @@ autoinstall:
|
|||||||
shutdown: reboot
|
shutdown: reboot
|
||||||
|
|
||||||
late-commands:
|
late-commands:
|
||||||
- curtin in-target --target=/target apt-get update
|
- ["curtin", "in-target", "--target=/target", "--", "/bin/bash", "-c", "echo '%sudo ALL=(ALL) NOPASSWD: ALL' | tee -a /etc/sudoers.d/nopasswd_sudo_group"]
|
Loading…
Reference in New Issue
Block a user