--- - name: Verify golden image exists stat: path: "{{ golden_image_path }}" register: golden_stat failed_when: not golden_stat.stat.exists - name: Set bootstrap VM name set_fact: bootstrap_vm: "bootstrap-{{ ansible_date_time.epoch }}" - name: Bootstrap Sparrowdo block: - name: Create overlay disk command: > qemu-img create -f qcow2 -b {{ golden_image_path }} -F qcow2 /var/lib/libvirt/images/{{ bootstrap_vm }}.qcow2 become: true - name: Start bootstrap VM command: > virt-install --name {{ bootstrap_vm }} --memory {{ vm_memory }} --vcpus {{ vm_vcpus }} --disk path=/var/lib/libvirt/images/{{ bootstrap_vm }}.qcow2,format=qcow2 --import --os-variant rocky9-unknown --network network=default --noautoconsole --wait 0 become: true - name: Wait for VM IP shell: > virsh -c qemu:///system domifaddr {{ bootstrap_vm }} --source lease 2>/dev/null | awk '/ipv4/ {print $4}' | cut -d/ -f1 | head -1 become: true register: vm_ip until: vm_ip.stdout != "" and vm_ip.stdout != "0.0.0.0" retries: "{{ vm_boot_timeout }}" delay: 2 changed_when: false - name: Wait for SSH wait_for: host: "{{ vm_ip.stdout }}" port: 22 timeout: "{{ ssh_port_timeout }}" - name: Run Sparrowdo bootstrap command: argv: - "~/.raku/bin/sparrowdo" - "--host={{ vm_ip.stdout }}" - "--ssh_user={{ ssh_user }}" - "--ssh_private_key={{ ssh_private_key_path }}" - "--bootstrap" timeout: "{{ bootstrap_timeout }}" register: bootstrap_result retries: 3 delay: 5 until: bootstrap_result.rc == 0 - name: Shutdown VM command: > ssh -i {{ ssh_private_key_path }} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {{ ssh_user }}@{{ vm_ip.stdout }} 'sudo shutdown -h now' ignore_errors: true - name: Wait for shutdown shell: virsh -c qemu:///system list --name | grep -q "{{ bootstrap_vm }}" become: true register: vm_running until: vm_running.rc != 0 retries: 30 delay: 2 failed_when: false always: - name: Force stop VM if running command: "virsh -c qemu:///system destroy {{ bootstrap_vm }}" become: true ignore_errors: true changed_when: false - name: Undefine VM command: "virsh -c qemu:///system undefine {{ bootstrap_vm }}" become: true ignore_errors: true changed_when: false - name: Remove overlay disk file: path: "/var/lib/libvirt/images/{{ bootstrap_vm }}.qcow2" state: absent become: true ignore_errors: true