--- /dev/null
+vm_define_autostart: "{{ not vm_define_installer and hostvars[hostname].install_cooked.autostart | default(False) }}"
+vm_define_start: yes
+
+vm_define_installer: no
--- /dev/null
+---
+- name: check if vm already exists
+ virt:
+ name: "{{ hostname }}"
+ command: info
+ register: vmhost_info
+
+- when: hostname in vmhost_info
+ block:
+ - name: destroy exisiting vm
+ virt:
+ name: "{{ hostname }}"
+ state: destroyed
+
+ - name: wait for vm to be destroyed
+ wait_for_virt:
+ name: "{{ hostname }}"
+ states: shutdown,crashed
+ timeout: 5
+
+ - name: undefining exisiting vm
+ virt:
+ name: "{{ hostname }}"
+ command: undefine
+
+
+- name: redefine vm
+ virt:
+ name: "{{ hostname }}"
+ command: define
+ xml: "{{ lookup('template', 'libvirt-domain.xml.j2') }}"
+
+- when: vm_define_start
+ block:
+ - name: start vm
+ virt:
+ name: "{{ hostname }}"
+ state: running
+
+ - name: wait for VM to start
+ wait_for_virt:
+ name: "{{ hostname }}"
+ states: running
+ timeout: 10
+
+- name: mark vm as autostarted
+ when: vm_define_autostart
+ virt:
+ name: "{{ hostname }}"
+ autostart: yes
+ command: info ## virt module needs either command or state
--- /dev/null
+<domain type='kvm'>
+ <name>{{ hostname }}</name>
+ <memory>{{ hostvars[hostname].install_cooked.mem * 1024 }}</memory>
+ <currentMemory>{{ hostvars[hostname].install_cooked.mem * 1024 }}</currentMemory>
+ <vcpu>{{ hostvars[hostname].install_cooked.numcpu }}</vcpu>
+ <os>
+ <type arch='x86_64' machine='pc-0.12'>hvm</type>
+{% if vm_define_installer %}
+ <kernel>{{ debian_installer_path }}/{{ install_distro }}-{{ install_codename }}/{{ hostvars[hostname].install_cooked.arch | default('amd64') }}/linux</kernel>
+ <initrd>{{ preseed_tmpdir }}/initrd.preseed.gz</initrd>
+ <cmdline>console=ttyS0,115200n8</cmdline>
+{% endif %}
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <acpi/>
+ <apic/>
+ <pae/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+{% if vm_define_installer %}
+ <on_reboot>destroy</on_reboot>
+ <on_crash>destroy</on_crash>
+{% else %}
+ <on_reboot>restart</on_reboot>
+ <on_crash>restart</on_crash>
+{% endif %}
+ <devices>
+ <emulator>/usr/bin/kvm</emulator>
+ <!-- Provide a virtualized RNG to the guest -->
+ <rng model='virtio'>
+ <!-- Allow consuming up to 10kb/s, measured over 2s -->
+ <rate period="2000" bytes="20480"/>
+ <backend model='random'>/dev/urandom</backend>
+ </rng>
+
+{% if 'virtio' in hostvars[hostname].install_cooked.disks %}
+{% for device, lv in hostvars[hostname].install_cooked.disks.virtio.items() %}
+ <disk type='block' device='disk'>
+ <driver name='qemu' type='raw' cache='none' discard='unmap'/>
+ <source dev='/dev/mapper/{{ lv.vg | replace('-', '--') }}-{{ lv.lv | replace('-', '--') }}'/>
+ <target dev='{{ device }}' bus='virtio'/>
+ </disk>
+{% endfor %}
+{% endif %}
+
+{% if 'scsi' in hostvars[hostname].install_cooked.disks %}
+ <controller type='scsi' index='0' model='virtio-scsi'/>
+{% for device, lv in hostvars[hostname].install_cooked.disks.scsi.items() %}
+ <disk type='block' device='disk'>
+ <driver name='qemu' type='raw' cache='none' discard='unmap'/>
+ <source dev='/dev/mapper/{{ lv.vg | replace('-', '--') }}-{{ lv.lv | replace('-', '--') }}'/>
+ <target dev='{{ device }}' bus='scsi'/>
+ </disk>
+{% endfor %}
+{% endif %}
+
+{% if hostvars[hostname].install_cooked.interfaces %}
+{% for if in hostvars[hostname].install_cooked.interfaces %}
+ <interface type='bridge'>
+ <source bridge='{{ if.bridge }}'/>
+ <model type='virtio'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x0{{ loop.index }}' function='0x0'/>
+ </interface>
+{% endfor %}
+{% endif %}
+
+ <serial type='pty'>
+ <target port='0'/>
+ </serial>
+ <console type='pty'>
+ <target type='serial' port='0'/>
+ </console>
+ </devices>
+</domain>
lv: "{{ item.value.lv }}"
size: "{{ item.value.size }}"
-- name: check if vm already exists
- virt:
- name: "{{ hostname }}"
- command: info
- register: vmhost_info
-
-- block:
- - name: destroy exisiting vm
- virt:
- name: "{{ hostname }}"
- state: destroyed
-
- - name: wait for vm to be destroyed
- wait_for_virt:
- name: "{{ hostname }}"
- states: shutdown,crashed
- timeout: 5
-
- - name: undefining exisiting vm
- virt:
- name: "{{ hostname }}"
- command: undefine
-
- when: hostname in vmhost_info
- block:
- name: create a temporary workdir
etype: user
permissions: rx
- - name: define new installer vm
- virt:
- name: "{{ hostname }}"
- command: define
- xml: "{{ lookup('template', 'libvirt-domain.xml.j2') }}"
+ - import_role:
+ name: vm/define
vars:
- run_installer: yes
+ vm_define_installer: yes
preseed_tmpdir: "{{ tmpdir.path }}"
- - name: start vm
- virt:
- name: "{{ hostname }}"
- state: running
-
- - name: wait for installer to start
- wait_for_virt:
- name: "{{ hostname }}"
- states: running
- timeout: 10
-
- debug:
msg: "you can check on the status of the installer running this command 'virsh console {{ hostname }}' on host {{ inventory_hostname }}."
register: installer_result
failed_when: installer_result.failed or installer_result.state == "crashed"
- - name: undefining installer vm
- virt:
- name: "{{ hostname }}"
- command: undefine
-
always:
- name: cleanup temporary workdir
file:
path: "{{ tmpdir.path }}"
state: absent
-- name: define new production vm
- virt:
- name: "{{ hostname }}"
- command: define
- xml: "{{ lookup('template', 'libvirt-domain.xml.j2') }}"
+- import_role:
+ name: vm/define
vars:
- run_installer: no
-
-- name: start vm
- virt:
- name: "{{ hostname }}"
- state: running
-
-- name: mark vm as autostarted
- virt:
- name: "{{ hostname }}"
- autostart: "{{ hostvars[hostname].install_cooked.autostart }}"
- command: info ## virt module needs either command or state
- when: hostvars[hostname].install_cooked.autostart is defined
+ vm_define_installer: no
+++ /dev/null
-<domain type='kvm'>
- <name>{{ hostname }}</name>
- <memory>{{ hostvars[hostname].install_cooked.mem * 1024 }}</memory>
- <currentMemory>{{ hostvars[hostname].install_cooked.mem * 1024 }}</currentMemory>
- <vcpu>{{ hostvars[hostname].install_cooked.numcpu }}</vcpu>
- <os>
- <type arch='x86_64' machine='pc-0.12'>hvm</type>
-{% if run_installer | default(False) %}
- <kernel>{{ debian_installer_path }}/{{ install_distro }}-{{ install_codename }}/{{ hostvars[hostname].install_cooked.arch | default('amd64') }}/linux</kernel>
- <initrd>{{ preseed_tmpdir }}/initrd.preseed.gz</initrd>
- <cmdline>console=ttyS0,115200n8</cmdline>
-{% endif %}
- <boot dev='hd'/>
- </os>
- <features>
- <acpi/>
- <apic/>
- <pae/>
- </features>
- <clock offset='utc'/>
- <on_poweroff>destroy</on_poweroff>
-{% if run_installer | default(False) %}
- <on_reboot>destroy</on_reboot>
- <on_crash>destroy</on_crash>
-{% else %}
- <on_reboot>restart</on_reboot>
- <on_crash>restart</on_crash>
-{% endif %}
- <devices>
- <emulator>/usr/bin/kvm</emulator>
- <!-- Provide a virtualized RNG to the guest -->
- <rng model='virtio'>
- <!-- Allow consuming up to 10kb/s, measured over 2s -->
- <rate period="2000" bytes="20480"/>
- <backend model='random'>/dev/urandom</backend>
- </rng>
-
-{% if 'virtio' in hostvars[hostname].install_cooked.disks %}
-{% for device, lv in hostvars[hostname].install_cooked.disks.virtio.items() %}
- <disk type='block' device='disk'>
- <driver name='qemu' type='raw' cache='none' discard='unmap'/>
- <source dev='/dev/mapper/{{ lv.vg | replace('-', '--') }}-{{ lv.lv | replace('-', '--') }}'/>
- <target dev='{{ device }}' bus='virtio'/>
- </disk>
-{% endfor %}
-{% endif %}
-
-{% if 'scsi' in hostvars[hostname].install_cooked.disks %}
- <controller type='scsi' index='0' model='virtio-scsi'/>
-{% for device, lv in hostvars[hostname].install_cooked.disks.scsi.items() %}
- <disk type='block' device='disk'>
- <driver name='qemu' type='raw' cache='none' discard='unmap'/>
- <source dev='/dev/mapper/{{ lv.vg | replace('-', '--') }}-{{ lv.lv | replace('-', '--') }}'/>
- <target dev='{{ device }}' bus='scsi'/>
- </disk>
-{% endfor %}
-{% endif %}
-
-{% if hostvars[hostname].install_cooked.interfaces %}
-{% for if in hostvars[hostname].install_cooked.interfaces %}
- <interface type='bridge'>
- <source bridge='{{ if.bridge }}'/>
- <model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x01' slot='0x0{{ loop.index }}' function='0x0'/>
- </interface>
-{% endfor %}
-{% endif %}
-
- <serial type='pty'>
- <target port='0'/>
- </serial>
- <console type='pty'>
- <target type='serial' port='0'/>
- </console>
- </devices>
-</domain>
- name: Update VM definition
hosts: _vmhost_
- tasks:
+ pre_tasks:
- name: Wait for VM to shut down
wait_for_virt:
name: "{{ hostname }}"
states: shutdown
timeout: 30
-
- - name: Undefine VM
- virt:
- name: "{{ hostname }}"
- command: undefine
-
- - name: Redefine VM
- virt:
- name: "{{ hostname }}"
- command: define
- xml: "{{ lookup('template', 'roles/vm/install/templates/libvirt-domain.xml.j2') }}"
- - name: Restart VM
- virt:
- name: "{{ hostname }}"
- state: running
-
- - name: mark vm as autostarted
- when: hostvars[hostname].install_cooked.autostart is defined
- virt:
- name: "{{ hostname }}"
- autostart: "{{ hostvars[hostname].install_cooked.autostart }}"
- command: info ## virt module needs either command or state
+ roles:
+ - vm/define
- name: Apply the base vm/guest role
hosts: "{{ hostname }}"