MNAIO: Enable saving and re-using file-based backing images

Being able to save the images and re-use them on other hosts
is extremely useful to cut down deployment time. This patch
allows an MNAIO setup to be setup using a file-based backing
store, then have those saved and re-used on the same host or
on other hosts.

Change-Id: I491d04fb94352e37312891a9b9bd58093fdd00cf
This commit is contained in:
Jesse Pretorius 2018-06-26 10:22:36 +01:00
parent bc2ced27c2
commit 329aa472f2
3 changed files with 93 additions and 5 deletions

View File

@ -258,3 +258,22 @@ backing store) for the VM's, then set the following option before executing
export MNAIO_ANSIBLE_PARAMETERS="-e default_vm_disk_mode=file"
./build.sh
If you wish to save the current file-based images in order to implement a
thin-provisioned set of VM's which can be saved and re-used, then use the
``save-vms.yml`` playbook. This will stop the VM's and save the files to
``/var/lib/libvirt/images/*-base.img``. Re-executing the ``deploy-vms.yml``
playbook afterwards will rebuild the VMs from those images.
.. code-block:: bash
ansible-playbook -i playbooks/inventory playbooks/save-vms.yml
ansible-playbook -i playbooks/inventory -e default_vm_disk_mode=file playbooks/deploy-vms.yml
To disable this default functionality when re-running ``build.sh`` set the
build not to use the snapshots as follows.
.. code-block:: bash
export MNAIO_ANSIBLE_PARAMETERS="-e default_vm_disk_mode=file -e vm_use_snapshot=no"
./build.sh

View File

@ -67,13 +67,34 @@
- default_vm_disk_mode | default('lvm') == "lvm"
with_items: "{{ groups['pxe_servers'] }}"
- name: Create VM Disk Image
command: |
qemu-img create -f qcow2 /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img {{ default_vm_storage }}m
- name: Setup file-based disk images
when:
- hostvars[item]['server_vm'] | default(false) | bool
- default_vm_disk_mode | default('lvm') == "file"
with_items: "{{ groups['pxe_servers'] }}"
block:
- name: Find existing base image files
find:
paths: /var/lib/libvirt/images
patterns: '*-base.img'
register: _base_images
- name: Set vm_use_snapshot if it's not defined
set_fact:
vm_use_snapshot: "{{ _base_images['matched'] > 0 }}"
when:
- vm_use_snapshot is not defined
- name: Create VM Disk Image
command: >-
qemu-img create
-f qcow2
{% if vm_use_snapshot | bool %}
-b /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
{% endif %}
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
{{ default_vm_storage }}m
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Create the VM template
template:

View File

@ -0,0 +1,48 @@
---
# Copyright 2018, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in witing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Save VM disk images for re-use
hosts: vm_hosts
gather_facts: "{{ gather_facts | default(true) }}"
environment: "{{ deployment_environment_variables | default({}) }}"
tags:
- save-vms
tasks:
- name: Gather variables for each operating system
include_vars: "{{ item }}"
with_first_found:
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}-{{ ansible_distribution_major_version | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_distribution | lower }}.yml"
- "{{ playbook_dir }}/vars/{{ ansible_os_family | lower }}.yml"
tags:
- always
- name: Stop running VMs
command: "virsh destroy {{ hostvars[item]['server_hostname'] }}"
failed_when: false
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"
- name: Save VM Disk Image
command: >-
mv
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
when:
- hostvars[item]['server_vm'] | default(false) | bool
with_items: "{{ groups['pxe_servers'] }}"