Initial commit: Turbo Mothership bare metal management cluster
- k0s bootstrap with Cilium and OpenEBS - ArgoCD apps for infra, CAPI, Tinkerbell, and Netris - Ansible playbooks for virtual baremetal lab and Netris switches - CAPI provider manifests for k0smotron and Tinkerbell
This commit is contained in:
159
ansible/virtual-bm/create-vms.yml
Normal file
159
ansible/virtual-bm/create-vms.yml
Normal file
@@ -0,0 +1,159 @@
|
||||
---
|
||||
- name: Create virtual baremetal VMs with VirtualBMC
|
||||
hosts: local
|
||||
become: true
|
||||
gather_facts: false
|
||||
|
||||
vars:
|
||||
vbmc_user: admin
|
||||
vbmc_password: password
|
||||
bridge_name: br-mgmt
|
||||
vm_vcpus: 6
|
||||
vm_ram: 6144
|
||||
vm_disk_size: 60
|
||||
disk_path: /var/lib/libvirt/images
|
||||
|
||||
vms:
|
||||
- name: vm1
|
||||
mac: "52:54:00:12:34:01"
|
||||
vbmc_port: 6231
|
||||
- name: vm2
|
||||
mac: "52:54:00:12:34:02"
|
||||
vbmc_port: 6232
|
||||
- name: vm3
|
||||
mac: "52:54:00:12:34:03"
|
||||
vbmc_port: 6233
|
||||
|
||||
tasks:
|
||||
- name: Install required packages
|
||||
ansible.builtin.apt:
|
||||
name:
|
||||
- python3-pip
|
||||
- ovmf
|
||||
state: present
|
||||
update_cache: false
|
||||
|
||||
- name: Install virtualbmc
|
||||
ansible.builtin.pip:
|
||||
name: virtualbmc
|
||||
state: present
|
||||
break_system_packages: true
|
||||
|
||||
- name: Ensure vbmcd service file exists
|
||||
ansible.builtin.copy:
|
||||
dest: /etc/systemd/system/vbmcd.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0644"
|
||||
content: |
|
||||
[Unit]
|
||||
Description=Virtual BMC daemon
|
||||
After=network.target libvirtd.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/local/bin/vbmcd --foreground
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
||||
- name: Enable and start vbmcd service
|
||||
ansible.builtin.systemd:
|
||||
name: vbmcd
|
||||
daemon_reload: true
|
||||
enabled: true
|
||||
state: started
|
||||
|
||||
- name: Wait for vbmcd to be ready
|
||||
ansible.builtin.pause:
|
||||
seconds: 3
|
||||
|
||||
- name: Check if VMs already exist
|
||||
ansible.builtin.command: virsh dominfo {{ item.name }}
|
||||
loop: "{{ vms }}"
|
||||
register: vm_exists
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: Create VMs with virt-install
|
||||
ansible.builtin.command: >
|
||||
virt-install
|
||||
--name "{{ item.item.name }}"
|
||||
--vcpus "{{ vm_vcpus }}"
|
||||
--ram "{{ vm_ram }}"
|
||||
--os-variant "debian12"
|
||||
--connect "qemu:///system"
|
||||
--disk "path={{ disk_path }}/{{ item.item.name }}-disk.img,bus=virtio,size={{ vm_disk_size }},sparse=yes"
|
||||
--disk "device=cdrom,bus=sata"
|
||||
--network "bridge:{{ bridge_name }},mac={{ item.item.mac }}"
|
||||
--console "pty,target.type=virtio"
|
||||
--serial "pty"
|
||||
--graphics "vnc,listen=0.0.0.0"
|
||||
--import
|
||||
--noautoconsole
|
||||
--noreboot
|
||||
--boot "uefi,firmware.feature0.name=enrolled-keys,firmware.feature0.enabled=no,firmware.feature1.name=secure-boot,firmware.feature1.enabled=yes,bootmenu.enable=on,network,hd"
|
||||
loop: "{{ vm_exists.results }}"
|
||||
when: item.rc != 0
|
||||
|
||||
- name: Check existing VBMC entries
|
||||
ansible.builtin.command: vbmc list
|
||||
register: vbmc_list
|
||||
changed_when: false
|
||||
|
||||
- name: Add VMs to VirtualBMC
|
||||
ansible.builtin.command: >
|
||||
vbmc add {{ item.name }}
|
||||
--port {{ item.vbmc_port }}
|
||||
--username {{ vbmc_user }}
|
||||
--password {{ vbmc_password }}
|
||||
--address 0.0.0.0
|
||||
loop: "{{ vms }}"
|
||||
when: item.name not in vbmc_list.stdout
|
||||
|
||||
- name: Start VBMC for each VM
|
||||
ansible.builtin.command: vbmc start {{ item.name }}
|
||||
loop: "{{ vms }}"
|
||||
register: vbmc_start
|
||||
changed_when: "'started' in vbmc_start.stdout or vbmc_start.rc == 0"
|
||||
failed_when: false
|
||||
|
||||
- name: Get VBMC status
|
||||
ansible.builtin.command: vbmc list
|
||||
register: vbmc_status
|
||||
changed_when: false
|
||||
|
||||
- name: Display VBMC status
|
||||
ansible.builtin.debug:
|
||||
var: vbmc_status.stdout_lines
|
||||
|
||||
- name: Get VM list
|
||||
ansible.builtin.command: virsh list --all
|
||||
register: vm_list
|
||||
changed_when: false
|
||||
|
||||
- name: Display VM list
|
||||
ansible.builtin.debug:
|
||||
var: vm_list.stdout_lines
|
||||
|
||||
- name: Display summary
|
||||
ansible.builtin.debug:
|
||||
msg: |
|
||||
Virtual Baremetal VMs created!
|
||||
|
||||
| VM | MAC Address | VBMC Port | VBMC Address |
|
||||
|-----|-------------------|-----------|------------------|
|
||||
| vm1 | 52:54:00:12:34:01 | 6231 | 172.16.81.254 |
|
||||
| vm2 | 52:54:00:12:34:02 | 6232 | 172.16.81.254 |
|
||||
| vm3 | 52:54:00:12:34:03 | 6233 | 172.16.81.254 |
|
||||
|
||||
Test IPMI with:
|
||||
ipmitool -I lanplus -U admin -P password -H 172.16.81.254 -p 6231 power status
|
||||
|
||||
Start a VM:
|
||||
ipmitool -I lanplus -U admin -P password -H 172.16.81.254 -p 6231 power on
|
||||
|
||||
Set PXE boot:
|
||||
ipmitool -I lanplus -U admin -P password -H 172.16.81.254 -p 6231 chassis bootdev pxe
|
||||
Reference in New Issue
Block a user