Refactor VM definition playbook and template to a separate role
authornicoo <nicoo@realraum.at>
Tue, 29 Jan 2019 13:16:32 +0000 (14:16 +0100)
committernicoo <nicoo@realraum.at>
Tue, 29 Jan 2019 13:16:32 +0000 (14:16 +0100)
ansible/roles/vm/define/defaults/main.yml [new file with mode: 0644]
ansible/roles/vm/define/tasks/main.yml [new file with mode: 0644]
ansible/roles/vm/define/templates/libvirt-domain.xml.j2 [new file with mode: 0644]
ansible/roles/vm/install/tasks/main.yml
ansible/roles/vm/install/templates/libvirt-domain.xml.j2 [deleted file]
ansible/vm-update.yml

diff --git a/ansible/roles/vm/define/defaults/main.yml b/ansible/roles/vm/define/defaults/main.yml
new file mode 100644 (file)
index 0000000..302256a
--- /dev/null
@@ -0,0 +1,4 @@
+vm_define_autostart: "{{ not vm_define_installer and hostvars[hostname].install_cooked.autostart | default(False) }}"
+vm_define_start: yes
+
+vm_define_installer: no
diff --git a/ansible/roles/vm/define/tasks/main.yml b/ansible/roles/vm/define/tasks/main.yml
new file mode 100644 (file)
index 0000000..5667658
--- /dev/null
@@ -0,0 +1,51 @@
+---
+- 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
diff --git a/ansible/roles/vm/define/templates/libvirt-domain.xml.j2 b/ansible/roles/vm/define/templates/libvirt-domain.xml.j2
new file mode 100644 (file)
index 0000000..152ef51
--- /dev/null
@@ -0,0 +1,76 @@
+<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>
index 5043fcc..e669fa3 100644 (file)
@@ -6,30 +6,6 @@
     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
diff --git a/ansible/roles/vm/install/templates/libvirt-domain.xml.j2 b/ansible/roles/vm/install/templates/libvirt-domain.xml.j2
deleted file mode 100644 (file)
index ff2ee60..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-<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>
index 871b3c7..6c5eab0 100644 (file)
 
 - 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 }}"