--- - 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