From e3d0be5df3a8a43b19da0bb814c8174048cfc79f Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 6 Jan 2022 19:22:14 +0100 Subject: split up vm/define into remove and create --- roles/vm/guest/create/defaults/main.yml | 5 ++ roles/vm/guest/create/tasks/main.yml | 28 +++++++ .../guest/create/templates/libvirt-domain.xml.j2 | 96 ++++++++++++++++++++++ roles/vm/guest/define/defaults/main.yml | 5 -- roles/vm/guest/define/tasks/main.yml | 55 ------------- .../guest/define/templates/libvirt-domain.xml.j2 | 96 ---------------------- roles/vm/guest/deploy/tasks/main.yml | 11 ++- roles/vm/guest/install/tasks/main.yml | 26 ++++-- roles/vm/guest/remove/tasks/main.yml | 27 ++++++ 9 files changed, 180 insertions(+), 169 deletions(-) create mode 100644 roles/vm/guest/create/defaults/main.yml create mode 100644 roles/vm/guest/create/tasks/main.yml create mode 100644 roles/vm/guest/create/templates/libvirt-domain.xml.j2 delete mode 100644 roles/vm/guest/define/defaults/main.yml delete mode 100644 roles/vm/guest/define/tasks/main.yml delete mode 100644 roles/vm/guest/define/templates/libvirt-domain.xml.j2 create mode 100644 roles/vm/guest/remove/tasks/main.yml diff --git a/roles/vm/guest/create/defaults/main.yml b/roles/vm/guest/create/defaults/main.yml new file mode 100644 index 00000000..8609c377 --- /dev/null +++ b/roles/vm/guest/create/defaults/main.yml @@ -0,0 +1,5 @@ +--- +vm_create_autostart: "{{ not vm_create_installer and install.vm.autostart | default(False) }}" +vm_create_start: yes + +vm_create_installer: no diff --git a/roles/vm/guest/create/tasks/main.yml b/roles/vm/guest/create/tasks/main.yml new file mode 100644 index 00000000..d9215b40 --- /dev/null +++ b/roles/vm/guest/create/tasks/main.yml @@ -0,0 +1,28 @@ +--- +- name: define vm + delegate_to: "{{ vm_host.name }}" + virt: + command: define + xml: "{{ lookup('template', 'libvirt-domain.xml.j2') }}" + +- name: start new vm + when: vm_create_start | bool + delegate_to: "{{ vm_host.name }}" + block: + - name: start vm + virt: + name: "{{ inventory_hostname }}" + state: running + + - name: wait for VM to start + wait_for_virt: + name: "{{ inventory_hostname }}" + states: running + timeout: 10 + +- name: mark vm as autostarted + delegate_to: "{{ vm_host.name }}" + virt: + name: "{{ inventory_hostname }}" + autostart: "{{ vm_create_autostart }}" + command: info ## virt module needs either command or state diff --git a/roles/vm/guest/create/templates/libvirt-domain.xml.j2 b/roles/vm/guest/create/templates/libvirt-domain.xml.j2 new file mode 100644 index 00000000..96b12a74 --- /dev/null +++ b/roles/vm/guest/create/templates/libvirt-domain.xml.j2 @@ -0,0 +1,96 @@ + + {{ inventory_hostname }} + {{ ((install.vm.memory | human_to_bytes) / 1024) | int }} + {{ ((install.vm.memory | human_to_bytes) / 1024) | int }} + {{ install.vm.numcpus }} + + hvm +{% if vm_create_installer %} +{% if install_distro == 'debian' or install_distro == 'ubuntu' %} + {{ installer_tmpdir }}/linux + {{ installer_tmpdir }}/initrd.gz + console=ttyS0,115200n8 auto + +{% elif install_distro == 'openbsd' %} + +{% endif %} +{% else %} + +{% endif %} + + + + + + + + destroy +{% if vm_create_installer %} + destroy + destroy +{% else %} + restart + restart +{% endif %} + + /usr/bin/kvm + + + + + /dev/random + + +{% if vm_create_installer and install_distro == 'openbsd' %} + + + + + + + +{% endif %} +{% if install.disks %} +{% if 'scsi' in install.disks %} + +{% endif %} +{% for bus in ['virtio', 'scsi'] %} +{% for device, src in (install.disks[bus] | default({})).items() %} + + +{% if src.type == 'lvm' %} + +{% elif src.type == 'zfs' %} + +{% elif src.type == 'blockdev' %} + +{% elif src.type == 'image' %} + +{% endif %} + + +{% endfor %} +{% endfor %} + +{% endif %} +{% if install.interfaces %} +{% for if in install.interfaces %} + +{% if 'mac' in if %} + +{% endif %} + + +
+ +{% endfor %} + +{% endif %} + + + + + + + + diff --git a/roles/vm/guest/define/defaults/main.yml b/roles/vm/guest/define/defaults/main.yml deleted file mode 100644 index f0c74831..00000000 --- a/roles/vm/guest/define/defaults/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -vm_define_autostart: "{{ not vm_define_installer and install.vm.autostart | default(False) }}" -vm_define_start: yes - -vm_define_installer: no diff --git a/roles/vm/guest/define/tasks/main.yml b/roles/vm/guest/define/tasks/main.yml deleted file mode 100644 index 769afdac..00000000 --- a/roles/vm/guest/define/tasks/main.yml +++ /dev/null @@ -1,55 +0,0 @@ ---- -- name: check if vm already exists - delegate_to: "{{ vm_host.name }}" - virt: - name: "{{ inventory_hostname }}" - command: info - register: vmhost_info - -- name: remove old vm - when: inventory_hostname in vmhost_info - delegate_to: "{{ vm_host.name }}" - block: - - name: destroy exisiting vm - virt: - name: "{{ inventory_hostname }}" - state: destroyed - - - name: wait for vm to be destroyed - wait_for_virt: - name: "{{ inventory_hostname }}" - states: shutdown,crashed - timeout: 5 - - - name: undefining exisiting vm - virt: - name: "{{ inventory_hostname }}" - command: undefine - -- name: define vm - delegate_to: "{{ vm_host.name }}" - virt: - command: define - xml: "{{ lookup('template', 'libvirt-domain.xml.j2') }}" - -- name: start new vm - when: vm_define_start | bool - delegate_to: "{{ vm_host.name }}" - block: - - name: start vm - virt: - name: "{{ inventory_hostname }}" - state: running - - - name: wait for VM to start - wait_for_virt: - name: "{{ inventory_hostname }}" - states: running - timeout: 10 - -- name: mark vm as autostarted - delegate_to: "{{ vm_host.name }}" - virt: - name: "{{ inventory_hostname }}" - autostart: "{{ vm_define_autostart }}" - command: info ## virt module needs either command or state diff --git a/roles/vm/guest/define/templates/libvirt-domain.xml.j2 b/roles/vm/guest/define/templates/libvirt-domain.xml.j2 deleted file mode 100644 index 11b1be6e..00000000 --- a/roles/vm/guest/define/templates/libvirt-domain.xml.j2 +++ /dev/null @@ -1,96 +0,0 @@ - - {{ inventory_hostname }} - {{ ((install.vm.memory | human_to_bytes) / 1024) | int }} - {{ ((install.vm.memory | human_to_bytes) / 1024) | int }} - {{ install.vm.numcpus }} - - hvm -{% if vm_define_installer %} -{% if install_distro == 'debian' or install_distro == 'ubuntu' %} - {{ installer_tmpdir }}/linux - {{ installer_tmpdir }}/initrd.gz - console=ttyS0,115200n8 auto - -{% elif install_distro == 'openbsd' %} - -{% endif %} -{% else %} - -{% endif %} - - - - - - - - destroy -{% if vm_define_installer %} - destroy - destroy -{% else %} - restart - restart -{% endif %} - - /usr/bin/kvm - - - - - /dev/random - - -{% if vm_define_installer and install_distro == 'openbsd' %} - - - - - - - -{% endif %} -{% if install.disks %} -{% if 'scsi' in install.disks %} - -{% endif %} -{% for bus in ['virtio', 'scsi'] %} -{% for device, src in (install.disks[bus] | default({})).items() %} - - -{% if src.type == 'lvm' %} - -{% elif src.type == 'zfs' %} - -{% elif src.type == 'blockdev' %} - -{% elif src.type == 'image' %} - -{% endif %} - - -{% endfor %} -{% endfor %} - -{% endif %} -{% if install.interfaces %} -{% for if in install.interfaces %} - -{% if 'mac' in if %} - -{% endif %} - - -
- -{% endfor %} - -{% endif %} - - - - - - - - diff --git a/roles/vm/guest/deploy/tasks/main.yml b/roles/vm/guest/deploy/tasks/main.yml index f203fdff..aa27b59d 100644 --- a/roles/vm/guest/deploy/tasks/main.yml +++ b/roles/vm/guest/deploy/tasks/main.yml @@ -12,6 +12,10 @@ path: "{{ vm_deploy_primary_disk.path | dirname }}" state: directory +- name: remove vm if it already exists + import_role: + name: vm/guest/remove + ## TODO: actually call this directly and make file replacement atomic!! ## Probably by writing and action plugin based on this: https://github.com/socratesx/Ansible-Decompress - name: copy disk image @@ -23,9 +27,8 @@ When done press ENTER to continue or CTRL-C then A to abort. -- name: define vm +- name: create vm vars: - vm_define_installer: no - delegate_to: "{{ vm_host.name }}" + vm_create_installer: no import_role: - name: vm/guest/define + name: vm/guest/create diff --git a/roles/vm/guest/install/tasks/main.yml b/roles/vm/guest/install/tasks/main.yml index d4a31929..ab60d222 100644 --- a/roles/vm/guest/install/tasks/main.yml +++ b/roles/vm/guest/install/tasks/main.yml @@ -31,7 +31,8 @@ extra_zfs_properties: "{{ item.value.properties | default({}) | combine({'volsize': item.value.size}) | dehumanize_zfs_properties }}" -- delegate_to: "{{ vm_host.name }}" +- name: run installer + delegate_to: "{{ vm_host.name }}" block: - name: create a temporary workdir tempfile: @@ -41,10 +42,10 @@ register: tmpdir - when: install_distro in ['debian', 'ubuntu'] - import_tasks: installer-debian.yml + include_tasks: installer-debian.yml - when: install_distro in ['openbsd'] - import_tasks: installer-openbsd.yml + include_tasks: installer-openbsd.yml - name: Make installer workdir readable by qemu acl: @@ -54,12 +55,16 @@ etype: user permissions: rx - - name: define installer vm + - name: remove vm if it already exists + import_role: + name: vm/guest/remove + + - name: define temporary installer vm vars: - vm_define_installer: yes + vm_create_installer: yes installer_tmpdir: "{{ tmpdir.path }}" import_role: - name: vm/guest/define + name: vm/guest/create - debug: msg: "you can check on the status of the installer running this command 'virsh console {{ inventory_hostname }}' on host {{ vm_host.name }}." @@ -87,9 +92,12 @@ path: "{{ tmpdir.path }}" state: absent +- name: remove temporary installer vm + import_role: + name: vm/guest/remove + - name: define vm vars: - vm_define_installer: no - delegate_to: "{{ vm_host.name }}" + vm_create_installer: no import_role: - name: vm/guest/define + name: vm/guest/create diff --git a/roles/vm/guest/remove/tasks/main.yml b/roles/vm/guest/remove/tasks/main.yml new file mode 100644 index 00000000..3a677f92 --- /dev/null +++ b/roles/vm/guest/remove/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: check if vm already exists + delegate_to: "{{ vm_host.name }}" + virt: + name: "{{ inventory_hostname }}" + command: info + register: vmhost_info + +- name: remove old vm + when: inventory_hostname in vmhost_info + delegate_to: "{{ vm_host.name }}" + block: + - name: destroy exisiting vm + virt: + name: "{{ inventory_hostname }}" + state: destroyed + + - name: wait for vm to be destroyed + wait_for_virt: + name: "{{ inventory_hostname }}" + states: shutdown,crashed + timeout: 5 + + - name: undefining exisiting vm + virt: + name: "{{ inventory_hostname }}" + command: undefine -- cgit v1.2.3